[Kotlin] as?와 as

toto9602·2024년 11월 16일

최근 코틀린을 처음 사용하는 나날들을 보내면서, 우당탕탕 코틀린을 익혀나가고 있습니다!😅

얼마 전, 외부 API의 응답을 받아오기 위해 작성한 코드에서 아래와 같은 경고를 만났었습니다.

참고 자료

코틀린 공식 문서. Type checks and Casts

작성했던 타입 캐스팅 코드

data class Response(
  val content:Map<String, Any>,
) {
  val property = content.get("property") as String?
}

detekt에서 만난 경고

Use the safe cast ('as? String') instead of 'as String?'. [CastToNullableType]

as String? 대신에 as? String 을 사용해서 캐스팅하라는 내용이었고,,
당시의 저는 '도대체 뭐가 다른 것일까...' 라는 생각을..

그래서, 뭐가 달랐던 것일까

as : Unsafe Cast Operator

as는, 타입 캐스팅이 불가능할 경우 컴파일러가 예외를 던진다!

= 위 코드에서, property를 조회한 결과가 null이었고, as String으로 캐스팅했다면
해당 타입으로 캐스팅할 수 없으므로 예외가 발생하는 것.

그렇기에, Unsafe Cast Operator라고 한다!

as? : Safe (nullable) cast operator

→ 위에서 말한 예외를 피하고 싶을 때 쓸 수 있는, Safe cast operator!
→ 캐스팅 실패시, 예외를 던지는 대신 null을 반환한다!

다만, 아래와 같은 캐스팅에서는 as? String으로 캐스팅하면 실제 값은 nullable인 상태!

val x: String? = y as? String

마무리

코틀린을 처음 조금씩 찾아볼 때, 코틀린과 자바의 가장 큰 차이점 중 하나로 null 안정성을 많이 들었었는데, 새삼 코틀린은 nullable 처리에 대해 신경을 많이 쓴 느낌..?이었습니다..!

우당탕탕 코틀린 지식 오늘도 +1... 😅

profile
주니어 백엔드 개발자입니다! 조용한 시간에 읽고 쓰는 것을 좋아합니다 :)

0개의 댓글