더북(TheBook)

2.12 스마트 캐스트

자바에서는 참조를 다른 타입으로 강제 타입 변환(cast)해야 할 때가 가끔 있다. 참조 대상 객체가 지정한 타입으로 변환이 불가능한 타입의 객체라면 ClassCastException이 발생한다. 따라서 항상 instanceof 연산자로 먼저 타입 변환이 가능한지 검사해야 한다.

Object payload = message.getPayload();
int length = -1;

if (payload intanceof String) {
    String stringPayload = (String) payload;
    length = stringPayload.length();
}

이 코드는 지저분하다. 진짜 객체 지향 프로그래밍에서는 객체의 타입을 검사해 강제로 타입을 변환하는 것을 나쁜 습관으로 간주하는 경우가 많다.7 아마도 그래서 강제 타입 변환을 쓰기 쉽게 만들려는 노력이 거의 이뤄지지 않는지도 모르겠다. 하지만 코틀린에는 스마트 캐스트(smart cast)라는 특별한 기법이 있다. 앞의 코드를 스마트 캐스트를 사용해 다시 작성하면 다음과 같다.

val payload: Any = message.payload

val length: Int = if (payload is String)
    payload.length

else
    -1

 

 


7 역주 객체 지향의 기본 원리 중 하나는 상속 관계를 잘 설계하고 실행 시점에는 동적 디스패치(dynamic dispatch)를 통해 적절한 객체의 메서드를 자동으로 호출하는 것이다. 타입을 검사하고 강제 타입 변환을 한다는 것은 설계 과정에서 객체 지향을 제대로 사용하지 못했기 때문일 가능성이 크다. 따라서 타입을 검사하고 강제로 변환하는 식의 코딩을 권장하지 않는다.

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