더북(TheBook)

4.1.6 캐스트


앞에서 어떤 원리에 따라 Employee 타입 변수 emplEmployee, Manager, Employee의 또 다른 서브클래스의 객체를 참조할 수 있는지 살펴보았다. 이 방법은 여러 클래스의 객체를 다루는 코드에서 유용하다. 그런데 단점이 딱 하나 있다. 바로 슈퍼클래스에 있는 메서드만 호출할 수 있다는 점이다. 다음 코드를 보자.

Employee empl = new Manager(...);

empl.setBonus(10000); // 컴파일 시간 오류


이 호출은 설령 실행 시간에 성공한다고 해도 명백한 컴파일 시간 오류다. 컴파일러는 코드에서 수신한 타입의 메서드만 호출하는지 검사할 뿐이다. 여기서 emplEmployee 타입이고, 이 클래스에는 setBonus 메서드가 없다.

인터페이스와 마찬가지로 instanceof 연산자와 캐스트로 슈퍼클래스 참조를 서브클래스로 변환할 수 있다.

if (empl instanceof Manager) {

    Manager mgr = (Manager) empl;

    mgr.setBonus(10000);

}

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.