다형성

다형성은 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력이다. 자식 클래스를 개별적으로 다룰 필요 없이 한 번에 처리할 수 있게 하는 수단을 제공한다.

ex) 객체지향 원리(1) 포스트의 스마트폰 예제

 

 

※ 피터 코드의 상속 규칙

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

 

1. 자식 클래스와 부모 클래스 사이에는 '역할 수행(is role played by) 관계가 아니어야 한다.

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

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

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

5. 자식 클래스가 '역할(role)', '트랜잭션(transaction)', '디바이스(device)' 등을 특수화(부모 클래스에서 자식 클래스를 추출하는 과정)해야 한다.

 

ex)

1. 첫 번째 규칙 : '운전자'는 어떤 순간에 '사람'의 수행하는 역할 중 하나다. '회사원'도 마찬가지다. 따라서 규칙에 위배된다.

2. 두 번째 규칙 : 회사로 출퇴근하는 동안 '회사원'은 '운전자'가 된다. 즉, '회사원'이 '운전자'가 될 수 있고, '운전자'가 '회사원'이 될 수 있다. 따라서 규칙에 위배된다.

3. 세 번째 규칙 : '사람', '운전자', '회사원' 클래스에 어떤 속성과 연산이 정의되었는지 정보가 없어 점검할 수 없다.

4. 네 번째 규칙 : 기능만 재사용할 목적으로 상속 관계를 표현하지는 않았으므로 규칙을 준수

5. 다섯 번째 규칙 : 슈퍼 클래스가 역할, 트랜잭션, 디바이스를 표현하지 않았으므로 규칙에 위배

=> 상속을 사용하지 않고 집약관계를 사용해 클래스를 만들면 좋다. 그렇게 설계하면 사람은 운전자, 회사원 역할을 수행한다는 사실이 자연스럽다.

+ Recent posts