[Kotlin] Null Safety
Kotlin의 매력 중 하나인 Null Safety에 대하여 정리해보자.
■ ?
Null을 값을 가능케 하는 Null Safety이다.
fun testNull(){
val nullableString : String? = null //널 허용
val notNullabeString : String = null //널 허용불가.
}
nullableString 변수는 String Type뒤에? 가 붙으면서 null 이 가능하다.
nonNullableString 변수는 기존 자바 String이 같이 null이 불가능하다.
■ ?:
Null 값을 대신할 수 있는 Elvis Operator 이다.
fun main(){
val hi = "hi"
val num = 12345
val elivis_String : String? = if(hi!=null)"notnull" else "null"
val elvis_Int : Int? = if(num!=null) num.plus(5) else -1
val elvis_short = elivis_String?:null
}
Elvis Operator는 null 이 아닐 때의 값과 null 일 때 반환 값을 정해 놓을 수 있다.
elvis_String을 보면 null이 아니면 "notnull" 아니면 "null"을 표현하는 것처럼
(! null 일 때의 처리 )?: (null일 때의 처리)라고 생각하면 이해하기 쉬울 것이다.
■ ?.
Null 값 확인과 처리를 한 번에 할 수 있다.
elvis_short?.let {
print("I'm not null")
}?: run {
print("I'm null")
}
?. let { } // 괄호 람다 안 표현식은 elivis_short가 null이 아닐 때 호출된다.
?: run { }// 괄호 람다 안 표현식은 elvis_short가 null 이면 "I'm null"을 호출할 것이다.
여담으로 코틀린에서는 자동적으로 notnull인지 체크하는 부분이 STL로 구현되어있다.
checkNotNull(elvis_short)
■ !!
널을 허용하지 않는다.
val str : String? = "Null expression is possible"
val lenth = str!!.length
str은 nullable이 가능한 변수다.
그런데 length라는 변수는 str이 날이 아닐 때만 length를 나타내 주겠다는 의미이다.
이 경우 만약 str이 널 값이 오게 될 경우 NullPointException이 나올 수 있다.
그렇기에!!(널값 허용 x) 비 널값 중첩을 사용할 때는 이점을 주의해야 한다.