더북(TheBook)

확장 함수는 this를 사용해 수신 객체(확장 대상 타입에 속하는 객체)를 표현한다. 이때 수신 객체를 널이 될 수 있는 타입으로 지정하려면 확장 대상 타입 뒤에 ?를 붙이면 된다.

NullableExtensions/NullableExtension.kt

package nullableextensions
import atomictest.eq

fun String?.isNullOrEmpty(): Boolean =
  this == null || isEmpty()

fun main() {
  "".isNullOrEmpty() eq true
}

NullableParameter.kt에서 본 널이 될 수 있는 타입의 인자를 받는 isNullOrEmpty()보다 확장 함수 isNullOrEmpty()가 더 읽기 편하다.

널이 될 수 있는 타입을 확장할 때는 조심해야 한다. isNullOrEmpty()isNullOrBlank()와 같이 상황이 단순하고 함수 이름에서 수신 객체가 null일 수 있음을 암시하는 경우에는 널이 될 수 있는 타입의 확장 함수가 유용하다. 그러나 일반적으로는 보통의(널이 될 수 없는) 확장을 정의하는 편이 낫다. 안전한 호출과 명시적인 검사는 수신 객체의 널 가능성을 더 명백히 드러내는 반면, 널이 될 수 있는 타입의 확장 함수는 널 가능성을 감추고 코드를 읽는 독자(어쩌면 미래의 여러분 자신)를 혼란스럽게 할 수 있다.

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