JavaπŸŽ€

πŸ’šμΈν„°νŽ˜μ΄μŠ€(2)

Jeein0313 2023. 1. 16. 13:47

1οΈβƒ£μΈν„°νŽ˜μ΄μŠ€ 상속

 

μΈν„°νŽ˜μ΄μŠ€λ„ λ‹€λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό 상속할 수 있으며, ν΄λž˜μŠ€μ™€λŠ” 달리 닀쀑 상속이 κ°€λŠ₯ν•˜λ‹€. μžμ‹ μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„ ν΄λž˜μŠ€λŠ” μžμ‹ μΈν„°νŽ˜μ΄μŠ€μ˜ λ©”μ†Œλ“œλΏλ§Œ μ•„λ‹ˆλΌ λΆ€λͺ¨ μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ†Œλ“œκΉŒμ§€ λͺ¨λ‘ μž¬μ •μ˜ν•΄μ•Ό ν•œλ‹€. 그리고 κ΅¬ν˜„ κ°μ²΄λŠ” μžμ‹ μΈν„°νŽ˜μ΄μŠ€μ™€ λΆ€λͺ¨ μΈν„°νŽ˜μ΄μŠ€ λ³€μˆ˜μ— λŒ€μž… κ°€λŠ₯ν•˜λ‹€.

κ΅¬ν˜„ 객체가 μžμ‹ μΈν„°νŽ˜μ΄μŠ€ λ³€μˆ˜μ— λŒ€μž…λ˜λ©΄ λΆ€λͺ¨μ™€ μžμ‹ μΈν„°νŽ˜μ΄μŠ€μ˜ μΆ”μƒλ©”μ†Œλ“œλ₯Ό λͺ¨λ‘ ν˜ΈμΆœν•  수 μžˆμœΌλ‚˜, λΆ€λͺ¨ μΈν„°νŽ˜μ΄μŠ€ λ³€μˆ˜μ— λŒ€μž…λ˜λ©΄ λΆ€λͺ¨ μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ†Œλ“œλ§Œ ν˜ΈμΆœν•  수 μžˆλ‹€.

public interface InterfaceA {
    void methodA();
}
public interface InterfaceB {
    void methodB();
}
public interface InterfaceC extends InterfaceA, InterfaceB {
    void methodC();
}
public class InterfaceImpl implements InterfaceC {

    @Override
    public void methodA() {
        System.out.println("InterfaceC의 methodA");        
    }

    @Override
    public void methodB() {
        // TODO Auto-generated method stub
        System.out.println("InterfaceC의 methodB");        
        
    }

    @Override
    public void methodC() {
        // TODO Auto-generated method stub
        System.out.println("InterfaceC의 methodC");        
        
    }
    
}
public class ExtendsExample {
    public static void main(String[] args) {
        InterfaceImpl impl = new InterfaceImpl();

        InterfaceA a = impl;
        a.methodA();
        
        InterfaceB b = impl;
        b.methodB();

        InterfaceC c = impl;
        c.methodA();
        c.methodB();
        c.methodC();
    }
    
}

 

2οΈβƒ£νƒ€μž… λ³€ν™˜

 

μΈν„°νŽ˜μ΄μŠ€μ˜ νƒ€μž… λ³€ν™˜μ€ μΈν„°νŽ˜μ΄μŠ€μ™€ κ΅¬ν˜„ 클래슀 간에 λ°œμƒν•œλ‹€. μΈν„°νŽ˜μ΄μŠ€ λ³€μˆ˜μ— κ΅¬ν˜„ 객체λ₯Ό λŒ€μž…ν•˜λ©΄ κ΅¬ν˜„ κ°μ²΄λŠ” μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ μžλ™ νƒ€μž… λ³€ν™˜λœλ‹€. λ°˜λŒ€λ‘œ μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ„ κ΅¬ν˜„ 클래슀 νƒ€μž…μœΌλ‘œ λ³€ν™˜μ‹œν‚¬ 수 μžˆλŠ”λ°, μ΄λ•ŒλŠ” κ°•μ œ νƒ€μž… λ³€ν™˜μ΄ ν•„μš”ν•˜λ‹€.

 

➑ μžλ™ νƒ€μž… λ³€ν™˜μ΄ μΌμ–΄λ‚˜λŠ” 경우

κ΅¬ν˜„ 객체가 μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ μžλ™λ³€ν™˜λ˜λ©΄ μΈν„°νŽ˜μ΄μŠ€μ— μ„ μ–Έλœ λ©”μ†Œλ“œλ§Œ μ‚¬μš© κ°€λŠ₯

