피터 코드의 상속 규칙

uglyduck.dev·2020년 9월 20일
0

개념 모아 🗂

목록 보기
23/40

정의

상속의 오용을 막기 위해 상속의 사용을 엄격하게 제한하는 규칙

  • 자식 클래스와 부모 클래스 사이는 '역할 수행' 관계가 아니어야 한다.

  • 한 클래스의 인스턴스는 다른 서브 클래스의 객체로 변환할 필요가 절대 없어야 한다.

  • 자식 클래스가 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행해야 한다.

  • 자식 클래스가 단지 일부 기능을 재사용할 목적으로 유틸리티 역할을 수행하는 클래스를 상속하지 않아야 한다.

  • 자식 클래스가 '역할', '트랜잭션', '디바이스' 등을 특수화해야 한다.

구현 예시


부모 클래스 : 사람

자식 클래스 : 운전자 회사원


Q. 자식 클래스가 부모 클래스 사이의 '역할 수행' 관계 인가?

A.

  • '운전자'는 어떤 순간에 '사람'이 수행하는 역할의 하나이다.
  • '회사원'도 사람이 어떤 순간에 수행하는 역할의 하나이다.

=> 사람과 운전자나 사람과 회사원은 상속 관계로 표현되어서는 안 되므로 규칙에 위배된다.

Q. 한 클래스의 인스턴스는 다른 서브 클래스의 객체로 변환할 필요가 절대 없는가?

A. '운전자'는 어떤 시점에서 '회사원'이 될 필요가 있으며 '회사원' 역시 '운전자'가 될 필요가 있다. 가령 자신이 일하는 회사로 출퇴근하는 동안에는 '운전자'로서의 역할을 수행하며, 회사에 있을 때는 '회사원'으로서의 역할을 수행한다.

=> 객체의 변환 작업이 필요하므로 규칙에 위배된다.

Q. 자식 클래스가 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행하는가?

A. 점검 불가

=> '사람', '운전자', '회사원' 클래스 등에 어떤 속성과 연산이 정의되었는지 정보가 없다.

Q. 자식 클래스가 단지 일부 기능을 재사용할 목적으로 유틸리티 역할을 수행하는 클래스를 상속하지 않는가?

A.
=> 기능만 재사용할 목적으로 상속 관계를 표현하지는 않았으므로 규칙을 준수한다.

Q. 자식 클래스가 '역할', 트랜잭션', '디바이스' 등을 특수화 하는가?

A.
=> 슈퍼 클래스가 역할, 트랜잭션, 디바이스를 표현하지 않았으므로 규칙에 위배된다.

따라서, 피터 코드의 규칙에 따라 위와 같은 관계는 상속을 사용하지 않고 집약(혹은 연관) 관계를 사용하는 편이 좋다.

Reference

  • 정인상, 채흥석, 『JAVA 객체 지향 디자인 패턴』, 한빛미디어(2019.3.8), 86~87p
profile
시행착오, 문제해결 그 어디 즈음에.

0개의 댓글