티스토리 뷰

객체지향개념에서 중요한 특징 중 하나인 다형성에 대해서 알아보겠다.

다형성은 상속과 깊은 관계가 있어 상속에 대해 충분히 알고 있어야 한다.

 

1. 다형성이란 ?

프로그램적으로 말하자면 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하는 것이다.

 

2. 다형성의 조건

사실 다형성에 조건은 없지만 허용되는 것과 허용되지 않는 것들이 있다.

 

조상타입의 참조변수로 자손타입의 인스턴스를 참조할 수 있다. 
자손 타입의 참조변수로 조상타입의 인스턴스를 참조할 수 없다.
참조변수가 사용할 수 있는 멤버의 개수는 인스턴스의 멤버 개수보다 같거나 적어야 한다.

 

이 세가지는 알고보면 다 같은 말이다. 참조변수가 사용하는 멤버의 개수가 인스턴스 멤버 개수보다 많다고 했을 때, 

인스턴스 멤버에는 존재하지 않는 멤버가 참조변수 클래스 안에 들어있을 것이다.

이 말은 참조변수로 인스턴스 멤버에 존재하지 않는 멤버를 사용하고자 할 가능성이 있으므로 허용되지 않는 것이다.

 

3. 다형성의 예

Tv클래스와 Caption클래스가 아래와 같이 정의되어 있다고 해보자.

void capion()메서드 구현은 생략하도록 하겠다. 

 

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

class CaptionTv extends Tv {
	Strin text;
    void caption() {}
}

 

Tv와 CapionTv 클래스는 서로 상속관계이며, 이 두 클래스의 인스턴스를 생성하고 사용하기 위해서 아래와 같이 할 수 있다. 

 

CaptionTv c = new CaptionTv();

 

지금까지 우리는 생성된 인스턴스를 다루기 위해서 인스턴스 타입과 일치하는 타입의 참조변수만을 사용했다.

즉 Tv인스턴스를 다루고 싶다면 Tv타입의 참조변수를 사용하고, CaptionTv인스턴스를 다루기 위해서 Caption타입의 참조변수를 사용했다. 

이렇게 하는 것이 보통이지만 조상 클래스 타입의 참조변수로 자손 클래스의 인스턴스를 참조하는 것도 가능하다.

 

Tv t = new CaptionTv();

 

4. 차이점

그렇다면 인스턴스를 같은 타입의 참조변수로 참조하는 것과 조상타입의 참조변수로 참조하는 것은 어떤 차이가 있는지 알아보자.

 

CaptionTv c = new CaptionTv();
Tv t = new CaptionTv();

 

위의 코드에서 CaptionTv인스턴스를 2개 생성하고 c의 참조변수는 CaptionTv타입이고,  t의 참조변수는 Tv타입이다.

이 경우 인스턴스가 CaptionTv타입이라고 해도 참조변수 t로 Caption인스턴스의 모든 멤버를 사용할 수 없다.

상속은 확장의 의미로, 참조변수 c는 Tv클래스를 상속받았기 때문에 Tv클래스 안에 있는 메서드들도 사용이 가능하지만, 참조변수가 조상클래스(Tv클래스)라면 상속받은 멤버, text와 caption()은 사용이 불가능하다.

한마디로 둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다.

 

참조변수의 타입이 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 개수를 결정한다는 사실을 이해하는 것은 매우 중요하다. 그렇다면 인스턴스 타입과 일치하는 참조변수를 사용하면 모든 멤버를 사용할 수 있을 텐데 왜 굳이 조상타입의 참조변수를 사용해서 인스턴스 일부 멤버만을 사용하도록 할까 ?

이 답은 앞으로 배울 것이며, 지금은 조상타입의 참조변수로도 자손클래스의 인스턴스를 참조할 수 있다는 것과 그 차이에 대해서만 이해하면 된다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday