참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다. instanceof를 이용한 연산결과로 true를 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻한다.
void doWork(Car c) { if (c instanceof FireEngine) { FireEngine fe = (FireEngine)c; fe.water(); ... } else if (c instanceof Ambulance) { Ambulance a = (Ambulance) c; a.siren(); }
이 메서드가 호출될 때, 매개변수로 Car 클래스 또는 그 자손 인스턴스를 넘겨 받겠지만 메서드 내에서는 정확히 어떤 인스턴스인지 알 길이 없다. 그래서 instanceof 연산자를 이용해서 참조 변수 c가 가리키고 있는 인스턴스 타입을 체크하고, 적절히 형변환한 다음에 작업을 해야 한다.
조상타입의 참조변수로는 실제 인스턴스의 멤버들을 모두 사용할 수 없기 때문에, 실제 인스턴스와 같은 타입의 참조변수로 형변환을 해야만 인스턴스의 모든 멤버들을 사용할 수 있다.