본문 바로가기
Kotlin

[깡샘의 코틀린 프로그래밍] 정리 9 - nullable 객체의 캐스팅 as?

by 들풀민들레 2018. 3. 2.

본 글은 [깡샘의 코틀린 프로그래밍 - 루비페이퍼] 의 내용을 발췌한 것입니다.

좀더 자세한 내용은 책을 통해 확인해 주세요.

 

 

 

9장. 상속

 

9.4.3. null 허용 객체의 캐스팅 as?

 

이번에는 null 허용 객체의 캐스팅입니다. null 허용 객체에는 null이 대입될 수 있어서 as를 이용해 캐스팅할 때 주의해야 합니다.

 

01 val obj7: Super? = Sub1()

02 val obj8: Sub1 = obj7 as Sub1

 

01번 줄에서 하위 타입의 객체가 상위 타입으로 스마트 캐스팅 됐고, 다시 02번 줄에서 as를 이용해 상위 타입으로 캐스팅했습니다. 이미 살펴보았듯이 '하위 타입 → 상위 타입 →하위 타입'으로 캐스팅하는 예이므로 별문제 없이 잘 수행됩니다. 그런데 문제는 01번 줄의 obj7이 ?에 의해 null 허용으로 선언됐다는 점입니다. 위의 소스에는 문제가 없지만 null 허용 객체는 언제든 null 대입이 가능합니다

 

01 val obj7: Super? = null

02 val obj8: Sub1 = obj7 as Sub1 //런타임 에러

 

위의 소스는 01번 줄에서 강제로 obj7에 null을 대입했습니다. 이처럼 null이 대입된 객체를 대상으로 02번 줄처럼 as를 이용해 캐스팅하면 런타임 에러가 발생합니다. null을 캐스팅할 수는 없기 때문입니다. 이럴 때는 as?를 사용합니다. as?를 사용하면 null 허용 객체에 정상적인 객체가 대입되면 정상적으로 캐스팅하고, null이 대입되면 null을 반환합니다.

 

01 val obj7: Super? = null

02 val obj8: Sub1? = obj7 as? Sub1

 

as?는 캐스팅 대상이 정상적인 객체이면 캐스팅을 진행하고, null이 대입되어 있으면 캐스팅을 진행하지 않고 null을 반환합니다. 그러므로 위의 예처럼 null 허용으로 선언된 객체를 캐스팅할 때 이용하면 null에 안전한 캐스팅을 구현할 수 있습니다. 물론 as?에 의한 캐스팅 결과가 null이 나올수 있으므로 02번 줄처럼 캐스팅 결과를 받는 객체(obj8)도 null 허용으로로 선언해야 합니다.