ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 8장 - 적절하게 null을 처리하라
    Kotlin/Effective Kotlin 요약 2023. 1. 24. 00:01

    null이 의미하는 바

    값이 부족하다는 것을 의미하며 프로퍼티의 값이 설정되어있지 않거나 제거되었음을 의미합니다.

     

    함수가 null을 반환한다는 것은 여러 의미를 가집니다.

    -. firstOrNull에서 주어진 조건에 맞는 요소가 존재하지 않음

    - String.toIntOrNull에서 String을 Int로 적절하게 변환할 수 없음

    이처럼 null은 명확한 의미를 주어야 합니다.

     

    null 처리법

    null은 대게 API를 사용하는 사용자가 처리합니다.

     

    기본적으로 null은 3가지 방법으로 처리합니다.

    -?. , 스마트 캐스팅, Elvis 연산자 사용

    - 예외 throw 

    - nullable 하지 않도록 리팩터링

     

    의도적으로 예외 throw 하기

    만약?. 을 사용할 경우 개발자가 null이 되리라 예상하지 못했다면 해당 메서드가 호출되지 않는 이유에 의문을 가질 수 있습니다.

    이런 부분을 방지하기 위해서 강제로 예외를 발생시켜 주는 것도 좋습니다.

    throw, !!, requireNotNull, checkNotNull 등을 활용할 수 있습니다.

     

    not-null assertion(!!)

    null을 처리하는 가장 간단한 방법은 !!을 사용하는 것입니다.

    하지만 이렇게 되면 자바에서 nullable을 처리하는 방법과 똑같아집니다.

     

    보통 null이 나오지 않는다는 것을 거의 확신하고 사용합니다.

    하지만 현재 확실하다고, 미래에 확실한 것은 아닙니다.

    보통 문제는 미래의 어느 순간에 일어납니다.

     

    또한 프로퍼티를 계속 언팩 해야 하는 단점이 있습니다.

     

    의미 없는 nullability 피하기

    nullable 하게 되면 결과적으로 null을 처리해야 하기 때문에 최대한 피할 수 있으면 피하는 것이 좋습니다.

     

    lateinit과 Delegates.notNull

    lateinit 한정자는 프로퍼티가 이후에 설정될 것임을 명시하는 한정자입니다.

    만약 초기화되기 전에 사용하는 경우에는 예외가 발생하지만 이는 오히려 좋은 일입니다.

    이로 인해 뭔가 잘못되었다는 것을 빠르게 알 수 있습니다.

     

    JVM에서 Int, Long, Double, Boolean과 같은 기본 타입과 연결된 타입으로 프로퍼티를 초기화해야 하는 경우에는 lateinit을 사용할 수 없습니다.

     

    이때는 Delegates.notNull을 사용할 수 있습니다.

    lateinit보다 성능은 떨어집니다.

     

    fun main() {
        val test = Test()
        test.notnullValue = 3
        println(test.notnullValue)
    }
    
    class Test{
        var notnullValue: Int by Delegates.notNull()
    }

     

    댓글

Designed by Tistory.