App노자

[Kotlin] Null safety 본문

Android/Kotlin

[Kotlin] Null safety

앱의노예 2023. 1. 25. 17:21

1. return문


fun main() {
    var sTemp : String = null
    
//    Null can not be a value of a non-null type String
}

 

코틀린의 가장 큰 특징 중 하나는 Null safety라고 생각한다

타입 시스템이 null이 허용 가능한 참조와 허용 불가능한 참조를 구분한다.

일반적인 String, int형 null을 참조할 수 없으며 실제로 코드를 작성하면 위에 같은 오류 메시지가 나타난다

https://kotlinlang.org/docs/null-safety.html

 

Null safety | Kotlin

 

kotlinlang.org

 

fun main() {
     var nullable : String? = null
}

 

변수에 null을 허용하려면 자료형 뒤에 ? 를 작성해야 한다

둘은 서로 다른 자료형이며  ?가 붙으면 nullable타입이 된다 Swift의 Optional(옵셔널) 타입과 유사하다

 

fun main() {
    var nullable : String? = null
    print(nullable.length)
    
//    Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
}

 

nullable타입에 접근을 하려고 NPE(NullPointerException) 관련 오류가 발생한다

별도의 처리를 해야 사용이 가능하다

 

fun main() {
    var nullable : String? = null
    var sTemp : String = "String"
    sTemp = nullable!!
    print(nullable!!.length)
}

 

non-null 단정기호 !!를 사용한 방법이다 

null이 아니라고 선언을 해서 컴파일러가 null검사를 무시하지만 실행 중에 NPE가 발생한다

그리 좋은 방법은 아니라고 생각한다

 

fun main() {
    var nullable : String? = null
    var check = if(nullable != null) nullable.length else -1
    print(check)
}


fun main() { 
    var nullable : String? = null
    var check : String = "Test"

    if (nullable != null && nullable.length > 0) {
        check = nullable
        print(check)
    } else {
        print("Empty string")
    }
}

 

조건문을 활용해 null인지 아닌지 판단하고 그거에 맞는 처리를 하는 방식이다

null 상태를 검사하면 오류가 발생하지 않는다

 

fun main() {
    var nullable : String? = null
    var check = nullable?.length ?: -1
    
//    null이면 ?: 를 실행, null이 아니면 ?.를 실행한다

    println(check)
    println(nullable?.length)
    
//    세이프콜( ?. ): 객체의 메서드를 호출할 때 멤버 연산자 앞에 "?"를 붙여 사용한다
//    값이 null이면 오류를 발생시키지 않고 그냥 null을 출력하고 다음 작업을 수행한다

    println(nullable?:"Test")
    
//    엘비스 연산자( ?: ): 값이 존재할 때는 반환하지만 그렇지 않을 때는 뒤에 지정한 값을 반환한다
}

 

마지막 코드는 세이프콜과 엘비스 연산자를 사용하는 함께 사용하는 방법이다

null인 경우 엘비스 연산자에 의해 -1로 값을 대체하여 null을 대비할 수 있다

 

 

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

[Kotlin] 흐름 제어문과 예외 처리문  (0) 2023.04.08
[Kotlin] 조건문과 반복문  (0) 2023.04.02
[Kotlin] 고차함수와 람다식  (0) 2023.02.14
[Kotlin] 함수  (0) 2023.01.27
[Kotlin] 변수와 자료형  (0) 2023.01.24