본문 바로가기

Study/Kotlin Study

[Kotlin] NULL: Safe - call, Non - null, 엘비스 연산자

코틀린의 변수 선언은 기본적으로 null을 허용하지 않는다. (NotNull)

fun main() {
    var a: Int = 30
    a = null # 오류 발생!
}

 

따라서 '?'를 이용하여 null이 가능한 선언을 할 수 있다. (Nullable)

fun main() {
    var a: Int? = 30
    a = null
}

여기서 Int?는 Int와는 전혀 다른 종류의 자료형이다.


null을 허용한 타입으로 str1 문자열을 선언하고, 문자열 길이를 반환하는 length함수를 그냥 호출하면 오류가 발생한다.

fun main() {
    var str1: String? = "Hello Kotlin"
    println("str1: $str1 length: ${str1.length}")
}

 

String? 타입을 null을 허용하지 않는 String타입으로 바꾸거나

fun main() {
    var str1: String = "Hello Kotlin"
    println("str1: $str1 length: ${str1.length}")
}

 

!!.을 사용하여 해당 변수가 null이 아님을 컴파일과정에서 단정지어주어야한다.

fun main() {
    var str1: String? = "Hello Kotlin"
    println("str1: $str1 length: ${str1!!.length}")
}

 

그러나 !!.을 사용하여 단정지었지만 변수에 null값이 들어가 버린 경우 NPE가 발생한다.

+ NPE(NullPointerException): 사용할 수 없는 null인 변수에 접근하면서 발생하는 예외

fun main() {
    var str1: String? = "Hello Kotlin"
    str1 = null
    println("str1: $str1 length: ${str1!!.length}")
}

 

따라서 실제로 null값이 변수에 들어갈 수 있는 상황이라면 !!.을 지양하고 세이프콜(Safe-call) ?.을 사용하여 str1이 null값일 경우 null을 반환하도록 해야한다.

fun main() {
    var str1: String? = "Hello Kotlin"
    str1 = null
    println("str1: $str1 length: ${str1?.length}")
}

조건문으로 null 값을 허용한 변수를 통해 함수를 사용할 수 있다.

fun main() {
    var str1: String? = "Hello Kotlin"
    str1 = null

    val len = if (str1 != null) str1.length else -1
    println("str1: $str1 length: ${len}") // str1: null length: -1
}

 

세이프 콜과 엘비스 연산자 ?:를 이용하여 더 간단하게 null을 허용할 수 있다.

fun main() {
    var str1: String? = "Hello Kotlin"
    str1 = null
    println("str1: $str1 length: ${str1?.length ?: -1}") // str1: null length: -1
}

 

'Study > Kotlin Study' 카테고리의 다른 글

[Kotlin] 증가 감소 연산자  (1) 2023.08.20
[Kotlin] Smart Cast  (0) 2023.08.19
[Kotlin] 자료형 변환  (0) 2023.08.18
[Kotlin] 기본형 VS 참조형  (0) 2023.08.18
[Kotlin] == VS ===  (0) 2023.08.18