다형성(polymorphism)
여러가지 형태를 가질 수 있는 능력.
= 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함.
= 조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조할 수 있도록 함.
class Tv {
boolean power;
int channel;
void power() { power = !power; }
void ChannelUp() { ++channel; }
void ChannelDown() { --channel; }
}
class CaptionTv extends Tv {
String text;
void caption(String text) {
Sustem.out.println(text);
}
}
지금까지는, 생성된 인스턴스를 다루기 위해 인스턴스 타입과 일치하는 타입의 참조변수를 사용함.
Tv 인스턴스를 다루기 위해서는 Tv 타입의 참조변수 사용, CaptionTv 인스턴스 다루기 위해서는 CaptionTv 타입의 참조변수를 사용한 것임.
그런데... 둘이 상속 관계일 경우
조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하도록 하는 것이 가능하다.
설명을 쉽게 하기 위해 참조변수 = 인스턴스를 다루기 위한 리모컨이라고 하겠음.
Tv t = new Tv(); //TV 리모컨으로 Tv 인스턴스를 다룬다.
CaptionTv c = new CaptionTv(); //CaptionTv 리모컨으로 CaptionTv 인스턴스를 다룬다.
// 다형성
Tv t = new CaptionTv(); // Tv 리모컨으로 CaptionTv 인스턴스를 다룬다.
조상 타입의 참조변수 t로 자손 객체인 CaptionTv를 다룬다.
이게 어떻게 가능?
아니 생각해보면 그럴듯함.
CaptionTv c = new CaptionTv(); //①
Tv t = new CaptionTv(); //②
①의 경우, CaptionTv의 모든 멤버들을 사용 가능.
②의 경우, CaptionTv의 모든 멤버 사용 불가. Tv의 멤버만을 사용 가능하다.
Tv 리모컨에는 power 변수와 channel 변수 존재, 그리고 power(), channelUp(), channelDown() 기능이 존재한다.
CaptionTv 리모컨에는 Tv 리모컨 기능에 더하여 text 변수와 caption() 기능이 존재한다.
Tv리모컨으로 CaptionTv를 다룰 수 있으나, CaptionTv에서 추가된 기능은 사용 불가능하다. Tv 리모컨에는 업데이트가 안됐거든 ㅎㅎ 물론 인스턴스 자체에는 해당 기능이 존재함. 그것을 다룰 수가 없을 뿐이다.
①, ② 모두 같은 인스턴스가 생성되나, 참조변수의 타입이 다르기에 사용할 수 있는 멤버의 개수가 다르다.
CaptionTv c = new Tv(); //에러
위 코드는 에러가 발생한다.
captionTv 리모컨으로 Tv 인스턴스를 다룰 수 없기 때문이다.
captionTv 리모컨에는 text 변수와 caption() 기능이 존재하지만.. Tv 인스턴스에는 해당 기능이 존재하지 않기 때문이다.
즉, 인스턴스에는 기능이 존재하나 참조변수로 인해 사용 불가능한 것과
참조변수에는 기능이 존재하여 사용하려 했으나, 인스턴스에 기능이 없는 것은 다르다. 후자는 절대 불가능함.
[정리]
조상 타입의 참조변수로 자손 타입의 인스턴스를 참조할 수 있다.
반대로 자손 타입의 참조변수로 조상 타입의 인스턴스를 참조할 수는 없다.
'프로그래밍 > java' 카테고리의 다른 글
[JAVA] 매개변수의 다형성, 객체 배열과 벡터 (0) | 2022.08.31 |
---|---|
[JAVA] 참조변수의 형변환 (0) | 2022.08.29 |
[JAVA] 패키지와 import, 제어자, 겟터와 셋터 (0) | 2022.08.28 |
[JAVA] 오버라이딩(overriding)과 참조변수 super, super() 생성자 (0) | 2022.08.27 |
[JAVA] 상속 (0) | 2022.08.26 |