포스트

Kotlin의 null 다루기


Kotlin에서 null 체크


Java 코드

1
2
3
public boolean startsWithA(String str) {
    return str.startsWith("A");
  }

위 코드는 안전한 코드 일까??

  • 아니다!!

만약 null이 들어오면 NullPointException (NPE)이 발생한다.


3가지 경우로 개선 가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  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 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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")
}


null을 허용하지 않도록 작성할 수 있다.

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




Safe Call과 Elvis 연산자


  • Kotlin에서는 null이 가능한 타입은 완전히 다르게 취급
  • null이 가능한 타입만을 위한 기능 : Safe Call, Elvis

Safe Call

예제

1
2
3
4
val str: String? = "ABC"

str.length // 불가능
str?.length // 가능
  • null이 아니면 실행
  • null이면 미실행 (그대로 null)


Elvis

예제

1
2
val str: String? = "ABC"
str?.length ?: 0
  • 앞에 연산 결과가 null이면 뒤에 값을 사용
  • 여담으로 ?:을 90도 돌리면 가수 Elvis의 헤어스타일과 닮아서 Elvis연산자라고 부른다고 한다. img_1.png


Safe Call과 Elvis를 사용해 수정한 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
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
}




널 아님 단언

  • nullable type이지만, null이 될 수 없는 경우
  • 예를 들어 처음 생성되는 경우에는 null일 수 있지만 값이 한번 들어오면 null이 될 수 없는 경우 등…


1
2
3
fun startsWith(str: String?): Boolean {
    return str!!.startsWith("A")
}

절대 null이 아니라는 의미로 !!를 붙여서 사용




플랫폼 타입

  • Kotlin에서 Java를 가져와 사용 가능
  • Java코드에 @Nullable이 없거나 null 관련 정보를 알 수 없는 타입
    • Runtime 시 Exception이 발생할 수 있음


예제 Person

1
2
3
4
5
6
7
8
9
10
11
12
public class Person {

  private final String name;

  public Person(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }
}


Kotlin에서 사용

1
2
3
4
5
6
7
8
9
10
fun main(){

    val person = Person("개발자");
    startsWithNotNull(person.name)
}


fun startsWithNotNull(str: String): Boolean{
  return str.startsWith("A")
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.