ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 코틀린의 null safety
    카테고리 없음 2020. 6. 19. 22:05

    널 작업

    아무 것도 참조하지 않는 변수는 null 이라고하거나 변수가 "null"이라고 말할 수 있습니다. 파이썬의 None과 달리 null은 객체가 아닙니다. null은 프로그래밍 오류의 빈번한 원인이므로 Kotlin은 가능한 한 많은 오류를 피할 것을 권장합니다. 변수는 null을 허용하도록 선언되지 않은 한(?을 붙입니다.) 실제로는 null이 될 수 없습니다. 예를 들면 다음과 같습니다.

    fun test(a: String, b: String?) {
    }

    컴파일러는 test("a", "b") 또는 test("a", null) 을 허용하지만 test(null, "b") 나 test(null, null)는 허용하지 않습니다. 컴파일러는 a가 null이 될 수 없음을 증명할 수 있을 때 test(a, b)를 호출하는 것을 허용합니다. test 내부에서 컴파일러는 b 가 null이 되었을 경우 예외를 발생하게 하는 어떤 것도 허용하지 않습니다. 그래서 a.length는 가능하지만 b.length는 가능하지 않습니다. 하지만 내부에서 b가 null이 아님을 체크한다면 사용할 수 있습니다.

    if (b != null) {
        println(b.length)
    }

    또는:

    if (b == null) {
        // Can't use members of b in here
    } else {
        println(b.length)
    }

    빈번한 null 검사는 성가신 일이므로 null 가능성을 허용 해야하는 경우 Kotlin에는 아래에 설명 된 것처럼 null일 수 있는 값을 쉽게 사용할 수있는 몇 가지 매우 유용한 연산자가 있습니다.

    Safe call 연산자

    x?.y 는 x를 평가하고 x가 null이 아닌 경우 결과는 x의 재평가 없이 x.y를 평가합니다. 그렇지 않으면 null이 됩니다. 이 기능은 함수에서도 되고 체이닝도 됩니다. 예를 들어, x, y(), z, w()가 모두 null이라면 x?.y()?.z?.w()은 null이고 그렇지 않으면 x.y().z.w()의 결과를 반환합니다.

    Elvis 연산자

    x? : y는 x를 평가합니다. 이는 null이 아닌 한 표현식의 결과가 됩니다. null인 경우 y를 얻을 수 있습니다 (y는 not null이어야 함). 이것을 "엘비스 연산자"라고도합니다. null 인 경우 조기 반환을 수행하기 위해 사용할 수도 있습니다.

    val z = x ?: return y

    x가 null이 아닌 경우 x에 z를 할당하지만, null인 경우이 표현식을 포함하는 전체 함수는 중지하고 y를 리턴합니다

    Not-null assertion 연산자

    때로는 x 값이 null이 아닌 것으로 알고 있지만 컴파일러에서 인식하지 못하는 상황에 처한 경우가 있습니다. 이는 Java 코드와 상호 작용할 때 합법적으로 발생할 수 있지만 코드 논리가 컴파일러의 추론 능력보다 복잡하기 때문에 발생하는 경우 코드를 재구성해야합니다. 컴파일러를 설득 할 수 없다면 x라고 말할 수 있습니다! x 값을 생성하지만 유형이 널 입력 불가능한 표현식을 작성하려면 다음을 수행하십시오.

    val x: String? = javaFunctionThatYouKnowReturnsNonNull()
    val y: String = x!!

    물론 val x = javaFunctionThatYouKnowReturnsNonNull () !! 단일 표현식으로 수행 할 수 있습니다.

    !! 값이 실제로 null 인 경우 NullPointerException이 발생합니다. 따라서 특정 함수를 호출 해야하는 경우에도 사용할 수 있으며 호출 할 객체가 없으면 (maybeNull !!. importantFunction ()) 예외가 발생하지만 NPE가 그렇지 않기 때문에 더 나은 솔루션입니다.
    더 나은 방법이 있습니다.

    val y: String = x ?: throw SpecificException("Useful message")
    y.importantFunction()

    위의 내용은 oneliner 일 수도 있습니다. 컴파일러는 x가 null 인 경우 throw로 인해 y가 존재하지 못하게되므로 아래 줄에 도달하면 y가 null이 아니어야합니다. 이것을 x? .importantFunction ()과 대조하십시오. x가 null이면 no-op입니다.

    -> 해석..
    !! 를 써서 NPE를 발생시킬 바에 x ?: throw myCustomException 을 던져서 차라리 유용한 메시지를 담는게 낫지 않느냐 라는 것이다.

    출처: https://kotlinlang.org/docs/tutorials/kotlin-for-py/null-safety.html

    댓글

Designed by Tistory.