다형성(polymorphism)
▶ 여러 형태를 가지는 특성
▶ 조상타입 참조변수로 자손타입 인스턴스를 다루는 것
class Tv{
boolean power;
int channel;
void power() {power =!power;}
void channelUp() {++channel; }
void channelDown() { --channel;}
}
class SmartTv extends Tv{
String text;
void caption() {//내용생략}
}
위의 코드를 보면 타입이 일치하고 있는 것을 볼 수 있다. 다형성을 배우기 전까지는 이러한 형태로 타입을 일치시켜서 사용을 하였다. 다형성은 이러한 타입이 불일치시키는 것을 말한다. 아래의 코드를 보면 타입이 불일치하는 것을 볼 수있다. 쉽게 말하자면 Tv리모콘이 SmartTv()제품을 다루는 것을 표현하고 있다. 보통의 경우에는 참조변수의 타입과 인스턴스의 타입이 일치하지만 일치하지 않는 경우를 다형성이라 한다.
앞서 다형성의 특성에서 설명한 것처럼 조상타입 참조변수로 자손타입 인스턴스를 다루는 것을 나타낸 경우다.
일치할 때와 일치하지 않을 때의 차이
앞서 설명한 코드를 보면 Tv클래스가 5개, SmartTv 클래스는 멤버가 7개가 있다.
SmartTv s = new SmartTv();
Tv t = new SmartTv();
1. SmartTv() 클래스는 멤버가 7개 있으며 모든 기능을 사용할 수 있다.
2. Tv 클래스 실제로 사용할 수 있는 기능은 5개이다. (일부만 사용가능)
SmartTv 객체가 7개의 기능을 가지고 있어도 리모컨의 기능이 5개밖에 없기 문에 실제 사용은 5개만 가능하다.
참조변수와 인스턴스 사이에 멤버 갯수 차이
Tv t = new SmartTv(); //허용
SmartTv s = new Tv(); //에러 허용안됨
위의 코드는 에러가 날 수 있는 상황을 나타낸 것이다.
1번째 코드를 보면 SmartTv 멤버는 7개이고 tv 멤버는 5개이기 때문에 리모컨이라고 생각했을 때 리모컨버튼이 5개있고 기능 7개가 있다고 하면 버튼 5개만 사용해서 쓸 수 있기 때문에 문제가 되지 않는다.
2번째 코드를 보면 SmartTv 멤버는 7개 Tv멤버는 5개이다. 그리고 조상객체인 tv와 SmartTv 는 자손객체이다.
참조변수가 조상타입일 때와 자손타입일 때의 차이가 분명히 있다. 참조변수로 사용할 수 있는 멤버의 개수가 달라진다.
실제 가지고 있는 멤버개수보다 많으면 에러가 난다. 즉 기능이 5개이고 리모컨 버튼이 7개라고 한다면 2개는 기능이 제대로 작동되지 않을 것이다. 버튼을 누르면 없기 때문에 에러가 난다.
아예 기능이 없으면 안쓰면 되는데, 기능이 없는데도 불구하고 그 기능을 사용하려는 리모콘 버튼이 만들어진다면 에러가 발생한다. 즉 자손타입의 참조변수로 조상타입의 객체를 가리킬 수 없다.
'객체지향' 카테고리의 다른 글
인터페이스 (0) | 2021.11.08 |
---|---|
참조변수의 형변환 (0) | 2021.11.08 |
[상속] 제어자, static , final (0) | 2021.11.06 |
[상속] 참조변수 super, 생성자 super() (0) | 2021.11.05 |
[상속] 오버라이딩 (0) | 2021.11.05 |