TIL

Lec 02. 코틀린에서 null을 다루는 법

1. Kotlin에서의 null 체크

public boolean startsWithA1(String str) { // 예외 발생
  if (str == null) throw new IllegalArgumentException("null이 들어왔습니다");
  return str.startsWith("A");
}

public Boolean startsWithA2(String str) { // null 반환
  if (str == null) {
    return null;
  }
  return str.startsWith("A");
}

public boolean startsWithA3(String str) { // false 반환
  if (str == null) {
    return false;
  }
  return str.startsWith("A");
}
fun startsWithA1(str: String?): Boolean {
  if (str == null) throw IllegalArgumentException("null이 들어왔습니다")
  return str.startsWith("A")
}

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

fun startsWithA3(str: String?): Boolean {
  if (str == null) {
    return false
  }
  return str.startsWith("A")
}
fun startsWithA(str: String): Boolean {
  return str.startsWith("A")
}

2. Safe Call과 Elvis 연산자

Safe Call

val str: String? = "ABC"

str.length // 불가능
str?.length // 가능!!, null 반환

Elvis 연산자

val str: String? = "ABC"
str?.length ?: 0

Safe Call과 Elvis 연산자로 리팩터링

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

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

fun startsWithA3(str: String?): Boolean {
    return str?.startsWith("A") ?: false
}

3. 널 아님 단언!!

fun startsWit(str: String?): Boolean { // 절대 null이 들어올 수 없지만 nullable type인 경우
  return str!!.startsWith("A")
}

4. 플랫폼 타입

import org.jetbrains.annotations.Nullable;

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) // 컴파일 에러
}

fun startsWithA(str: String): Boolean { // nullable 타입이 아니기 때문
  return str.startsWith("A")
}

플랫폼 타입