본문 바로가기

JAVA의 정석

(객체part2 ) 6. instanceof 연산자

instanceof 

 

- 참조변수의 형변환 가능 여부 확인을 위해 사용하며, 가능하면 true를 반환한다.

 

- 형변환전에 반드시 instanceof확인을 하고 형변환 해야한다.

 

static void doWork(Car c) {  // 파라미터로 new Car(), new FireEngine(), new Ambulance 전부 들어갈 수 있음. (

if( c instanceof FireEngine) {

FireEngine fe = (FireEngine) c;

fe.water();

 

}

 

위 메서드처럼 , 파라미터에는 Car의 모든 계층이 들어갈 수 있다. Car의 조상인 Object 부터 그의 자손인 ambulance, fireengine까지

 

그렇다는 말은 즉 if문 안 에서 형변환을 하려고 할 때, FireEngine 에 계층도에 형변환이 가능한 클래스가 있어야 한다는 말인데,

 

만약 Car c 자리에 Ambulance 가 들어왔다면,  형변환이 불가능하니 당연히 실행되지 않을 것이다. 

 

그렇다면 new Car () , 객체를 만든다면 FireEngine 의 부모 클래스이니 조건문은 true로 반환될 것이다.

 

과연 fe.water 은 실행될까 ??

 

 

정답은 실행되지 않는다.

 

왜냐하면 우선 new Car() 이라는 객체는 water라는 메서드를 갖고 있지 않다. 그렇기 때문에 참조면수 FireEngine이 형변환된 c의 리모

 

콘을 복사하여 주소를 갖고 있는다고 하여도 , 메서드가 실행되지 않는 것이다.  FireEngine을 파라미터 그대로 받아서 메서드를 실행하면 

 

아래 화면처럼 정상적으로 출력되는 것을 확인할 수 있다.