-
43장 - API의 필수적이지 않은 부분을 확장 함수로 추출하라Kotlin/Effective Kotlin 요약 2023. 4. 6. 00:01
메서드 VS 확장함수
클래스의 메서드를 정의할 때는 메서드를 멤버로 정의할 것이지 아니면 확장함수로 정의할 것인지 결정해야 합니다.
두 방식 중에 어떤 방식이 우월하다고 할 수 없습니다.
장단점을 비교하여 상황에 맞게 사용해야 합니다.
메서드로 정의하기
class Workshop(){ fun makeEvent(text: String){ println("make Event $text") } } fun main() { val workshop = Workshop() workshop.makeEvent("1") //make Event 1 }
확장 함수로 정의하기
class Workshop(){} fun Workshop.makeEvent(text: String){ println("make Event $text") } fun main() { val workshop = Workshop() workshop.makeEvent("1") //make Event 1 }
가장 큰 차이점으로는 확장은 따로 가져와서 사용해야 한다는 것입니다.
그래서 일반적으로 확장은 다른 패키지에 위치합니다.
임포트 해서 사용하다는 특징 덕분에 확장 함수는 같은 타입에 같은 이름으로 여러 개 만들 수 있습니다.
상속과 확장함수
open class C class D: C() fun C.foo() = "c" fun D.foo() = "d" fun main() { val d = D() println(d.foo()) //d val c: C = d println(c.foo()) //c println(D().foo()) //d println((D() as C).foo()) //c }
확장 함수는 컴파일 시점에 정적으로 선택됩니다.
가상 멤버 함수와 다르게 동작되므로 상속을 목적으로 설계된 요소는 확장 함수로 만들면 안 됩니다.
멤버 함수를 사용할 때
- 일반적으로 멤버 함수는 자신이 속한 클래스에 있음이 보장되므로 확장 함수보다 찾기가 더 쉽습니다.
- 코드가 코틀린으로 작성되어 있을 때
- 코드를 수정할 수 있을 때
- 다른 코드에서 사용할 수 있는 의미가 있을 때
확장 함수를 사용할 때
- Java로 작성된 코드에 Kotlin으로 작성된 메서드를 추가하려고 할 때
- 원래 코드를 변경할 수 없을 때
- 코드의 특정 부분에만 의미가 있는 특수 기능을 원할 때
멤버와 확장 함수의 차이
- 확장 함수는 읽어 들여야 한다
- 확장 함수는 virtual이 아니다
- 멤버는 높은 우선순위를 갖는다
- 확장 함수는 클래스 위가 아니라 타입 위에 만들어진다.
- 확장 함수는 클래스 레퍼런스에 나오지 않는다.
결론
확장 함수는 우리에게 더 많은 자유와 유연성을 준다.
클래스 내부에 존재하지 않아 약간 혼동을 줄 수 있다.
필수적인 부분은 멤버로 두는 것이 좋다.
필수적이지 않은 부분은 확장 함수로 만드는 것이 좋다.
참고자료
https://stackoverflow.com/questions/47181547/kotlin-extension-functions-vs-member-functions
'Kotlin > Effective Kotlin 요약' 카테고리의 다른 글
45장 - 불필요한 객체 생성을 피하라 (0) 2023.04.08 44장 - 멤버 확장 함수의 사용을 피하라 (0) 2023.04.07 42장 - compareTo 규약을 지켜라 (0) 2023.04.05 41장 - hashCode의 규약을 지켜라 (0) 2023.04.04 40장 - equals 규약을 지켜라 (0) 2023.03.29