티스토리 뷰
객체지향개념에서 중요한 특징 중 하나인 다형성에 대해서 알아보겠다.
다형성은 상속과 깊은 관계가 있어 상속에 대해 충분히 알고 있어야 한다.
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()은 사용이 불가능하다.
한마디로 둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다.
참조변수의 타입이 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 개수를 결정한다는 사실을 이해하는 것은 매우 중요하다. 그렇다면 인스턴스 타입과 일치하는 참조변수를 사용하면 모든 멤버를 사용할 수 있을 텐데 왜 굳이 조상타입의 참조변수를 사용해서 인스턴스 일부 멤버만을 사용하도록 할까 ?
이 답은 앞으로 배울 것이며, 지금은 조상타입의 참조변수로도 자손클래스의 인스턴스를 참조할 수 있다는 것과 그 차이에 대해서만 이해하면 된다.
'Java' 카테고리의 다른 글
null 대신 Optional 클래스를 사용하자 (0) | 2022.07.06 |
---|---|
예외처리 개념과 예외처리를 할 때 출력만 하면 안되는 이유 (0) | 2022.05.01 |
추상클래스와 인터페이스 개념과 사용법 (0) | 2022.04.30 |
개발할 때 많이 쓰는 오버로딩 개념과 사용법 (0) | 2022.04.29 |
객체지향을 처음 들어보는 분들을 위한 정리 (0) | 2022.04.13 |
- Total
- Today
- Yesterday