다형성
다형성
다형성은 상속과 함께 객체지향 개념이 중요한 특징 중의 하나입니다 그리고 다형성은 상속과 깊은 관계를 가지고 있습니다
다형성은 여러 가지 형태를 가질 수 있는 능력을 의미하며 자바에서는 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였습니다
이름 좀 더 구체적으로 설명하면 부모 클래스 타입의 참조 변수로 자식 클래스의 인스턴스를 참조할 수 있도록 하였다는 것입니다
package com.bit.mySelf01;
class Tv{
boolean power;
int channel;
void power(){ power = !power;}
void channelUp(){++channel;}
void channelDown(){--channel;}
}
class CaptionTv extends Tv{
String text;
void caption(){}
}
Tv클래스와 CaptionTv 클래스는 서로 상속 관계이며 이 두 클래스의 인스턴스를 생성하고 사용하기 위해서는
public class Ex01 {
public static void main(String[] args) {
Tv t = new Tv();
CaptionTv c = new CaptionTv();
}
}
위의 코드처럼 할 수 있습니다.
지금까지 우리는 생성된 인스턴스를 다루기 윟서 인스턴스의 타입과 일치하는 타입의 참조 변수만을 사용했습니다 즉 Tv인 스털츠를 다루기 위해서 Tv타입의 참조 변수를 사용했습니다.
이ㅣ처럼 인스턴스의 타입과 참조 변수의 타입이 일치하는 것이 보통이지만 Tv와 CaptionTv클래스가 서로 상속 관계에 있을 경우 부모 클래스 타입의 참조 변수로 자식 클래스의 인스턴스를 참조하도록 하는 것도 가능합니다.
public class Ex01 {
public static void main(String[] args) {
CaptionTv c = new CaptionTv();
Tv t = new CaptionTv();//부모타입의 참조변수로 자식인스턴스를 참조
}
}
위의 코드처럼 CaptionTv인스턴스 2개를 생성하고 참ㅈ변수 c와 t가 생성된 인스턴스를 하나씩 참조하도록 하였습니다 이 경우 실제 인스턴스가 CaptionTV타입이라 할지라도 참조 변수 t로는 CaptionTv인스턴스의 모든 멤버를 사용할 수 없습니다
Tv타입의 참조 변수로는 CaptionTv인스턴스 중에서 Tv클래스의 멤버들만 사용할 수 있습니다 따라서 생선 된 CaptionTv인스턴스의 멤버 중에서 Tv클래스에 정의되지 않은 멤버 text와 caption은 참조 변수 t로 사용이 불가능합니다 즉 t.text 또는 t.cption() 같이 할 수 없다는 것입니다 둘 다 같은 타입의 인스턴스이지만 참조 변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라집니다.
CaptionTv c = new Tv();
반대로 자식 타입의 참조 변수로 부모 타입의 인스턴스를 참조하는 것은 가능할까 라고 생각할 수 있지만 그렇지 않습니다
만약 실행하게 되면 컴파일 에러가 나오게 됩니다 이유는 실제 인스턴스인 Tv의 멤버 개수보다 참조 변수 c가 사용할 수 있는 멤버 개수가 더 많기 때문입니다 그래서 이를 허용하지 않습니다
CaptionTv클래스에는 text와 Caption()이 정의되어 있으므로 참조 변수 c로는 c.text, c.caption()과 같은 방식으로 c가 참조하고 있는 인스턴스에서 text와 caption()을 사용하려 할 수 있습니다 하지만 ㅊrk c가 참조하고 있는 인스턴스 Tv타입이고 Tv타입의 인스턴스에는 text와 caption()이 존재하지 않기 때문에 이들을 사용하려 하면 문제가 발생합니다
참조 변수의 타입이 참조 변수가 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 개수를 결정한다는 사실을 이해하는 것은 매우 중요합니다