본문 바로가기
Dev/Java

[Java] 자바의 정석 기초편 ch7-23 다형성(polymorphism)

by 코딩삐약 2022. 6. 22.

ch7-23 다형성(polymorphism)

- 여러 가지 형태를 가질 수 있는 능력

조상 타입 참조 변수로 자손 타입 객체를 다루는 것

 

6장~7장 다형성까지 3회 반복!!!!!!!! - > 다형성 이해 못하면 뒤에 추상클래스,인터페이스 의미없음.

 

class Tv {
    boolean power;
    int channel;
    
    void power()       { power = !power; }
    void channelUp()   { ++channel; }
    void channelDown() { --channel; }
}

class SmartTv extends Tv { //Tv의 자식 클래스
    String text; //캡션(자막)을 보여주기 위한 문자열
    void caption() { //생략 }
}
//다형성 = 조상타입 참조변수로 자손 타입 객체를 다루는 것
Tv t = new SmartTv(); // 타입 불일치도 ok
//Tv 리모콘으로 SmartTv 작동

// 일치하는게 보통.
// 두 가지 장점때문에 다형성이 중요
// 타입 불일치해도 된다.

 

-  객체와 참조변수의 타입이 일치할 때와 일치하지 않을때의 차이?

① SmartTv s = new SmartTv(); // 참조 변수와 인스턴스의 타입이 일치
② Tv      t = new SmartTv(); // 조상 타입 참조변수로 자손 타입 인스턴스 참조

① SmartTv 리모콘 버튼 7개 => 제품 SmartTv 멤버개수 7개 ( Tv 5개 + SmartTv 2개) - 7개 기능 모두 사용가능

② Tv 리모콘 버튼 5개 (Tv클래스에 정의된 멤버 5개) => 제품 SmartTv 멤버 7개 - 5개만 사용 가능

 

- 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없다.

① Tv      t = new SmartTv();   // OK. 허용.
② SmartTv s = new Tv();        // 에러. 허용 안 됨.

 

리모콘 버튼 7개 > 멤버 개수 5개 (버튼으로 없는 객체를 호출할 수 없다.) => 에러

 


정리

 

Q. 참조변수의 타입은 인스턴스의 타입과 반드시 일치해야 하나요?

A. 아닙니다. 일치하는 것이 보통이지만 일치하지 않을 수도 있습니다.

① SmartTv s = new SmartTv(); // 참조 변수와 인스턴스의 타입이 일치
② Tv      t = new SmartTv(); // 조상 타입 참조변수로 자손 타입 인스턴스 참조

 

Q. 참조변수가 조상타입일 때와 자손타입일 때의 차이?

A. 참조변수로 사용할 수 있는 멤버의 개수가 달라집니다. 

 

Q. 자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 있나요?

A. 아니요. 허용되지 않습니다.