본문 바로가기
프로그래밍 놀이터/Kotlin, Coroutine

[Effective Kotlin] Item 43 : Consider extracting non-essential parts of your API into extensions

by 돼지왕 왕돼지 2022. 5. 29.
반응형

이 글은 Effective Java 를 완독하고, Kotlin 을 상용으로 사용하는 개발자 입장에서
Effective Kotlin 글 중 새로운 내용, remind 할 필요 있는 부분, 핵심 내용 등만 추려 정리한 내용입니다.

 

#
member function 과 extension function 의 결정적 차이는..
    extension 은 별도로 import 되어야 함.
    extension 은 virtual 이 아님. (재정의될 수 없다.)
    member 가 더 높은 우선순위를 가짐.
    class 에 대한 것이 아닌 type 에 대한 것임. (nullable type 에도 정의할 수 있음)
    class reference 의 member 로 list 되지 않음.

 

#
extension 은 별도의 pkg 에 위치할 수 있다.
또한 extension 은 우리가 해당 class 를 직접 변경할 수 없을 때도 유효하다.
extension 은 같은 이름으로 여러개가 존재할 수도 있다.

 

#
동일한 이름의 extension function 과 member function 이 있을 때,
compiler 는 member function 을 항상 우선 선택한다.

 

#
extension function 은 해당 클래스에서 재정의 될 수 없다. (not virtual)
그래서 상속을 위해 설계된 것들에 대해서는 extension 을 사용하면 안 된다.

open class C

class D: C()

fun C.foo() = "c"
fun D.foo() = "d"

fun main(){
	val d = D()
	print(d.foo()) // d
    
	val c: C = d
	print(c.foo()) // c
	print(D().foo()) // d
	print((D() as C).foo()) // c
}

이는 extension function 이 첫번째 arg 로 extension 의 receiver 를 받도록 compile 되기 때문이다.

fun foo(this$receiver: C) = "c"
fun foo(this$receiver: D) = "d"

 

#
extension function 은 type 에 정의하는 것이고, class 에 지정하는 것이 아니다.
이는 더 높은 자유도를 주는데, nullable type 과 generic type 에도 지정할 수 있다는 이야기이다.

inline fun CharSequence?.isNullOrBlack(): Boolean { /../ }
public fun Iterable.sum():Int { /../ }

 

#
extension function 은 class reference 의 member 로 list 되지 않기 때문에
annotation processor 의 고려 대상이 아니다.

 

 

Summary

#
상황에 따라 정의 방법은 다르겠지만, 핵심적이지 않은 부분들은 extension 으로 정의하는 것 추천

 

 

 

반응형

댓글