코틀린은 기본적으로 null 포인터 참조 예외를 없앨 수 있도록 변수 타입의 체계가 구성되어 있습니다. 그리하여 Null 안정성(null-safety)을 지향한다고도 할 수 있습니다. 다만, 개발자의 명시적 설정에 의해 null을 설정할 수 있도록 합니다. 이것이 오늘 소개해드릴 코틀린에서의 느낌표 두 개의 정체입니다.
우선 null과 관련하여 간단하게 물음표 연산자에 알아본 다음, 느낌표 두 개 연산자에 알아보도록 합시다.
nullable reference의 구별
코틀린은 nullable reference와 non-null reference의 구별이 있습니다. 예를 들면 String 타입은 non-null 참조 타입입니다. String에 null을 할당하면 다음과 같이 오류가 발생합니다. (Null can not be a value of a non-null type String)
var s: String = "bs"
//Null can not be a value of a non-null type String
s = null
non-null 참조에 nullable를 설정하려면 다음과 같이 물음표 연산자를 추가할 수 있습니다.
var s: String? = "bs"
//OK
s = null
세이프 콜(Safe call)
nullable 참조로 할당한 변수에 대해 세이프 콜을 할 수 있습니다. null인 경우 null 반환, null이 아닌 경우 해당 참조를 진행합니다.
var s: String? = null
//null을 반환합니다.
s = null
println(s?.length)
//length를 반환합니다.
s = "bs"
println(s?.length)
Safe call chain을 통해 null인 경우를 고려하여 체인도 가능합니다. 예를 들면 내(i)가 속한 부서(dept)의 장 이름(head name)을 가져오는 간단한 세이프티 콜 체인은 다음과 같습니다.
i?.dept?.head?.name
느낌표 두 개(!!)
오늘의 주제인 코틀린의 느낌표 두 개 연산자입니다. 지금까지 null에 대해 반복하여 알려드린 것이 결국 이 연산자가 null가 관련이 깊은 까닭입니다. !! 연산자는 the not-null assertion operator라고 읽는데, 저는 보통 더블 엑스클러메이션 마크(double exclamation mark)라고 읽는 편입니다. assertion은 주장, 확언, 단언 등을 뜻하며 한글로 풀어보자면 느낌표 2개 연산자는 not-null을 주장하는 연산자라 할 수 있습니다.
아까 코틀린에서 nullable과 non-nullable의 구분에 대해 안내해드렸었는데요, 느낌표 두 개 연산자는 어떠한 값이든 non-null 타입으로 변환하고, null인 경우 NullPointerException이 발생한답니다.