3.1.4 캐스트와 instanceof 연산자
가끔 반대로 변환(슈퍼타입 → 서브타입)해야 할 때도 있다. 이때는 캐스트(cast)(강제 변환)를 사용해야 한다. 예를 들어 IntSequence 변수에 저장된 객체가 실제로는 DigitSequence라는 사실을 안다면 다음과 같이 타입을 변환할 수 있다.
IntSequence sequence = ...;
DigitSequence digits = (DigitSequence) sequence;
System.out.println(digits.rest());
이 코드에서 rest()는 IntSequence의 메서드가 아니라 DigitSequence의 메서드이므로 캐스트가 필요하다. 이보다 더 흥미로운 예제를 연습문제 2에 소개했으니 참고하자.
객체는 실제 클래스나 그 슈퍼타입으로만 캐스트할 수 있다. 잘못 캐스트하면 컴파일 시간 오류나 클래스 캐스트 예외(ClassCastException)가 일어난다.
String digitString = (String) sequence;
// 작동이 불가능하다. IntSequence는 String의 슈퍼타입이 아니다.
RandomSequence randoms = (RandomSequence) sequence;
// 작동 가능성이 있지만, 불가능하면 클래스 캐스트 예외를 던진다.