ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] Null Safety
    Kotlin 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

    'Kotlin' 카테고리의 다른 글

    [Kotlin] Data Class  (0) 2020.04.28
    [Kotlin]FoldRight && Fold  (0) 2019.12.27
    [Kotlin] Reference and Reflection  (0) 2019.10.22
    Kotlin in Action - Lamda  (0) 2019.09.24
    [Kotlin]Basic Types  (0) 2018.09.21

    댓글

Designed by Tistory.