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 |