코틀린 언어 정리 2-14
class 확장(Extensions)
특징(제한) 및 사례 분석
(계속)...
Nullable Receiver
확장 함수의 Receiver type을 Nullable로 선언할 수도 있습니다.(아래 예제에서 fun A?.func1() ) 이렇게 선언된 확장 함수는 리시버 객체가 null일 경우 함수 외부에서 null 안전 처리를 하지 않아도 컴파일 에러가 발생하지 않습니다. 즉 리시버 객체가 null인 상태에서도 확장 함수를 호출할 수 있습니다. 하지만 함수 내부에서 this에 대해 반드시 null체크를 하도록 강제합니다.
예제
위 예제에서 func1이 nullable receiver A?의 확장 함수로 선언 되었습니다. nullable receiver가 아닐 경우 main함수의 oA.func1() 부분은 원래 null 처리 관련 컴파일 에러가 발생해야 하는데 nullable로 선언되었으므로 에러가 발생하지 않습니다.
예제
위의 코드를 컴파일 하면 nullable receiver에 "?.", "!!" 연산자를 사용하지 않았다는 컴파일 에러가 발생합니다. func1의 구현 중 this를 사용하기 전 부분에 if문으로 this에 대한 null check를 하거나 아래 코드 처럼 this 참조 시 ?. 연산자 등을 사용하면 에러가 발생하지 않습니다.
예제
확장함수의 리시버가 null인 상황이 의도된 것이고 확장 함수 내에서 this를 참조한다면 this에 대해 null check를 하여 null참조 에러 및 null 안전과 관련된 컴파일 에러를 제거할 수 있습니다.
예제
Receiver Type이 nullable 이거나 nullable이 아닌 경우의 각각의 확장 함수 선언은 컴파일 시 동일한 클래스의 함수 선언으로 처리 되므로 둘 중 하나의 선언만 사용할 수 있습니다. 따라서 위의 예제를 컴파일 시키려면 A.func, A?.func 둘 중 하나의 함수를 제거해야 합니다.
전체 예제
정리
리시버가 nullable 또는 nullable이 아닌 확장 함수 선언은 동일한 선언으로 처리됩니다. 따라서 둘 중 하나의 선언만 사용해야 합니다.
nullable type 확장 함수에서 this를 사용하려면 null 안전 처리를 반드시 해야 합니다.
nullable로 선언된 리시버 객체 변수에 대해서는 null 안전 처리를 하지 않아도 컴파일 에러가 발생하지 않습니다.
'코틀린( Kotlin )' 카테고리의 다른 글
코틀린 2-16 class 확장(Extensions)-5 확장을 클래스의 멤버로 선언 ( 다른 클래스의 내부에 멤버처럼 선언하는 확장 함수 또는 프로퍼티 ) (0) | 2020.04.09 |
---|---|
코틀린 2-15 class 확장(Extensions)-4 컴패니언 오브젝트의 확장, 확장 import (0) | 2020.04.08 |
코틀린 2-13 class 확장(Extensions)-2 확장 함수/프로퍼티 제약 (0) | 2020.04.08 |
코틀린 2-12 class 확장(Extensions)-1 확장과 멤버 접근 기본적인 우선순위 규칙 (0) | 2020.04.07 |
코틀린 2-11 Object Expressions and Declarations (0) | 2020.04.07 |