본문 바로가기
공부/이펙티브코틀린

아이템 44 - 멤버 확장 함수의 사용을 피하라

by 띵커베르 2024. 8. 10.
728x90
어떤 클래스에 대한 확장 함수를 정의할 때 이를 멤버로 추가하는 것은 좋지 않습니다.
확장 함수는 첫 번째 아규먼트로 리시버를 받는 단순한 일반 함수로 컴파일됩니다.

 

왜 멤버 확장 함수를 피해야 하는가?

  1. 혼란스러운 함수 스코프:
    • 멤버 확장 함수는 해당 함수가 어디서 사용 가능한지, 또는 어떤 클래스에 속하는지 혼동을 일으킬 수 있습니다. 예를 들어, 함수가 멤버 함수인지 확장 함수인지 명확하지 않으며, 사용 범위가 제한되기 때문에 코드의 가독성을 해치게 됩니다.
  2. 예상치 못한 동작:
    • 멤버 확장 함수는 일반적인 확장 함수와 다르게 동작할 수 있습니다. 특정 클래스 내부에서만 접근 가능한 확장 함수는 그 클래스의 외부에서는 전혀 보이지 않으며, 이는 코드의 일관성을 깨트리고 예상치 못한 동작을 초래할 수 있습니다.
  3. 코드 복잡성 증가:
    • 멤버 확장 함수는 클래스의 복잡성을 증가시킵니다. 클래스 내부에 정의된 확장 함수는 클래스의 책임을 불필요하게 확장시키며, 이러한 추가적인 책임은 유지보수를 어렵게 만들 수 있습니다. 특히, 이러한 확장 함수가 다른 클래스와 강하게 결합되어 있을 경우, 코드의 이해와 변경이 더 어려워집니다.
  4. 다형성 지원의 부족:
    • 확장 함수는 오버라이딩이 불가능하며, 다형성을 지원하지 않습니다. 따라서 멤버 확장 함수는 코드 구조를 유연하게 만들지 못하며, 이로 인해 다형성의 이점을 활용할 수 없는 상황이 발생할 수 있습니다.

 

더 나은 접근법

  • 명확한 멤버 함수 사용: 멤버 함수가 필요한 경우, 확장 함수 대신 일반적인 멤버 함수로 정의하는 것이 좋습니다. 이 방법은 함수의 사용 범위와 클래스의 책임을 명확히 하고, 코드의 일관성을 유지합니다.
  • 확장 함수는 클래스 외부에 정의: 확장 함수는 원래의 의도대로, 클래스 외부에서 정의하고 사용해야 합니다. 이는 확장 함수가 필요한 경우 클래스의 복잡성을 증가시키지 않으면서도, 기존 클래스를 확장하여 새로운 기능을 추가할 수 있게 합니다.
  • 필요한 경우 유틸리티 클래스로 분리: 여러 클래스에서 공통적으로 사용되는 로직이라면, 해당 로직을 유틸리티 클래스로 분리하거나, 독립적인 확장 함수로 정의하여 사용 범위를 명확히 하는 것이 좋습니다.
728x90

댓글