Kotlin

[Kotlin] 코틀린이 null을 다루는 방식 ? 연산자와 ?: 엘비스 연산자

voider 2021. 5. 15. 11:38

Kotlin ? keyword

Java에서는 객체의 메서드를 호출할 때 NP가 발생할 수 있으므로 메서드 호출 전 null체크가 필요하다.

if(foo != null) 
    foo.bar

코틀린은 안전한 null 체크를 위한 ?연산자를 제공한다.

foo?.bar() //null이라면 null, null아니라면 결과 값이 출력된다.

하지만 역시 안전한 호출의 결과 타입도 null이 될 수 있으므로 유의해야 한다. 이를 테면 String.toUpperCase의 결과는 String을 반환한다. 반면 String?.toUpperCase식의 결과 타입은 String?이 된다.

?연산자를 연속해서 사용하는 것도 가능하다.

class Address(val streetAddress: String, val zipCode: Int,
              val city: String, val country: String)
class Company(val name: String, val address: Address?)
class Person(val name: String, val company: Company?)

fun Person.countryName(): String {
    val country = this.company?.address?.country
    return if (country != null) country else "Unknown!"
}

먼저 company?는 Company가 존재한다면, Company를 아니면 null을 반환한다.
그 다음 address?도 마찬가지로 Address가 존재하면 Address를 아니라면 null을 반환한다.
하지만 여전히 마지막 return문을 보면 if를 통해 null체크를 해야 한다.

엘비스 연산자 ?:

코틀린은 ?:라고 하는 엘비스 연산자를 지원한다. 여담이지만 시계방향으로 90도 돌리면 엘비스 프레슬리의 헤어스타일 같다고 지어진 이름이란다. 좀더 진지한 이름으로는 널 복합(null coalescing)연산자라는 이름도 있다.
아무튼 ?:연산자는 이항 연산자다. 좌항을 계산한 값이 null인 지 검사하고, null이 아니면 좌항 값을, null이면 우항 값을 반환한다.

이 엘비스 연산자를 이용해서 위 예제의 return문을 좀 더 간결하게 수정할 수 있다.

//return if (country != null ) country else "Unknown"
return country ?: "Unknown"

코틀린은 자바와 달리 return이나 throw도 문(statement)이 아니라 식(expression)이므로 엘비스 연산자 우항에 return, throw를 사용하는 것도 가능하다.

참고: Kotlin in action(249~254p)

'Kotlin' 카테고리의 다른 글

kotlin generic variance  (0) 2022.02.27
Koltin Properties  (0) 2021.08.01