여러 가지 형태를 가질 수 있는 능력

부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 함

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; //다운캐스팅 

instanceof 연산자


주로 조건문에서 사용하며 참조변수가 참조하고 있는 인스턴스의 실제 타입 알기 위해 사용

<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();
			//...
	}
	//...
}