JAVA

JAVA instanceof 연산자

짱코딩러 2022. 7. 18. 21:19

참조변수의 형변환

class Car{}
class FireEngine extends Car{}

Car car = null;
FireEngine fe = new FireEngine();
car = (Car)fe;                     //참조변수 fe의 주소를 참조변수 car에 복사!

FireEngine fe2 = null;
fe2 = (FireEngine)car;             //참조변수 car의 주소를 참조변수 fe2에 복사!

 

참조변수의 형변환 전에 반드시 instanceof로 확인해야 함.

조상의 리모콘으로 자손을 조종할 수 있음.

자손의 리모콘으로는 조상을 조종할 수 없음.(조상에게 없는 기능을 호출하려 할 수 있기 때문에.)

 

Q1.참조변수는 왜 형변환 하나요?

A. 참조변수(리모콘)을 변경함으로써 사용할 수 있는 멤버의 갯수를 조절하기 위해서.

 

Q2.intstanceof연산자는 언제 사용하나요?

A.참조변수를 형변환 하기 전에 형변환 가능여부를 확인할 때

 

A instanceof B  = A가 가리키는 객체가 B가 맞아? or B의 자손이야?

   =>true/false

 

 

void doWork(Car c) {	//참조변수에는 다형성에 의해 Car또는 Car의 모든 자손이 들어올 수 있음.
	if(c instanceof FireEngine) {	
    	FireEngine fe = (FireEngine)c; //형제관계면 형변환 할 수 없기때문에 만약 Ambulance가 들어와 있으면 형변환 불가능.
        fe.water();
   		...
        
//(Car c)에 (new Car()) 또는 (new FireEngine()) 또는 (new Ambulance()) 모두 들어올 수 있다.

 

FireEngine fe = new FireEngine();
System.out.println(fe instanceod Object);		//true
System.out.println(fe instanceod Car);			//true
System.out.println(fe instanceod FireEngine);   //true

//=>자기자신과, 조상들에 대해서는 true가 나옴.(형변환 가능)

 

예제

public class Ex7_18 {
	public static void action(Robot r){
		if(r instanceof DanceRobot) {		//Robot의 리모콘이 DanceRobot을 조작해도 되나요?
			DanceRobot dr = (DanceRobot)r;	//true라면, r을 DanceRobot의 리모콘으로 만들어줘
			dr.dance();						//그리고! dance() 불러와.
		}else if(r instanceof SingRobot) {	//Robot의 참조변수가 SingRobot을 참조해도 되나요?
			SingRobot sr = (SingRobot)r;	//true라면, sr을 r로 형변환해줘.
			sr.sing();
		}else if(r instanceof DrawRobot) {
			DrawRobot dr = (DrawRobot)r;
			dr.draw();
		}
	}
//	action메서드의 매개변수가 Robot타입이므로 Robot클래스의 자손 클래스 인스턴스는 모두 매개변수로 가능하다.

	public static void main(String[] args) {
		Robot[] arr = {new DanceRobot(), new SingRobot(), new DrawRobot()};
		
		for(int i=0; i<arr.length; i++)
			action(arr[i]);
	}
}

class Robot{}

class DanceRobot extends Robot{
	void dance() {
		System.out.println("춤을 춥니다.");
	}
}

class SingRobot extends Robot{
	void sing() {
		System.out.println("노래를 합니다.");
	}
}

class DrawRobot extends Robot{
	void draw() {
		System.out.println("그림을 그립니다.");
	}
}