• [Java] ch5 μžλ°” 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ° OOP (클래슀, λ©”μ„œλ“œ, μžλ°” λ³€μˆ˜)

    2023. 9. 5.

    by. @leeeun

    객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(Object-Oriented Programming, OOP)

    • μ ˆμ°¨μ§€ν–₯ ↔ 객체지ν–₯
    • 객체(object)λ₯Ό μƒμ„±ν•˜κ³  κ°μ²΄λ“€κ°„μ˜ μƒν˜Έμž‘μš©μ„ 톡해 λ‘œμ§μ„ κ΅¬μ„±ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ°
    • 클래슀λ₯Ό μ΄μš©ν•΄ ν•¨μˆ˜ 및 λ³€μˆ˜λ₯Ό ν•˜λ‚˜λ‘œ λ¬Άμ–΄ 객체λ₯Ό 생성 → ν”„λ‘œκ·Έλž¨μ˜ μˆ˜μ •, μœ μ§€λ³΄μˆ˜μ— 유리, μ½”λ“œμ˜ μž¬μ‚¬μš©
    • 좔상화(객체의 곡톡적인 속성 μΆ”μΆœ), 상속(기쑴의 클래슀 ν™œμš©ν•˜μ—¬ μƒˆλ‘œμš΄ 클래슀 μž‘μ„±), λ‹€ν˜•μ„±(객체의 속성이 μ—¬λŸ¬κ°€μ§€ ν˜•νƒœ), μΊ‘μŠν™”(ν΄λž˜μŠ€μ— μ •μ˜λœ 속성과 κΈ°λŠ₯ 보호, ν•„μš”ν•œ λΆ€λΆ„λ§Œ λ…ΈμΆœ)
    • Java의 ν”„λ‘œκ·Έλž˜λ° 방식이 이에 ν•΄λ‹Ή

    01 클래슀

    class Animal {
    	 String name;
    	 public void setName(String name){
    			this.name=name;
    }
    
    public class Sample {
        public static void main(String[] args) {
            Animal cat = new Animal(); //클래슀 Animal의 instance(객체)인 cat 생성
        }
    }
    
    • 클래슀= 데이터(λ³€μˆ˜)+ ν•¨μˆ˜
    • .java 파일λͺ…κ³Ό 같은 경우 public classλ₯Ό λΆ™μ—¬μ•Ό 함
    • new → 객체λ₯Ό μƒμ„±ν•˜λŠ” ν‚€μ›Œλ“œ. μƒˆλ‘œμš΄ 객체λ₯Ό μœ„ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  κ·Έ λ©”λͺ¨λ¦¬μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό λ°˜ν™˜ν•˜λŠ” μ—°μ‚°μž
    • μƒμ„±μž → μΈμŠ€ν„΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•  λ•Œ μ‚¬μš©. ν΄λž˜μŠ€μ™€ 이름이 κ°™μ•„μ•Ό 함. λ”°λ‘œ μ„€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ κΈ°λ³Έ μƒμ„±μžκ°€ 생성(λ§€κ°œλ³€μˆ˜x)

     

    클래슀의 μ„ μ–Έ → ν•„λ“œ, μƒμ„±μž, λ©”μ„œλ“œ μ •μ˜

    • ν•„λ“œ: μΈμŠ€ν„΄μŠ€μ˜ 속성을 λ‚˜νƒ€λ‚΄κ±°λ‚˜ 클래슀의 속성을 λ‚˜νƒ€λƒ„
    • μƒμ„±μž: μƒˆλ‘œμš΄ 객체λ₯Ό 생성
    • λ©”μ„œλ“œ: ν•¨μˆ˜ κ΅¬ν˜„

     

    객체 λ³€μˆ˜λž€?

    • 객체 = 속성(λ³€μˆ˜) + κΈ°λŠ₯(λ©”μ„œλ“œ)
    • 객체 λ³€μˆ˜(instance variable) = 속성 = 멀버 λ³€μˆ˜ = μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ : 클래슀 내에 μ„ μ–Έλœ λ³€μˆ˜
    • 객체이름.κ°μ²΄λ³€μˆ˜μ΄λ¦„ ν˜•νƒœλ‘œ μ ‘κ·Ό
    • 객체 κ°„ κ³΅μœ λ˜μ§€ μ•ŠλŠ”λ‹€ (각 κ°μ²΄μ—μ„œ λ…λ¦½μ μœΌλ‘œ μœ μ§€)

     

    λ©”μ„œλ“œλž€?

    class Animal {
        String name;
    
        public void setName(String name) {
            this.name = name;
        }
    }
    
    • 클래슀 내에 κ΅¬ν˜„λœ ν•¨μˆ˜ (μœ„ μ˜ˆμ‹œμ—μ„œμ˜ setName)
    • 객체.λ©”μ„œλ“œ ν˜•νƒœλ‘œ 호좜

     

    this ν‚€μ›Œλ“œμ™€ ν™œμš©

    • μΈμŠ€ν„΄μŠ€ 자기 μžμ‹ μ„ κ°€λ¦¬ν‚€λŠ” ν‚€μ›Œλ“œ. 클래슀λ₯Ό 기반으둜 μƒμ„±λœ μΈμŠ€ν„΄μŠ€λ₯Ό κ°€λ¦¬ν‚€λŠ” μ°Έμ‘°
    • λ©”μ†Œλ“œ λ‚΄μ—μ„œλ§Œ μ‚¬μš©λ˜λ©°, 객체 μžμ‹ μ„ λ©”μ†Œλ“œμ— μ „λ‹¬ν•˜κ±°λ‚˜ λ¦¬ν„΄ν•˜κΈ° μœ„ν•΄ μ‚¬μš©
    • this.λ©€λ²„λ³€μˆ˜ : 맀개 λ³€μˆ˜μ™€ 객체 μžμ‹ μ΄ 가지고 μžˆλŠ” λ³€μˆ˜μ˜ 이름이 같은 경우 이λ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ μžμ‹ μ˜ λ³€μˆ˜μ— thisλ₯Ό μ‚¬μš©
    • this(λ§€κ°œλ³€μˆ˜) : μƒμ„±μž λ‚΄μ—μ„œ λ‹€λ₯Έ μƒμ„±μžλ₯Ό 호좜

     

    sample.varTest(sample); κ³Ό 같이 λ©”μ„œλ“œ 호좜 μ‹œ 객체λ₯Ό μ „λ‹¬ν•˜λŠ” 방식과 달리

    public class Sample {
    
        int a;  // κ°μ²΄λ³€μˆ˜ a
    
        void varTest() {
            this.a++;
        }
    
        public static void main(String[] args) {
            Sample sample = new Sample();
            sample.a = 1;
            sample.varTest();
            System.out.println(sample.a);
        }
    

    객체λ₯Ό μ „λ‹¬ν•˜μ§€ μ•Šκ³ λ„ thisν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄μ„œ 객체에 μ ‘κ·Ό κ°€λŠ₯


    02 λ©”μ„œλ“œ

    • λ‹€λ₯Έ ν”„λ‘œκ·Έλž˜λ° 언어와 달리 μžλ°”λŠ” ν•¨μˆ˜κ°€ λ”°λ‘œ 쑴재x 클래슀 내에 쑴재 → λ©”μ„œλ“œ(method)
    • λ©”μ„œλ“œμ˜ μž…λ ₯κ°’μœΌλ‘œ 객체λ₯Ό 전달할 μˆ˜λ„ 있음 → λ©”μ„œλ“œ λ‚΄μ˜ κ°μ²΄λŠ” 전달받은 객체 κ·Έ 자체둜 μˆ˜ν–‰
    • λ©”μ„œλ“œμ˜ μž…λ ₯ ν•­λͺ©μ΄ μ›μ‹œ μžλ£Œν˜•, wrapper 클래슀, string인 경우 값이 μ „λ‹¬λ˜κ³  κ·Έ μ΄μ™Έμ˜ κ²½μš°λŠ” 객체가 전달

     

    기본 ꡬ쑰

    λ¦¬ν„΄μžλ£Œν˜• λ©”μ„œλ“œλͺ…(μž…λ ₯μžλ£Œν˜•1 λ§€κ°œλ³€μˆ˜1, μž…λ ₯μžλ£Œν˜•2 λ§€κ°œλ³€μˆ˜2, ...) {
        ...
    
    **return**
    
    리턴값;  // λ¦¬ν„΄μžλ£Œν˜•μ΄ void 인 κ²½μš°μ—λŠ” return 문이 ν•„μš”μ—†λ‹€.
    }
    
    • 리턴 μžλ£Œν˜• : λ©”μ„œλ“œ μˆ˜ν–‰ ν›„ λ¦¬ν„΄λ˜λŠ” κ°’μ˜ μžλ£Œν˜•

     

    λ§€κ°œλ³€μˆ˜μ™€ 인수

    public class Sample {
        int sum(int a, int b) {  // a, b λŠ” λ§€κ°œλ³€μˆ˜
            return a+b;
        }
    
        public static void main(String[] args) {
            Sample sample = new Sample();
            int c = sample.sum(3, 4);  // 3, 4λŠ” 인수
    
            System.out.println(c);
        }
    }
    
    • λ§€κ°œλ³€μˆ˜ : λ©”μ„œλ“œμ— μ „λ‹¬λœ μž…λ ₯값을 μ €μž₯ν•˜λŠ” λ³€μˆ˜
    • 인수 : λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ μ „λ‹¬ν•˜λŠ” μž…λ ₯κ°’

     

    return의 또 λ‹€λ₯Έ μ“°μž„

    public class Sample {
        void sayNick(String nick) {
            if ("바보".equals(nick)) {
                return;
            }
            System.out.println("λ‚˜μ˜ 별λͺ…은 "+nick+" μž…λ‹ˆλ‹€.");
        }
    
        public static void main(String[] args) {
            Sample sample = new Sample();
            sample.sayNick("μ•Όν˜Έ");
            sample.sayNick("바보");  // 좜λ ₯λ˜μ§€ μ•ŠλŠ”λ‹€.
        }
    }
    
    • λ©”μ„œλ“œλ₯Ό λΉ μ Έλ‚˜κ°€κ³  싢을 λ•Œ return을 λ‹¨λ…μœΌλ‘œ μ‚¬μš©
    • 리턴 μžλ£Œν˜•μ΄ void인 λ©”μ†Œλ“œλ§Œ κ°€λŠ₯

     

    μžλ°” λ³€μˆ˜

    class Variables{
        int first; // μΈμŠ€ν„΄μŠ€ λ³€μˆ˜
        static int second; // 클래슀 λ³€μˆ˜
    
        void hello(){
            int third; // 지역 λ³€μˆ˜
        }
    }
    

    λ³€μˆ˜μ˜ μ’…λ₯˜ μ„ μ–Έ μœ„μΉ˜ 생성 μ‹œκΈ°

    클래슀 λ³€μˆ˜(static λ³€μˆ˜, 곡유 λ³€μˆ˜) 클래슀 μ˜μ—­ ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— 올라갈 λ•Œ
    μΈμŠ€ν„΄μŠ€ λ³€μˆ˜ 클래슀 μ˜μ—­ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ—ˆμ„ λ•Œ
    지역 λ³€μˆ˜ 클래슀 μ˜μ—­ μ΄μ™Έμ˜ μ˜μ—­(λ©”μ„œλ“œ, μƒμ„±μž, μ΄ˆκΈ°ν™” 블둝 λ‚΄λΆ€) λ³€μˆ˜ 선언문이 μˆ˜ν–‰λ˜μ—ˆμ„ λ•Œ

     

    값에 μ˜ν•œ 호좜과 객체에 μ˜ν•œ 호좜

    class Updater {
        void update(int count) {
            count++;
        }
    }
    
    class Counter {
        int count = 0;  // κ°μ²΄λ³€μˆ˜
    }
    
    public class Sample {
        public static void main(String[] args) {
            Counter myCounter = new Counter();
            System.out.println("before update:"+myCounter.count);
            Updater myUpdater = new Updater();
            myUpdater.update(myCounter.count);
            System.out.println("after update:"+myCounter.count);
        }
    }
    
    • λ©”μ„œλ“œμ˜ μž…λ ₯ ν•­λͺ©μ΄ μ›μ‹œ μžλ£Œν˜•, wrapper 클래슀, string인 경우 값이 μ „λ‹¬λ˜κ³  κ·Έ μ΄μ™Έμ˜ κ²½μš°λŠ” 객체가 전달
    • μœ„ 예제 좜λ ₯μ‹œ update μ „κ³Ό ν›„ λͺ¨λ‘ 0이 좜λ ₯ (update λ©”μ„œλ“œκ°€ 값을 μ „λ‹¬λ°›μ•˜κΈ° λ•Œλ¬Έ)
    • λ©”μ„œλ“œμ˜ μž…λ ₯으둜 객체λ₯Ό μ „λ‹¬ν•˜λ©΄ 객체 λ³€μˆ˜μ˜ κ°’ λ³€κ²½ κ°€λŠ₯ (λ©”μ„œλ“œ μˆ˜ν–‰ 후에도 객체의 λ³€κ²½λœ κ°’ μœ μ§€)

    λŒ“κΈ€