ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2강. 코틀린에서 null을 다루는 방법
    BackEnd/Kotlin 2024. 1. 27. 11:30
    반응형
    1. Kotlin에서의 null 체크
    2. Safe Call과 Elvis 연산자
    3. 널 아님 단언 있는 (!!)
    4. 플랫폼 타입

     

      다음은 null 을 처리하는 자바 코드입니다.

      public boolean startsWithA1(String str) {
        if (str == null) {
          throw new IllegalArgumentException("null이 들어왔습니다");
        }
        return str.startsWith("A");
      }
    
    
      public Boolean startsWithA2(String str) {
        if (str == null) {
          return null;
        }
        return str.startsWith("A");
      }
    
    
      public boolean startsWithA3(String str) {
        if (str == null) {
          return false;
        }
        return str.startsWith("A");
      }

     

      해당 코드를 Kotlin 으로 변경하면 다음과 같습니다.

    fun startsWithA1(str: String?): Boolean {
        return str?.startsWith("A") ?: throw java.lang.IllegalArgumentException("null이 들어왔습니다")
    }
    
    fun startsWithA2(str: String?): Boolean? {
        return str?.startsWith("A")
    }
    
    fun startsWithA3(str: String?): Boolean {
        return str?.startsWith("A") ?: false
    }

     

    Kotlin에서의 null 체크

    • Kotlin에서는 null이 가능한 타입을 완전히 다르게 취급합니다. (?)
    • 한 번 null 검사를 하면 non-null임을 컴파일러가 알 수 있습니다.

     

    Safe Call과 Elvis 연산자

    • Safe Call(?): null이 아니면 실행하고, null이면 실행하지 않습니다. 그대로 null이 됩니다.
    var str: String? = "ABC"
    str.length // 불가능
    str?.length // 가능
    • Elvis 연산자(?:): 앞의 연산 결과가 null이면 뒤의 값을 사용합니다.
    val str: String? = "ABC"
    str?.length ?: 0

     

      Elvis 연산은 early return 에서도 사용 가능합니다.

    // Java
    public long calculate(Long number) {
      if (number == null) {
        return 0;
      }
      
      // logic...
    }
    
    // Kotlin
    fun calculate(number: Long?) Long {
      number ?: return 0
      
      // logic...
    }

     

    널 아님 단언 (!!)

    • nullable type이지만 null이 될 수 없는 경우에 사용합니다.
    • 혹시나 null이 들어오게 되면 NPE(Null pointer exception)이 발생합니다.
    fun startsWith(str: String?): Boolean {
      return str!!.startsWith("A")
    }

     

    플랫폼 타입

      Kotlin에서 Java 코드를 가져다 사용할 때 javax.annotation 패키지 아니면 android나 jetbrains에 있는 null에 관련된 Annotation(@Nullable or @NotNull)을 활용하면 Kotlin에서 인식해서 사용할 수 있습니다.

    • javax.annotation 패키지
    • android.support.annotation 패키지
    • org.jetbrains.annotation 패키지

     

      null에 관련된 Annotation 정보가 없다면 Kotlin에서는 해당 값이 nullable 인지 non-nullable 인지 알 수 가 없습니다. 플랫폼 타입이란 Kotlin이 null 관련 정보를 알 수 없는 타입으로, Runtime 시 Exception이 발생할 수 있습니다.

     

    더보기

    (Tony Hoare - ALGOL 60 개발자)

    1965년에 탄생한 NULL은 수조원의 실수이다.

     

    이때 나는 객체지향적 언어에서 주소값에 대한 종합적인 타입 시스템을 디자인하고 있었다. 나의 목표는 참조값 사용의 안정성을 컴파일러에 의해 자동 수행되어, 완전하게 보장하는 것이었다.

     

    하지만 나는 NULL을 사용하는 방식의 구현이 쉬웠기에 NULL 참조를 넣을 수 밖에 없었다. 이 선택은 지난 40년동안 수조원에 가까운 셀 수 없는 에러, 침해, 시스템 크래시 등을 만들었다.

     

    감사합니다.

    반응형

    댓글

Designed by Tistory.