확장 함수는 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일 수 있음을 암시하는 경우에는 널이 될 수 있는 타입의 확장 함수가 유용하다. 그러나 일반적으로는 보통의(널이 될 수 없는) 확장을 정의하는 편이 낫다. 안전한 호출과 명시적인 검사는 수신 객체의 널 가능성을 더 명백히 드러내는 반면, 널이 될 수 있는 타입의 확장 함수는 널 가능성을 감추고 코드를 읽는 독자(어쩌면 미래의 여러분 자신)를 혼란스럽게 할 수 있다.