[아이템 19] 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라
IT 개발/개념 정리
2022. 5. 21. 21:19
- 상속용 클래스는 재정의할 수 있는 메서드들을 내부적으로 어떻게 이용하는지(자기사용) 문서로 남겨야 한다.
- 효율적인 하위 클래스를 큰 어려움 없이 만들 수 있게 하려면 클래스의 내부 동작 과정 중간에 끼어들 수 있는 훅(hook)을 잘 선별하여 protected 메서드 형태로 공개해야할 수도 있다.
- 상속용으로 설계한 클래스는 배포 전에 반드시 하위 클래스를 만들어 검증해야 한다.
- 상속용 클래스의 생성자는 직접적으로든 간접적으로든 재정의 가능 메서드를 호출해서는 안 된다. 재정의 가능 메서드를 호출하는 자기 사용 코드를 완벽히 제거해야한다.
- private, final, static 메서드는 재정의가 불가능하니 생성자에서 안심하고 호출해도 된다.
- 상속용으로 설계하지 않은 클래스는 상속을 금지한다.
clone과 readObject 모두 직접적으로든 간접적으로든 재정의 가능 메서드를 호출해서는 안 된다.
- readObject의 경우 하위 클래스의 상태가 미처 다 역직렬화되기 전에 재정의한 메서드부터 호출하게 된다.
- clone의 경우 하위 클래스의 clone메서드가 복제본의 상태를 (올바른 상태로) 수정하기 전에 재정의한 메서드를 호출한다. 이는 프로그램 오작동으로 이어질 수 있다.
상속을 금지하는 두 가지 방법
- 클래스를 final로 선언한다.
- 모든 생성자를 private이나 package-private으로 선언하고 public 정적 팩터리를 만들어준다. 정적 팩토리외에는 그 어떤 초기화 메서드도 public으로 선언해서는 안 된다.
반응형
'IT 개발 > 개념 정리' 카테고리의 다른 글
[아이템 21] 인터페이스는 구현하는 쪽을 생각해 설계하라 (0) | 2022.05.26 |
---|---|
[아이템 20] 추상 클래스보다는 인터페이스를 우선하라 (0) | 2022.05.26 |
[아이템 18] 상속보다는 컴포지션을 사용하라 (0) | 2022.05.14 |
[아이템 17] 변경 가능성을 최소화하라 (0) | 2022.05.14 |
[아이템 16] public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 (0) | 2022.05.14 |