λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Web Application

Java 객체 지ν–₯

by 행뱁 2021. 8. 29.

#좔상화 #상속 #λ‹€ν˜•μ„± #μΊ‘μŠν™”

 

좔상화 (Abstraction)

- 객체λ₯Ό κ΄€μ°°ν•˜μ—¬ κ³΅ν†΅λœ νŠΉμ„±μ„ μ°Ύμ•„ 클래슀λ₯Ό μ„€κ³„ν•˜κ²Œ λ˜λŠ”λ°, 이 쀑 관심 μ˜μ—­ (= Context = Application Boundary) 에 μžˆλŠ” νŠΉμ„±λ§Œ 가지고 μž¬μ‘°ν•© ν•˜λŠ” 것 (= λͺ¨λΈλ§)

- 예λ₯Ό λ“€μ–΄ ν™˜μž 클래슀λ₯Ό λ§Œλ“ λ‹€λ©΄ μ†Œμœ ν•œ 집이 λͺ‡ μ±„μΈμ§€λŠ” ν•„μš” μ—†λ‹€.

 

 

상속 (Inheritance)

[ κ°œλ… ]

- μ‘°μ§λ„λ‚˜ 계측도가 μ•„λ‹Œ λΆ„λ₯˜λ„μ˜ κ°œλ… (Animal ⊃ Mammal ⊃ Bat)

- μƒμœ„ 클래슀의 νŠΉμ„±μ„ ν•˜μœ„ ν΄λž˜μŠ€μ— μƒμ†ν•˜κ³ , 거기에 더해 ν•„μš”ν•œ νŠΉμ„±μ„ μΆ”κ°€ (ν™•μž₯) ν•΄μ„œ μ‚¬μš©ν•  수 μžˆλ‹€λŠ” 의미

- 'ν•˜μœ„ 클래슀' is a kind of (extends) 'μƒμœ„ 클래슀'

 

[ λ©”λͺ¨λ¦¬ 레벨 이해 ]

- ν•˜μœ„ 클래슀 객체λ₯Ό μƒμ„±ν•˜λ©΄ μƒμœ„ 클래슀 객체도 ν•¨κ»˜ heap μ˜μ—­μ— ν• λ‹Ήλœλ‹€.

- Animal a = new Mammal(); κ³Ό 같이 μƒμ„±ν•˜λŠ” 객체의 νƒ€μž…κ³Ό 객체 μ°Έμ‘° λ³€μˆ˜μ˜ νƒ€μž…μ„ λ‹€λ₯΄κ²Œ ν•  수 μžˆλ‹€. Mammal 객체와 Animal 객체 λͺ¨λ‘ heap μ˜μ—­μ— ν• λ‹Ήλ˜μ§€λ§Œ 이 경우 aλŠ” Animal 객체λ₯Ό μ°Έμ‘°ν•œλ‹€. 즉 Mammal 객체에 μ‹ κ·œ μΆ”κ°€ν•œ λ©€λ²„λŠ” 객체 μ°Έμ‘° λ³€μˆ˜ aμ—μ„œ μ‚¬μš© λΆˆκ°€λŠ₯ν•˜λ‹€. 단 Mammalμ—μ„œ μ˜€λ²„λΌμ΄λ“œν•œ λ©”μ„œλ“œμ˜ 경우 κΈ°μ‘΄ Animal 멀버가 κ°€λ €μ Έ μž¬μ •μ˜ν•œ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλœλ‹€.

- 즉 μƒμœ„ 클래슀 νƒ€μž…μ˜ μ°Έμ‘° λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ”λΌλ„ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ“œν•œ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλœλ‹€.

 

[ μΈν„°νŽ˜μ΄μŠ€ ]

- 닀쀑 상속 (2개 이상 extends) λŠ” ν—ˆμš©λ˜μ§€ μ•ŠμœΌλ©°, λŒ€μ‹  'μΈν„°νŽ˜μ΄μŠ€' λΌλŠ” κ°œλ…μ΄ μžˆλ‹€.

- 'κ΅¬ν˜„ 클래슀' is able to (implements) 'μΈν„°νŽ˜μ΄μŠ€' 의 의미둜 주둜 쓰이며, ν΄λž˜μŠ€μ—κ²Œ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λ„λ‘ κ°•μ œν•œλ‹€.

