728x90
어떤 클래스에 대한 확장 함수를 정의할 때 이를 멤버로 추가하는 것은 좋지 않습니다.
확장 함수는 첫 번째 아규먼트로 리시버를 받는 단순한 일반 함수로 컴파일됩니다.
왜 멤버 확장 함수를 피해야 하는가?
- 혼란스러운 함수 스코프:
- 멤버 확장 함수는 해당 함수가 어디서 사용 가능한지, 또는 어떤 클래스에 속하는지 혼동을 일으킬 수 있습니다. 예를 들어, 함수가 멤버 함수인지 확장 함수인지 명확하지 않으며, 사용 범위가 제한되기 때문에 코드의 가독성을 해치게 됩니다.
- 예상치 못한 동작:
- 멤버 확장 함수는 일반적인 확장 함수와 다르게 동작할 수 있습니다. 특정 클래스 내부에서만 접근 가능한 확장 함수는 그 클래스의 외부에서는 전혀 보이지 않으며, 이는 코드의 일관성을 깨트리고 예상치 못한 동작을 초래할 수 있습니다.
- 코드 복잡성 증가:
- 멤버 확장 함수는 클래스의 복잡성을 증가시킵니다. 클래스 내부에 정의된 확장 함수는 클래스의 책임을 불필요하게 확장시키며, 이러한 추가적인 책임은 유지보수를 어렵게 만들 수 있습니다. 특히, 이러한 확장 함수가 다른 클래스와 강하게 결합되어 있을 경우, 코드의 이해와 변경이 더 어려워집니다.
- 다형성 지원의 부족:
- 확장 함수는 오버라이딩이 불가능하며, 다형성을 지원하지 않습니다. 따라서 멤버 확장 함수는 코드 구조를 유연하게 만들지 못하며, 이로 인해 다형성의 이점을 활용할 수 없는 상황이 발생할 수 있습니다.
더 나은 접근법
- 명확한 멤버 함수 사용: 멤버 함수가 필요한 경우, 확장 함수 대신 일반적인 멤버 함수로 정의하는 것이 좋습니다. 이 방법은 함수의 사용 범위와 클래스의 책임을 명확히 하고, 코드의 일관성을 유지합니다.
- 확장 함수는 클래스 외부에 정의: 확장 함수는 원래의 의도대로, 클래스 외부에서 정의하고 사용해야 합니다. 이는 확장 함수가 필요한 경우 클래스의 복잡성을 증가시키지 않으면서도, 기존 클래스를 확장하여 새로운 기능을 추가할 수 있게 합니다.
- 필요한 경우 유틸리티 클래스로 분리: 여러 클래스에서 공통적으로 사용되는 로직이라면, 해당 로직을 유틸리티 클래스로 분리하거나, 독립적인 확장 함수로 정의하여 사용 범위를 명확히 하는 것이 좋습니다.
728x90
'공부 > 이펙티브코틀린' 카테고리의 다른 글
아이템 49 - 하나 이상의 처리 단계를 가진 경우네는 시퀀스를 사용하라 (0) | 2024.08.18 |
---|---|
아이템 46 - 함수 타입 파라미터를 갖는 함수에 inline 한정자를 붙여라 (0) | 2024.08.16 |
아이템 43 - API 의 필수적이지 않는 부분을 확장 함수로 추출하라 (0) | 2024.08.10 |
아이템 42 - compareTo 의 규약을 지켜라 (0) | 2024.08.10 |
아이템 41 - hashCode 의 규약을 지켜라 (0) | 2024.08.01 |
댓글