본문 바로가기
Java의 정석/객체지향 프로그래밍 II

instanceof 연산자

by Hwanii_ 2023. 6. 6.
728x90

 

1. 참조변수가 참조하고 있는 (가리키고 있는) 인스턴스(객체) 의 실제 타입을 알아보기 위해서

instanceof 연산자를 사용.

 

2. 주로 조건문에 사용된다. 반환값이 true or false 이기 때문에.

 

3. instanceof 를 이용한 연산결과로 반환값이 true 라는 것은,

참조변수가 검사한 타입으로 형변환이 가능하다는 것을 의미.

 

 

예시)

 

void doWork(Car car) {
	if(car instanceof FireEngine) {
    	FireEngine fe = (FireEngine)car;
        fe.water();
        ..
    }
}

 

1. instanceof 연산자를 사용해서, 형변환이 가능한지 확인.

2. if문이 참이면, 형변환을 하고, water() 메서드를 호출.

 

위의 코드는 Car 타입의 참조변수 car을 매개변수로 하는 메서드.

이 doWork 라는 메서드가 호출될 때,

매개변수로 Car클래스의 인스턴스를 넘겨받거나,

또는

Car클래스의 자손클래스의 인스턴스를 넘겨받겠지만,

메서드 내부에서는 정확히 어떤 인스턴스인지 알 수가 없다.

 

그래서, instanceof 연산자로 참조변수 car가 가리키고 있는

인스턴스의 타입을 체크 한다.

체크를 했더니 true이면 형변환이 가능하다는 의미가 된다.

 

 

조상 타입의 참조변수는 자손 타입의 인스턴스를 참조하고 있다는 의미.

조상 타입의 참조변수는 본인의 멤버만 사용이 가능하기 때문에,

자손 타입의 인스턴스의 멤버를 모두 사용하고 싶으면,

조상 타입의 참조변수가 자손 타입으로 형변환 (다운 캐스팅) 을 해야 한다.

 

 

 

예시)

 

 

 

 

1. FireEngine 타입의 참조변수 f는 FireEngine 인스턴스를 참조. (자기 자신 타입의 객체)

 

2. 상위 타입으로 모두 형변환이 가능 하다. (업 캐스팅은 항상 가능 하다)

 

3. why ?

참조변수 f는 FireEngine 인스턴스를 참조 중이고,

참조변수 f를 Car 타입으로 형변환 해서 그 주소값을 Car 타입의 참조변수 c에 대입하면,

Car 타입의 참조변수 c도 FireEngine 인스턴스를 가리키게 된다.

 

4. Car 타입의 참조변수 c는 사용할 수 있는 멤버의 개수가

자손 클래스인 FireEngine 보다 무조건 적거나 같기 때문에,

FireEngine 인스턴스를 사용하는데 전혀 문제가 없기 때문이다.

 

 

테스트

 

 

 

1. 만약에 85번째줄의 if문이 참이라면,

{ } 안의 구문들이 실행 되는데,

참이 아니므로, else 문이 실행되는 모습을 볼 수 있다.

 

2. Car 타입의 참조변수 car을 FireEngine 타입으로 형변환 하고 (다운 캐스팅)

참조변수 car가 가리키는 주소값이 참조변수 test02에 대입된다.

FireEngine 타입의 참조변수 test02는 Car타입의 인스턴스를 가리키게 되서,

인스턴스가 사용할 수 있는 멤버보다 test02가 사용할 수 있는 멤버가 더 많기 때문에

에러가 뜨게 된다.

 

[ Console ]

 

반응형

'Java의 정석 > 객체지향 프로그래밍 II' 카테고리의 다른 글

추상 클래스, 추상 메서드  (0) 2023.06.10
매개변수의 다형성  (0) 2023.06.09
참조변수의 형변환  (0) 2023.06.06
다형성 (Polymorphism)  (0) 2023.06.06
캡슐화와 접근 제어자  (0) 2023.06.06