다형성이란?
객체지향개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다. 구체적으로, 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 하였다 는 것이다.
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 t = new CaptionTv(); //조상 타입의 참조변수로 자손 인스턴스를 참조
CaptionTv c = new Tv(); //컴파일 에러
인스턴스를 같은 타입의 참조변수로 참조하는 것과 조상타입의 참조변수로 참조하는 것은 어떤 차이가 있을까?
CaptionTv c = new CaptionTv();
Tv t = new CaptionTv();
위와 같이 CaptionTv
인스턴스 2개를 생성하고, 참조변수 c와 t가 생성된 인스턴스를 하나씩 참조하도록 하였다.
이 경우 실제 인스턴스가 CaptionTv
타입이라 할지라도, 참조 변수 t로는 CaptionTv
인스턴스의 모든 멤버를 사용할 수 없다.
Tv
타입의 참조변수로는 CaptionTv
인스턴스 중에서 Tv
클래스의 멤버들(상속받은 멤버포함)만 사용할 수 있다.
둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 다라 사용할 수 있는 멤버의 개수가 달라진다.
자손타입의 참조변수로 조상타입의 인스턴스를 참조하는 것은 존재하지 않는 멤버를 사용하고자 할 가능성이 있으므로 허용하지 않는다. 참조변수가 사용할 수 있는 멤버의 개수는 인스턴스 멤버의 개수보다 같거나 적어야 한다
참조변수의 형변환
기본형 변수와 같이 참조변수도 형변환이 가능하나, 서로 상속관계에 있는 클래스 사이에서만 가능하다.
자손타입 --> 조상타입 (Up-casting) : 형변환 생략가능
자손타입 <-- 조상타입 (Down-casting) : 형변환 생략가능
Car 클래스를 상속받는 FireEngine 클래스가 있다고 가정하자
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
car = fe; //car = (Car)fe;에서 형변환 생략됨. 업캐스팅
fe2 = (FireEngine)car; //형변환 생략불가. 다운캐스팅
형변환은 참조변수의 타입을 변환하는 것이지 인스턴스를 변환하는 것은 아니기 때문에 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다. 단지 참조변수의 형변환을 통해서, 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위(개수)를 조절하는 것 뿐이다.
Tv t = new CaptionTv(); 도 Tv t = (Tv)new CaptionTv(); 의 생략된 형태이다.
'JAVA' 카테고리의 다른 글
[JAVA] LocalDateTime vs. Instant (feat. ZonedDateTime, OffsetDateTime) (0) | 2023.01.17 |
---|---|
[JAVA] 가변인자(varargs)와 오버로딩 (0) | 2023.01.03 |
[JAVA] 변수와 메서드 (선언위치, JVM 메모리구조, static과 인스턴스) (0) | 2023.01.03 |
[JAVA] empty()와 isEmpty() (0) | 2022.07.28 |
[JAVA] 컬렉션 프레임웍(Collections Framework) (0) | 2022.07.28 |
댓글