티스토리 뷰

다형성(Polymorphism)

: 부모 클래스의 참조변수로 자식 클래스의 객체를 다룰 수 있는 성질   (역은 성립하지 X !!)

 

 

상속관계 간의 형변환만 가능하다.

 

자손타입 -> 부모타입 형변환 (UpCasting) : 자동 형변환 (암묵적 형변환)

부모타입 -> 자손타입 형변환 (DownCasting) : 강제 형변환 (명시적 형변환)

 

ex)

public class Example {
	public static void main(String[] args) {
    	Fruit fr = new Fruit();
        Kiwi ki = new Kiwi();
        
        fr = ki;		 // 자동 형변환
        ki = (Kiwi)fr;	 // 강제 형변환
        
        
        fr = null;
        ki = (Kiwi)fr;	// ki는 null을 가리킴
        ki.answer();	// 작성 시 오류나지 않지만 컴파일 시 오류 발생
    }
}


class Fruit {
	public void question() {
    	System.out.println("나는 누구일까요?");
    }
}

class Kiwi extends Fruit {	// Fruit 클래스를 상속
	public void answer() {
    	System.out.println("키위입니다!");
    }
}

 

 

심화) 자식으로 부모 가리키기

class Car {
	public void drive() {
		System.out.println("운전합니다");
	}
}

class Truck extends Car {	// Car 클래스를 상속

}


public class Polymorphism {
	public static void main(String[] args) {
        Car car1 = new Car();
        Truck truck1 = null;
        
        truck1 = (Truck)car1;	// 부모->자식으로 형 변환
        truck1.drive();		// 컴파일 시 오류 발생
        
        
        Car car2 = new Truck();
        Truck truck2 = null;
        
        truck2 = (Truck)car2;	// 부모->자식으로 형 변환
        truck2.drive();		// 정상적으로 컴파일
    }
}

truck1 = (Truck)car1; 에서

car1는 Car형 인스턴스이므로 자손 타입으로 부모 타입 인스턴스를 참조할 수 없기 때문에 에러가 발생한다.

truck2 = (Truck)car2; 에서

car2는 Truck형 인스턴스이므로 참조가 가능하다.

 

 


 

[instanceof 연산자]

사용 : '참조변수 instanceof 클래스명'  =>  true/false를 반환

(클래스명에 조상클래스도 포함이 된다!)

 

ex)

public class instanceofEx {
	public static void main(String[] args) {
		Truck tr = new Truck();
		
		if(tr instanceof Truck) {
			System.out.println("Truck Type");
		}
		if(tr instanceof Car) {
			System.out.println("Car Type");
		}
		if(tr instanceof Object) {
			System.out.println("Object Type");
		}
	}
}

출력 결과 >

Truck Type

Car Type

Object Type

 

Car 클래스를 상속받는 Truck 클래스의 객체 tr에 대해 instanceof 연산자를 적용했을 때

tr은 Truck 타입, Car 타입, 그리고 최상위 클래스인 Object 타입인 것을 확인할 수 있다.

 

 

반응형

댓글