안전한 호출(safe call)은 일반 호출에 사용하는 점(.)을 물음표와 점(?.)으로 바꾼 것이다(물음표와 점 사이에 공백이 있으면 안 된다). 안전한 호출을 사용하면 널이 될 수 있는 타입의 멤버에 접근하면서 아무 예외(구체적으로는 NPE)도 발생하지 않게 해준다. 안전한 호출은 수신 객체가 null이 아닐 때만 연산을 수행한다.
SafeCallsAndElvis/SafeOperation.kt
package safecalls
import atomictest.*
fun String.echo() {
trace(toUpperCase())
trace(this)
trace(toLowerCase())
}
fun main() {
val s1: String? = "Howdy!"
s1?.echo() // [1]
val s2: String? = null
s2?.echo() // [2]
trace eq """
HOWDY!
Howdy!
howdy!
"""
}
• [1]에서는 echo()를 호출한 결과를 trace에 남긴다.
• 반면 [2]에서는 S2의 수신 객체가 null이므로 아무 일도 하지 않는다.