더북(TheBook)

‘수신 객체가 널이 아닌 경우에는 의미 있는 일을 하고, 수신 객체가 널인 경우에는 널을 반환하라’라는 패턴은 실전에서 꽤 많이 발생한다. 따라서 안전한 호출을 사용하면 불필요한 if 식과 임시 변수의 사용을 줄여서 코드를 단순화할 수 있다. 한 가지 유용한 숙어는 안전한 호출 연산자를 연쇄시켜 다음과 같이 쓰는 것이다.

println(readLine()?.toInt()?.toString(16))

안전한 호출 연산자가 널을 반환할 수 있기 때문에 이런 연산이 반환하는 값의 타입은 상응하는 널을 고려하지 않는 연산자 반환 타입의 널이 될 수 있는 버전이 된다. 새로 만든 readInt() 함수를 호출하는 쪽에서도 이런 타입 변화를 염두에 둬야 한다.

fun readInt() = readLine()?.toInt()

fun main() {
  val n = readInt() // Int?
  
  if (n != null) {
    println(n + 1)
  } else {
    println("No value")
  }
}

널 아님 단언과 마찬가지로, 널이 될 수 없는 수신 객체에 안전한 호출을 적용할 수도 있다. 이런 코드는 간단한 점(.) 호출 연산과 똑같기 때문에 불필요한 중복에 불과하다.

IDE 팁 ≡

인텔리J 코틀린 플러그인은 자동으로 불필요한 ?. 연산자 사용을 강조해주고 일반 호출로 바꿀 것을 제안한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.