기본형 변수의 형변환 처럼 참조변수도 형변환이 가능하다. 단, 서로 상속관계에 있는 클래스 사이에서만 가능하기에 자손타입 참조변수 - 부모타입 참조변수 이 둘사이만 형변환이 가능하다.
조상의 조상으로도 형변환이 가능하기에 모든 참조변수는 Object클래스로 형변환이 가능하다.
class Parent {}
class Child1 extends Parent {}
class Child2 extends Parent {}
위와같이 클래스들이 있다면 Child1 - Parent - Child2 이렇게 -로 연결된 타입끼리는 형변환이 가능하다.
Child1 - Child2 는 형변환이 불가능한 것이다.
서로 상속관계에 있는 타입간의 형변환은 양방향으로 자유롭게 수행될 수 있으나, 참조 변수가 가리키는 인스턴스의 자손타입으로의 형변환은 허용되지 않는다.
그래서 참조변수가 가리키는 인스턴스의 타입이 무엇인지 먼저 확인하는 것이 중요하다.
참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다.
주로 조건문에 사용되며, instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치한다.
instanceof의 결과가 true라는 것은 참조변수가 검사한 타입으로의 형변환이 가능하다는 것이다.
void dowork(Parent p) {
if(p instanceof Child1) {
Child1 c1 = (Child1)p
...
}
}
위 코드에서 Parent p의 라는 매개변수의 타입은 Parent이지만 인스턴스로 Child1,2가 들어있을 수 있다. 이럴때 체크를 할 수있다.