instanceof 연산자
instanceof 연산자
- 참조변수의 형변환 가능여부 확인헤 사용. 가능하면 true 반환
- 형변환 전에 반드시 instanceof로 확인해야 함
instanceof연산자는 형변환이 가능한지 확인하는대에 사용한다. 형변환이 가능하면 true를 반환한다.
형변환을 하기전에는 반드시 instanceof 연산자로 확인하고 형변환을 해야한다.
예를 들어서 이러한 코드가 있다고 가정해보자.
참조변수 c의 타입은 Car이다. 참조변수 c에 들어올 수 있는것은
- new Car();
- new FireEngine();
- new Ambulance();가 가능하다.
즉, Car타입의 참조변수에는 c는 Car 또는 Car의 모든 자손이 들어올 수 있다.
그런데, 위의 메서드에서는 이 셋중에 어떤 것이 c에 들어올지 아직 모른다.
그런데 뭐가 들어올 지 모르는데 FireEngine으로 형변환을 할 수 있을까?
만약에 Ambulance객체가 들어오면 그것을 FireEngine으로 형변환을 할 수 있을까?
Ambulance와 FireEngine은 서로 부모 자손관계가 아니기 때문에 할 수 없다.
그래서 메서드에는 형변환을 하기 전에 입력으로 들어온 것이 특정형으로 형변환이 가능한지 확인해 주어야 한다.
이때, 참조변수의 형변환 가능 여부를 확인하기 위해 사용하는 연산자가 instanceof연산자 이다.
예제에서는 c가 가리키는 객체가 넘어온 것이 FireEngine인지, 혹은 FireEngine의 자손인지 instanceof로 확인한다.
FireEngine객체가 넘어오면, true를 반환 할 것이다. 그떄는 안심하고 형변환을 할 수 있다.
else if문을 이용해서 추가적으로 확인을 해줄 수도 있다.
한가지 더 생각해 보면,
Object는 클래스의 최고조상이고,
그 자손으로 Car,
그리고 Car의 자손으로 FireEngine이 있을 때,
fe가 FireEngine객체를 가리키고 있다면,
fe가 가리키는 객체가 Object냐고 확인해도 true,
fe가 가리키는 객체가 Car냐고 확인해도 true,
fe가 가리키는 객체가 FireEngine인지 확인해도 true이다.
true를 반환 받으면, 해당 타입으로 참조변수의 형반환이 가능하다는 것이다.
왜냐하면, instanceof로 확인을 하면, 해당 참조변수가 가리키고 있는 객체의 조상과의 비교또한 true로 반환한다.
즉, 상속계층도에서 자신의 조상들에 대해서는 전부 true를 반환받는다.
하지만, 위의 예시를 기준으로, 해당 참조변수 fe가 가리키는 객체는 FireEngine객체이지, Object객체 또는 Car객체가 아니다.
이점을 주의해야 한다.
FireEngine타입의 참조변수 fe를 조상인 object로 형변환 할 수 있다.
왜냐하면 instanceof가 참이기 때문이다. 물론, object는 모든 클래스의 최고 조상이기 떄문에 이것은 항상 가능하다.
위에서 fe instanceof Car에서 true를 반환받았으므로, Car c = (Car)fe;의 경우도 fe를 Car타입으로 형변환을 할 수 있다.
instanceof 연산자 정리
Q. 참조변수의 형변환은 왜 하나요?
A. 참조변수(리모콘)을 변경함으로써 사용할 수 있는 멤버의 갯수를 조절하기 위해서
FireEngine객체를 가리키는 FireEngine타입의 참조변수 f가 있는데,
f로는 FireEngine객체의 모든 멤버(5개)를 사용할 수 있다.
이때 만약, 멤버를 4개만 사용하고 싶다면,
Car c = (Car)f; 를 이용해서, 참조변수의 형변환으로
4개의 멤버만 사용할 수 있는 Car타입의 참조변수로 바꿔줄 수 있다.
이때, 실제 객체는 그대로고, 참조변수가 사용할 수 있는 멤버수만 조절되는 것이다.
instanceof 연산자는 언제 사용하나요?
A. 참조변수를 형변환하기 전에 형변환 가능여부를 확인할 때
예를 들어서, 이런 코드가 있을 때,
형변환 하기전에, instanceof코드로 확인을 해야한다.
그래서 그 결과가 ture가 나와야 형변환이 가능하다.