Kotlin

[Kotlin] Null Safety

onemask 2019. 5. 31. 01:12

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) 비 널값 중첩을 사용할 때는 이점을 주의해야 한다. 

 

 

LIST