(수신 객체가 null일 때) ?.의 결과로 null을 만들어내는 것 이상의 일이 필요하다면 어떻게 해야 할까? 이때 엘비스(Elvis) 연산자가 대안을 제공한다. 이 연산자는 물음표 뒤에 콜론을 붙인(?:) 연산자다(물음표와 콜론 사이에 공백이 있으면 안 된다). ‘엘비스’라는 이름은 미국 가수 엘비스 프레슬리(Elvis Presley)의 이모티콘과 비슷하기 때문에 붙은 이름이다. 엘비스라는 이름은 ‘else-if(영어 발음을 연음시켜 그대로 적으면 ‘엘시프’라서 ‘엘비스’와 비슷함)’라는 용어를 응용한 언어유희이기도 하다.
상당수의 프로그래밍 언어가 코틀린 엘비스 연산자와 같은 역할을 하는 널 복합 연산자(null coalescing operator)를 제공한다.
?:의 왼쪽 식의 값이 null이 아니면 왼쪽 식의 값이 전체 엘비스 식의 결괏값이 된다. 왼쪽 식이 null이면 ?:의 오른쪽 식의 값이 전체 결괏값이 된다.
SafeCallsAndElvis/ElvisOperator.kt
import atomictest.eq
fun main() {
val s1: String? = "abc"
(s1 ?: "---") eq "abc"
val s2: String? = null
(s2 ?: "---") eq "---"
}
• S1은 null이 아니므로 엘비스 연산자가 "abC"를 결과로 내놓는다.
• S2는 null이므로 엘비스 연산자가 "---"라는 대안값을 내놓는다.