여러 가지 형태를 가질 수 있는 능력
부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 함
class Tv{
boolean power;
int channel;
void power() { power = !power; }
void channelUp() { ++channel; }
void channelDown(){ --channel; }
}
class CaptionTv extends TV{
String text;
void caption(){
...
}
}
//main
Tv t = new CaptionTv(); //부모타입의 참조변수로 자식인스턴스 참조
Tv 타입의 참조변수로는 CaptionTv 인스턴스 중 Tv 클래스(상속받은 멤버 포함)의 멤버들만 사용 가능, 즉 text와 caption()은 사용 x
<aside>
🚫 CaptionTv c = new Tv(); → 불가능!! (자식타입으로 부모인스턴스 참조x)
</aside>
자식타입 → 부모타입 (Up-Casting) : 형변환 생략가능
부모타입 → 자식타입 (Down-Casting) : 형변환 생략불가
class Car{
String color;
int door;
void drive(){
System.out.println("drive, Brrrr~");
}
void stop(){
System.out.println("stop!!!");
}
}
class FireEngine extends Car{
void water(){
System.out.println("water!!!")
}
}
class Ambulance extends Car{
void siren(){
System.out.println("siren~~~");
}
}
FireEngine f;
Ambulance a;
// 상속관계가 아닌 클래스 간 형변환 불가
~~a = (Ambulance)f;~~
~~f = (FireEngine)a;~~
Car car = null;
FireEngine fe = new FireEngine();
FireEngine fe2 = null;
car = fe; //업캐스팅 (형변환 생략)
fe2 = (FireEngine)car; //다운캐스팅
주로 조건문에서 사용하며 참조변수가 참조하고 있는 인스턴스의 실제 타입 알기 위해 사용
<aside> 💡 형식 → 참조변수instanceof타입(클래스명)
연산결과 → true / false
true일 경우: 참조변수가 검사한 타입으로 형변환 가능하다는 것
</aside>
void doWork(Car c){
if(c instanceof FireEngine){
FireEngine fe = (FireEngine)c;
fe.water();
//...
}else if (c instanceof Ambulance){
Ambulance a = (Ambulance)c;
a.siren();
//...
}
//...
}