본문은 Effective Kotlin을 읽고 간단하게 정리한 글입니다. 필요에 따라 생략/수정된 부분이 있을 수 있으며, 내용이 추후 변경될 수 있습니다.
1. 확장 함수의 특징
1) *확장 함수는 import를 통해 사용할 수 있다
- 확장 함수는 멤버와 달리 별도의 import가 필요하다
- 이러한 이유로 대개 다른 패키지에 위치한다
- 직접 멤버를 추가할 수 없는 경우에 사용하기 유용하다
2) 멤버 함수보다 우선순위가 낮다
- 위에서 언급한 import해서 사용한다는 특징 때문에 같은 타입에 같은 이름으로 여러 개 만들 수 있다
- 같은 이름으로 다른 동작을 하는 확장 함수가 존재하는 것은 위험할 수 있다
- 이러한 위험 가능성이 있다면 확장 함수 대신 멤버 함수를 사용하는 것이 좋다
- 멤버 함수는 확장 함수보다 우선순위가 높다
- 따라서 같은 이름의 확장 함수가 존재하더라도 컴파일러는 멤버 함수를 우선적으로 호출한다
3) 확장 함수는 오버라이드할 수 없다
- 확장 함수는 컴파일 시점에 정적으로 선택된다
- 확장 함수는 첫 번째 아규먼트로 리시버가 들어가는 일반 함수로 컴파일 된다
- fun C.foo() → fun foo('this$reciver': C)
- 따라서 상속을 목적으로 설계된 요소는 확장 함수로 만들면 안 된다
4) 확장 함수는 클래스가 아닌 타입에 정의하는 것이다
- 따라서 인터페이스, nullable, 구체적인 제네릭 타입에 확장 함수를 정의할 수 있다
5) *클래스 레퍼런스에서 멤버로 표시되지 않는다
- 이러한 이유로 어노테이션 프로세서(annotation processor)가 따로 처리하지 않는다
- 필수적이지 않은 요소를 확장 함수로 추출하면 어노테이션 프로세스로부터 숨겨진다
- 자바와 코틀린은 많은 영역을 어노테이션 프로세서를 통해 처리한다
- 특히, 기본 라이브러리를 살펴보면 어노테이션이 여러 개 붙어있는 것을 확인할 수 있다.
2. 필수적이지 않은 부분을 확장 함수로 추출하라?
- 확장 함수는 개발자로 하여금 많은 자유와 유연성을 주기 때문에 잘 사용하면 매우 유용하다
- 또한, 확장 함수는 어노테이션 프로세스로부터 숨겨진다는 특징이 있다
- 그러나 중복 정의를 통해 혼동을 줄 수 있다는 점과 상속을 지원하지 않다는 점에서 안전성이 필수로 요구되는 API의 필수적인 부분에서 사용하기는 꺼려진다
- 따라서 API의 필수적이지 않은 부분을 확장 함수로 추출하면 공통적인 어노테이션 프로세싱을 피할 수 있을 뿐더러, 개발의 편리함 또한 취할 수 있다
'책 > Effective Kotlin' 카테고리의 다른 글
[이펙티브 코틀린] 아이템 50: 컬렉션 처리 단계 수를 제한하라 (0) | 2023.09.21 |
---|---|
[이펙티브 코틀린] 아이템 42: compareTo의 규약을 지켜라 (0) | 2023.09.04 |
[이펙티브 코틀린] 아이템 21: 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라 (0) | 2023.08.02 |
[이펙티브 코틀린] 아이템17: 이름 있는 아규먼트를 사용하라 (0) | 2023.07.23 |
[이펙티브 코틀린] 아이템16: 프로퍼티는 동작이 아니라 상태를 나타내야 한다 (0) | 2023.07.21 |