- ν•˜λ‚˜μ˜ ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ 개의 μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λ„λ‘ ν•  수 μžˆλ‹€. (implements A, B)

 

 

λ‹€ν˜•μ„± (Polymorphism)

- Override: μƒμœ„ 클래슀의 λ©”μ„œλ“œμ™€ 같은 이름, 같은 인자 리슀트둜 μž¬μ •μ˜

- Overload: 같은 이름, λ‹€λ₯Έ 인자 리슀트둜 쀑볡 μ •μ˜

 

 

μΊ‘μŠν™” (Encapsulation)

- μ—°κ΄€λœ 속성과 λ©”μ„œλ“œλ₯Ό 클래슀둜 묢되 μΌλΆ€λ§Œ μ™ΈλΆ€μ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜μ—¬ 정보 은닉을 μ‹€ν˜„

- μ ‘κ·Ό μ œμ–΄ μ§€μ‹œμž: private, [default], protected, public

- private은 본인만 / [default]λŠ” 동일 νŒ¨ν‚€μ§€ λ‚΄μ˜ 클래슀만 / protectedλŠ” 상속 ν΄λž˜μŠ€λ‚˜ 동일 νŒ¨ν‚€μ§€ λ‚΄μ˜ 클래슀만 / public은 μ–΄λ””μ„œλ‚˜ μ ‘κ·Ό κ°€λŠ₯ν•˜λ‹€. κ·ΈλŸ¬λ‚˜ 클래슀 멀버 (= 정적 멀버) 에 μ ‘κ·Όν•˜λŠλƒ 객체 멀버에 μ ‘κ·Όν•˜λŠλƒμ— 따라 λ¬Έμ œλŠ” μ–΄λ €μ›Œμ§ˆ 수 μžˆλ‹€.

- μΌκ΄€λœ ν˜•μ‹μœΌλ‘œ μ ‘κ·Όν•˜κ³  λ©”λͺ¨λ¦¬ μ ‘κ·Ό μƒμ˜ νŽΈλ¦¬ν•¨μ„ μœ„ν•˜μ—¬ 정적 λ©€λ²„μ˜ 경우 '클래슀λͺ….정적멀버'의 ν˜•νƒœλ‘œ μ ‘κ·Όν•˜λŠ” 것이 ꢌμž₯λœλ‹€.

 

더보기
public class Animal {
    String myClass;
    
    Animal() {
        myClass  = "Animal";
    }
    
    void showMe() {
        System.out.println(myClass);
    }
}

public interface Flyable {
    void fly();
}

public class Mammal extends Animal {
    Mammal() {
        myClass = "Mammal";
    }
    
    @Override
    public void showMe() {
        System.out.println("Overrided in Mammal: " + myClass);
    }
}

public class Bird extends Animal {
    Bird() {
        myClass = "Bird";
    }
    
    @Override
    public void showMe() {
        System.out.println("Overrided in Bird: " + myClass);
    }
}

public class Bat extends Mammal implements Flyable {
    Bat() {
        myClass = "Bat";
    }
    
    @Override
    public void showMe() {
        System.out.println("Overrided in Bat: " + myClass);
    }
    
    @Override
    public void fly() {
        System.out.println("Flying1 " + myClass);
    }
}

public class Sparrow extends Bird implements Flyable {
    Bat() {
        myClass = "Sparrow";
    }
    
    @Override
    public void fly() {
        System.out.println("Flying2 " + myClass);
    }
}

 

public class Driver {
    public static void main(String args[]) {
        Animal[] a = new Animal[4];
        a[0] = new Mammal();
        a[1] = new Bird();
        a[2] = new Bat();
        a[3] = new Sparrow();
        
        for(Animal aa: a) {
            aa.showMe();
            // aa.fly(); => ERROR: The method fly() is undefined for the type Animal.
        }
        
        
        Flyable[] f = new Flyable[2];
        f[0] = new Bat();
        f[1] = new Sparrow();
        
        for(Flyable ff: f) {
            ff.fly();
            // ff.showMe(); => ERROR: The method showMe() is undefined for the type Flyable.
        }
    }
}

 

Overrided in Mammal: Mammal
Overrided in Bird: Bird
Overrided in Bat: Bat
Overrided in Bird: Sparrow
Flying1 Bat
Flying2 Sparrow

 

 

λŒ“κΈ€