λΆ€λͺ¨ ν΄λž˜μŠ€κ°€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ³  μžˆλ‹€λ©΄ μžμ‹ ν΄λž˜μŠ€λ„ μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ μžλ™ νƒ€μž… λ³€ν™˜λ  수 μžˆλ‹€.

 

➑ κ°•μ œ νƒ€μž… λ³€ν™˜

κ°•μ œ νƒ€μž… λ³€ν™˜μ€ μΊμŠ€νŒ… 기호λ₯Ό μ‚¬μš©ν•΄μ„œ μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μ„ κ΅¬ν˜„ 클래슀 νƒ€μž…μœΌλ‘œ λ³€ν™˜μ‹œν‚€λŠ” 것을 λ§ν•œλ‹€. 

μžλ™ νƒ€μž… λ³€ν™˜ 후에 μΈν„°νŽ˜μ΄μŠ€μ— μ„ μ–Έλœ λ©”μ†Œλ“œκ°€ μ•„λ‹Œ κ΅¬ν˜„ 객체에 μ„ μ–Έλœ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•˜κ³  μ‹Άλ‹€λ©΄ μΊμŠ€νŒ… 기호둜 κ°•μ œ νƒ€μž… λ³€ν™˜μ„ ν•˜λ©΄ λœλ‹€.

3οΈβƒ£λ‹€ν˜•μ„±

 

λ‹€ν˜•μ„±μ΄λž€ μ‚¬μš© 방법은 λ™μΌν•˜μ§€λ§Œ λ‹€μ–‘ν•œ κ²°κ³Όκ°€ λ‚˜μ˜€λŠ” 것을 λ§ν•œλ‹€. 

λ‹€μŒμ²˜λŸΌ κ΅¬ν˜„ 객체가 B인지 C인지에 따라 객체 A의 λ©”μ†Œλ“œ 호좜 κ²°κ³ΌλŠ” λ‹¬λΌμ§ˆ 수 μžˆλ‹€.

μƒμ†μ˜ λ‹€ν˜•μ„±κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μΈν„°νŽ˜μ΄μŠ€ μ—­μ‹œ λ‹€ν˜•μ„±μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ μž¬μ •μ˜μ™€ μžλ™ νƒ€μž… λ³€ν™˜ κΈ°λŠ₯을 μ΄μš©ν•œλ‹€.

μΈν„°νŽ˜μ΄μŠ€μ˜ 좔상 λ©”μ†Œλ“œλŠ” κ΅¬ν˜„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜λ₯Ό ν•΄μ•Ό ν•˜λ©°, μž¬μ •μ˜λ˜λŠ” λ‚΄μš©μ€ κ΅¬ν˜„ ν΄λž˜μŠ€λ§ˆλ‹€ λ‹€λ₯΄λ‹€. κ΅¬ν˜„ κ°μ²΄λŠ” μΈν„°νŽ˜μ΄μŠ€ νƒ€μž…μœΌλ‘œ μžλ™ νƒ€μž… λ³€ν™˜ 되고, μΈν„°νŽ˜μ΄μŠ€ λ©”μ†Œλ“œ ν˜ΈμΆœμ‹œ κ΅¬ν˜„ 객체의 μž¬μ •μ˜λœ λ©”μ†Œλ“œκ°€ ν˜ΈμΆœλ˜μ–΄ λ‹€μ–‘ν•œ μ‹€ν–‰ κ²°κ³Όλ₯Ό 얻을 수 μžˆλ‹€.

 

βž‘ν•„λ“œμ˜ λ‹€ν˜•μ„±

public class HankookTire implements Tire{

    @Override
    public void roll() {
        System.out.println("ν•œκ΅­νƒ€μ΄μ–΄κ°€ κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.");        
    }
    
}
public class KumhoTire implements Tire {

    @Override
    public void roll() {
        System.out.println("금호 타이어가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.");        
    }
    
}
public class Car {
    Tire tire1 = new HankookTire();
    Tire tire2 = new HankookTire();

    void run() {
        tire1.roll();
        tire2.roll();
        
    }
}
public class CarExample {
    public static void main(String[] args) {
        Car myCar = new Car();

        myCar.run();
        //ν•œκ΅­νƒ€μ΄μ–΄κ°€ κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.
        //ν•œκ΅­νƒ€μ΄μ–΄κ°€ κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.

        myCar.tire1 = new KumhoTire();
        myCar.tire2 = new KumhoTire();

        myCar.run();
        //금호 타이어가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.
        //금호 타이어가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.
    }
}

 

βž‘λ§€κ°œλ³€μˆ˜μ˜ λ‹€ν˜•μ„±

 

