상속
-
19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라JAVA/Effective java 2021. 3. 2. 12:20
상속을 고려한 설계와 문서화란 무얼 뜻할까? 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야 한다. API 설명과 덧붙여서 어떤 순서로 호출하는지, 각각의 호출 결과가 이어지는 처리에 어떤 영향을 주는지도 담아야 한다. 여기서 재정의 가능이란 pulbic과 protected 메서드 중 final이 아닌 모든 메서드를 뜻한다. Implementation Requirements로 시작하는 절을 API 문서의 메서드 설명에서 볼 수 있다. 이는 그 메서드의 내부 동작 방식을 설명하는 곳이다. 이 설명에 따르면 iterator 메서드를 재정의하면 remove 메서드의 동작에 영향을 줌을 확실히 알 수 있다. iterator 메서드로 얻은 반복자의 동작이 remove 메서드..
-
상속보다는 컴포지션을 사용하라JAVA/Effective java 2021. 2. 28. 13:58
상속은 코드를 재사용하는 강력한 수단이지만, 항상 최선은 아니다. 잘못 사용하면 오류를 내기 쉬운 소프트웨어를 만들게 된다. 상위 클래스와 하위 클래스를 모두 같은 프로그래머가 통제하는 패키지 안이라면 상속도 안전한 방법이다. 확장할 목적으로 설계되고 문서화 잘 된 클래스 역시 안전하다. 하지만 일반적인 구체 클래스를 패키지 경계를 넘어, 다른 패키지의 구체 클래스를 상속한다면 이는 위험할 수 있다. 메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. 즉 상위 클래스가 어떻게 구현되느냐에 따라 하위 클래스의 동작에 이상이 생길 수 있다. 상위 클래스는 릴리즈마다 내부 구현이 달라질 수 있으며, 그 여파로 한 줄 건드리지 않은 하위 클래스가 오동작할 수 있다. getAddCount 메서드를 호출하면 3을 반환하..