클래스간 결합도

friend > inheritance > composition ( > aggregation ) > dependency

 

 

용어정리 : 상속?  객체?  캡슐화?

  1. 상속은 기능의 확장이 아니라, 클래스를 분류하는 수단이다
  2. 객체는 책임이 있는 어떤 것이다
  3. 캡슐화는 데이터, 인터페이스, 클래스, 시스템 등 구현 가능한 모든 것에 대한 은닉이다. (캡슐화는 가변성에 대한 은닉이다)

 

상속이 내포하고 있는 문제

상속이란?

기존에 정의되어 있는 클래스의 필드와 메소드를 물려받아 새로운 클래스를 생성하는 기법

중복 코드 제거와 기능 확장을 쉽게 할 수 있음

클래스들 간 계층적인 구조를 만들 수 있음

 

하위 클래스가 상위 클래스의 구현에 의존하므로 (상위 클래스)변경에 취약

 

- 상속은 부모 클래스와 강하게 의존하고, 부모 클래스의 캡슐화를 해치고, 결합도가 높아짐

- 부모 클래스 구현을 변경하면, 많은 자식 클래스를 모두 변경해줘야 하는 상황이 생길 수 있음

 

상위 클래스의 모든 퍼블릭 메소드가 하위 클래스에도 반드시 노출됨(불필요한 메소드 상속받는 문제)

 

- 상속은 불필요한 부모 클래스의 퍼블릭 메소드가 자식 클래스도 어쩔 수 없이 노출하게 됨

- 특히 공개된 부모 클래스의 퍼블릭 메소드가 자식 클래스의 내부 규칙과 맞지 않을 수 있음

 

조합은 이 문제를 어떻게 해결할 수 있나?

 

- 상속과 달리 부분 객체의 내부 구현이 공개되지 않음

  - 메소드를 호출하는 방식으로 퍼블릭 인터페이스에 의존해서 부분 객체의 내부 구현이 변경되어도 비교적 안전

- 부분 객체의 모든 퍼블릭 메소드를 공개하지 않아도 됨

 

조합하고 싶은 클래스의 인스턴스를 새로운 클래스의 private필드로 참조, 

그 다음 인스턴스의 메소드를 호출하는 방식으로 구현

 

조합하면 부분 객체의 캡슐화를 지킬 수 있음

조합은 부분 객체의 퍼블릭 인터페이스에 의존함

 

조합은 부분객체의 모든 공개 메소드를 노출하지 않아도 됨

 

상속과 조합을 어떻게 사용해야 할까?

 

상속의 목적

서브 타이핑 (다형적 계층구조 구현) - 부모 자식 행동이 호환

서브 클래싱 (다른 클래스의 코드 재사용) - 부모 자식 행동이 호환 x

 

상속을 고려할때

1. 두 객체가 서로 is-a  관계인가 (조합은 has-a 관계)

2. 클라이언트 관점에서 두 객체가 동일한 행동을 할 것이라 기대하는가

 

결론: 단순히 코드 재사용하려면 조합, 동일하게 행동하는 인스턴스를 그룹화 하려면 상속.

 

 

 

+ Recent posts