λ©”μ†Œλ“œ 호좜 μ‹œ λ§€κ°œκ°’μ„ λ‹€μ–‘ν™”ν•˜κΈ° μœ„ν•΄ μƒμ†μ—μ„œλŠ” λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ λΆ€λͺ¨ νƒ€μž…μœΌλ‘œ μ„ μ–Έν•˜κ³  ν˜ΈμΆœν•  λ•Œμ—λŠ” λ‹€μ–‘ν•œ μžμ‹ 객체λ₯Ό λŒ€μž…ν–ˆλ‹€. 이것은 μžλ™ νƒ€μž… λ³€ν™˜ λ•Œλ¬ΈμΈλ°, λΉ„μŠ·ν•œ μ›λ¦¬λ‘œ λ§€κ°œλ³€μˆ˜ νƒ€μž…μ„ μΈν„°νŽ˜μ΄μŠ€λ‘œ μ„ μ–Έν•˜λ©΄ λ©”μ†Œλ“œ 호좜 μ‹œ λ‹€μ–‘ν•œ κ΅¬ν˜„ 객체λ₯Ό λŒ€μž…ν•  수 μžˆλ‹€.

public class Car {
    void run(Tire tire) {
        tire.roll();
    }
}
public class CarExample {
    public static void main(String[] args) {
        Car myCar = new Car();
        Tire tire1 = new KumhoTire();
        Tire tire2 = new HankookTire();

        myCar.run(tire1);//금호 타이어가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.
        myCar.run(tire2);//ν•œκ΅­νƒ€μ΄μ–΄κ°€ κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.
    }
}

μžλ™ νƒ€μž… λ³€ν™˜ -> μ˜€λ²„λΌμ΄λ”© λ©”μ†Œλ“œ 호좜 -> λ‹€ν˜•μ„±

 

4️⃣객체 νƒ€μž… 확인

 

instanceof μ—°μ‚°μžλŠ” μΈν„°νŽ˜μ΄μŠ€μ—μ„œλ„ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

public class Car {
    void run(Tire tire) {
        if(tire instanceof KumhoTire){
            tire.roll();
        } else {
            System.out.println("κΈˆν˜Ένƒ€μ΄μ–΄λ§Œ μ‚¬μš©κ°€λŠ₯ν•©λ‹ˆλ‹€.");
        }
    }
}
public class CarExample {
    public static void main(String[] args) {
        Car myCar = new Car();
        Tire tire1 = new KumhoTire();
        Tire tire2 = new HankookTire();

        myCar.run(tire1);//금호 타이어가 κ΅΄λŸ¬κ°‘λ‹ˆλ‹€.
        myCar.run(tire2);//κΈˆν˜Ένƒ€μ΄μ–΄λ§Œ μ‚¬μš©κ°€λŠ₯ν•©λ‹ˆλ‹€.


    }
    
}

 

5οΈβƒ£λ΄‰μΈλœ μΈν„°νŽ˜μ΄μŠ€

 

Java 15λΆ€ν„°λŠ” λ¬΄λΆ„λ³„ν•œ μžμ‹ μΈν„°νŽ˜μ΄μŠ€ 생성을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ λ΄‰μΈλœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

InterfaceA의 μžμ‹ μΈν„°νŽ˜μ΄μŠ€λŠ” InterfaceB만 κ°€λŠ₯ν•˜κ³ , κ·Έ μ΄μ™ΈλŠ” μžμ‹ μΈν„°νŽ˜μ΄μŠ€κ°€ 될 수 없도둝 λ‹€μŒκ³Ό 같이 InterfaceAλ₯Ό μ„ μ–Έν•  수 μžˆλ‹€.

public sealed interface InterfaceA permits InterfaceB {...}

λ΄‰μΈλœ InterfaceA의 μžμ‹ InterfaceBλŠ” non-sealed ν‚€μ›Œλ“œλ‘œ λ‹€μŒκ³Ό 같이 μ„ μ–Έν•˜κ±°λ‚˜ sealed ν‚€μ›Œλ“œλ‘œ 또 λ‹€λ₯Έ 봉인 μΈν„°νŽ˜μ΄μŠ€λ‘œ μ„ μ–Έν•΄μ•Ό 함.

public non-sealed interface InterfaceB extends InterfaceA {...}

non-sealedλŠ” 봉인 ν•΄μ œλ₯Ό μ˜λ―Έν•˜λ©°, λ”°λΌμ„œ InterfaceBλŠ” μžμ‹ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°€μ§ˆ 수 μžˆλ‹€.

 

❕본 ν¬μŠ€νŒ…μ€ '이것이 μžλ°”λ‹€' ꡐ재λ₯Ό λ°”νƒ•μœΌλ‘œ κ³΅λΆ€ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•œ κ²ƒμž…λ‹ˆλ‹€.