코틀린에서 null을 다루는 방법

2023. 6. 5. 00:42kotlin/문법

참고

  • 해당 내용은 인프런에 자바 개발자를 위한 코틀린 입문 강의영상을 보고 정리한 문서입니다.

목차

  1. Kotlin에서의 null 체크
  2. Safe Call과 Elvis 연산자
  3. 널 아님 단언!!
  4. 플랫폼 타입

Java에서의 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에서의 null 체크

public startWithA1(str: String?): Boolean {
    if (str == null) {
        throw new IllegalArgumentException("null이 들어왔습니다")
    }
    return str.startsWith("A")
}

public startsWithA2(str: String?): Boolean? {
    if (str == null) {
        return null
    }
    return str.startsWith("A")
}

public startsWithA3(str: String?): Boolean {
    if (str == null) {
        return false
    }
    return str.startsWith("A")
}
  • Kotlin에서는 null이 가능한 타입을 완전히 다른게 취급한다.!
  • null이 가능한 타입만을 위한 기능은 없을까?! → save call, elvis

Save Call과 Elvis연산자

val str: String? = "ABC"
println(str?.length)
  • 결과는 ABC가 나오겠지만, 만약 "ABC"가 아니라 null이 들어가게 되면 결과값으로 null이 그대로 출력된다. → Safe Call
val str: String? = null
println(str?.lenght ?: 0)
  • str 변수에 null이 들어갔으니 결과값이 null이어야 하지만 Elvis 연산자(?:) 로 인하여 0이 된다.

널 아님 단언!!

fun startsWith(str: String?): Boolean {
    return str!!.startsWith("A")
}
  • 혹시나 null이 들어오면 NPE가 나오기 때문에 정말 null이 아닌게 확실한 경우에만 널 아님 단언!! 을 사용해야 함

플랫폼 타입

  • Kotlin에서 Java 코드를 가져다 사용할 때 어떻게 처리될까?!
public class Person {

  private final String name;

  public Person(String name) {
    this.name = name;
  }
  @Nullable
  public String getName() {
    return name;
  }

}
fun main() {
    val person = Person("공부하는 개발자")
    startsWithA(person.name) //에러 발생함. 왜? 위 코드를 보면 getName 
                             //메서드에서 @nullable이기 때문에
                             //만약 @notnull 이면 에러발생 x
}

fun startsWithA(str: String): Boolean {
    return str.startsWith("A")
}

인식, 이해할 수 있는 패키지

  • javax.annotation
  • android.support.annotation
  • org.jetbrains.annotation

만약 자바 Person 객체에서 @Nullable이 없다면?

  • Kotlin에서는 이 값이 nullable인지 ? non-nullable인지? 알 수 없음.
  • 그래서 플랫폼 타입 ㄷㄷㄷㅈ
    • 코틀린이 null 관련 정보를 알 수 없는 타입 Runtime 시 exception이 날 수 있다.