다형성이란?
여러 형태의 데이터를 가질 수 있는 능력.
자바에서 다형성을 잘 나타낸 것은 부모 클래스 타입의 참조변수가 자식 클래스 타입의 인스턴스를 참조할 수 있다는 것이다.
class Tv{
boolean power;
int channel;
void power(){power= !power;}
void channelUp(){++channel;}
void channelDown(){--channel;}
void method(){...}
}
class SmartTv extends Tv{
String text;
void caption(){...}
void method(){...}// 오버라이드
}
다음과 같이 SmartTv 클래스는 Tv 클래스를 상속받았다.
Tv t1 = new SmartTv();
SmartTv t2 = new SmartTv();
같은 SmartTv의 인스턴스이지만 t1과 t2의 차이는 뭘까?
- t1은 타입이 Tv 클래스이다. 즉, Tv 클래스의 멤버만 사용할 수 있다.
- t2는 Tv 클래스의 멤버와 SmartTv 클래스의 멤버 모두 사용할 수 있다.
정리하자면 같은 클래스의 인스턴스이더라도 참조변수의 타입에 따라 사용할 수 있는 멤버가 다르다. 이것이 다형성의 핵심이다.
주의할 점: t1이 method()를 호출한다면?
- 오버라이드된 SmartTv의 method()를 호출하는 것.
부모 타입인 참조변수가 메서드를 호출할 때, 보통 부모의 메서드를 호출하는 것이지만
오버라이딩한 메서드는 자식에서 호출하는 것이다.
참조변수의 형변환
자동 형변환 : 자식 타입을 부모 타입으로 변환할 때.
강제 형변환 : 부모 타입을 자식 타입으로 변환할 때. 단, 인스턴스가 자식일 때만 형변환을 할 수 있다.
Tv t = new SmartTv(); //자동 형변환
Tv t2 = new SmartTv();
SmartTv st1 = (SmartTv) t2; //강제 형변환
Tv t3= new Tv();
SmartTv st2 = (SmartTv) t3;//에러.부모 인스턴스가 자식 타입이 될 순 없음.
강제 형변환 시 참조변수가 참조하는 것이 자식 인스턴스일때만 가능하기 때문에 먼저 타입을 확인하는 작업이 필요하다.
이는 instanceof 연산자를 통해 타입을 확인할 수 있다.
void convert(Tv t){
if(t instanceof SmartTv){//t가 SmartTv의 인스턴스인지 확인 후 강제 형변환
SmartTv st = (SmartTv)t;
}
}
이렇게 참조변수의 형변환을 통해 참조변수가 사용할 멤버의 개수를 조절할 수 있다.
다형성의 예시)
class Product{}
class Computer extends Product{}
class Tv extends Product{}
class Audio extends Product{}
class Buyer{
Product cart[] = new Product[10];
int i=0;
void buy(Product p){
cart[i++] = p;
}
}
매개변수의 다형성
Buyer 클래스의 buy메서드를 보면 매개변수 타입이 Product이다.
Computer 타입으로 정의하면 buy메서드에는 Computer만 들어올 수 있다. 그럼 또 Tv, Audio에 대한 buy메서드를 작성해주어야한다.
하지만 Product 타입으로 정의하면 매개변수로 Product의 자손 타입의 참조변수가 들어올 수 있기 때문에 하나의 메서드로 간단히 처리할 수 있다.
여러 종류의 객체를 하나의 배열로 다루기
부모 타입의 배열을 사용하면 여러 자식 객체를 하나로 묶어 사용할 수가 있다. 여러 종류의 객체를 하나의 배열로 묶을 수 있다는 소리다.
구입한 제품을 담기 위해 Buyer에 Product 배열인 cart을 작성하였다. 구입을 하면 제품이 배열 cart에 저장된다.
제품 클래스의 조상인 Product 타입의 배열을 사용함으로써 여러 종류의 제품들(Product의 자손들)을 하나의 배열로 관리할 수 있다.
'Java' 카테고리의 다른 글
[Java] 추상화 (feat. 추상 클래스) (0) | 2022.10.15 |
---|---|
[Java] 캡슐화 (0) | 2022.10.11 |
[Java] 인터페이스 (0) | 2022.09.24 |
[Java] Eclipse 한글 깨짐 해결하기 (0) | 2022.06.09 |
댓글