Programming/JAVA

[Effective Java] 상속 금지시키기

코딩의성지 2023. 2. 8. 02:27

앞선 글에서 상속대신 컴포지션을 이용하라는 글을 작성했었다.

https://devkingdom.tistory.com/371

 

[Effective Java] 상속 대신 컴포지션 이용하기

Effective Java에 따르면 상속 대신 컴포지션을 이용하라는 말이 있다. 이는 상속을 사용하게 되는 경우 상위클래스가 하위클래스에 영향을 끼쳐 대응할 수 없는 오류를 야기할 수 도 있고, 추후에

devkingdom.tistory.com

이는 다르게 말하면 상속은 완벽한 설계가 되어있는 상황이 아니라면 쓰지말라는 이야기가 될 수 있다.

하지만 내가 안쓴다고 다른 개발자들도 과연 안쓸까? 쓰지말라고 문서화를 열심히 해둬도 시간이 지나면 누군가는 잘못된 상속을 사용하고 있는 것을 볼 수가 있다.

 

진짜 상속을 사용해야겠다 싶으면 문서화를 꼼꼼하게 해두자. 코드 내에서도 @implSpec을 이용해 상속시 필요한 정보를 기술하는 내용을 코드내에 삽입해두자. 또한 테스트 역시 하위 오브젝트를 만들어 진행하자.

 

하지만 상속이 절대 일어나서는 안되는 클래스라면 여러분이 별도의 조치를 해주는게 좋다. 상속자체가 불가능하도록 만들어 두시는 노력을 하자.

 

상속은 모든 생성자를 private나 package-private로 선언하고 public static factory로 만들어 불가능하도록 만들 수 있다.

@Getter
public class Member {
    private String name;
    private Member() {}
    private Member(String name) {this.name = name;}
    
    public static Member getInstance() {
        return new Member();
    }
}

 

위와 같은 방법도 좋지만 왠만하면 상속을 피하자. 컨벤션 룰을 정할때 상속을 피하도록 협의해두는게 여러분의 마음을 굉장히 편하게 할 것이다. 명심하자.

반응형