티스토리 뷰

반응형
package prj190709_1;

class Car{
	String color;
	int door;
	
	void drive() {
		System.out.println("dirve");
	}
	
	void stop() {
		System.out.println("stop");
	}
}

class FireEngine extends Car{
	void water() {
		System.out.println("FireEngine water");
	}
}

class Ambulance extends Car{
	void siren() {
		System.out.println("siren");
	}
}




public class PolymorphTest {

	public static void main(String[] args) {
		
		Car car = null;
		FireEngine  fe = new FireEngine();
		FireEngine fe2 = null;
		Ambulance am = new Ambulance();
		method(am);//method로 넘겨서 확인
//      Object obj = (Object)am; (자동 업캐스팅되어서 변환되어 들어감.
		
//		fe.water();
//		car = fe;//car = (Car)fe; 생략(업캐스팅)
		//Car 조상클래스가 FireEngine인 차일드 클래스 주소값을 담을 수 있다. 
		//car.water(); 는 오류가 나는데, 업캐스팅 했어도 자식 클래스의 메소드, 변수 사용 불가.
		//참조변수의 형변환은 참조변수의 타입만을 변경할 뿐 변수의 값이나 인스턴스에는 아무런 영향을 주지 않는다 
//		fe2 = (FireEngine)car;//(다운캐스팅)
//		fe2.water();
			
//		if(fe  instanceof FireEngine) System.out.println("FireEngine instance");
//		if(fe instanceof Car) System.out.println("car");
//		if(fe instanceof Object) System.out.println("object");
	}
//////////////////////만약 부모타입이 자식타입으로 참조변수, 참조할수 없다면 Object obj가 아니라 
////Car car, FireEngine, Ambulance 자식 개체마다 오버로딩하여
//// 메소드가 늘어날것.
//부모타입은 자손거 다 받아야함. 
	
	static void method(Object obj) {//fe가 들어오는데 fe는 fe>car>object를 상속 받고 있어서 obj 이기도 하다. 
		if(obj instanceof Car) { //obj는 car를 상속받았으므로 조건 달성
			Car c = (Car)obj; // obj(fe)를 다시 car로 다운캐스팅
			c.drive(); //c.drive실행
		}
		if (obj instanceof FireEngine) {//obj는 fe 이기 때문에 조건 달성
			FireEngine fe = (FireEngine )obj; 
			fe.water();
		}
		if(obj instanceof Ambulance) {
			Ambulance am = (Ambulance) obj;
			am.siren();
		}
	}
}
반응형