"has-a(...는...를 가짐) 객체합성" 혹은 "is-implemented-in-terms-of(...는...를 써서 구현됨)"를 모형화할 때는 객체 합성을 사용하자

Bogoomi·2022년 7월 9일
0

EffectiveC++

목록 보기
20/24

항목37 - "has-a(...는...를 가짐) 객체합성" 혹은 "is-implemented-in-terms-of(...는...를 써서 구현됨)"를 모형화할 때는 객체 합성을 사용하자



요약
public은 is-a이다.
실제로는 is-implemented-in-terms-of가 될 수도 있고 has-a가 될 수도 있다. 그 이유는 영역이 2가지 이기 때문.
소프트웨어의 응용영역(has-a), 구현 영역(is-implemented-in-terms-of)

상대적으로 is-implemented-in-terms-of 관계와 is-a 관계가 헷갈리기 쉽다.
has-a 는 사람,주소,전화번호 등 데이터로써 가치가 있는 개체 합성을 뜻한다.
is-implemented-in-terms-of 는 사람을 찾는 방법, 주소를 찾는 방법, 전화번호를 찾는 방법 등 무엇인가를 위한 알고리즘으로써의 가치가 있음을 뜻한다(객체 합성).

상속의 단점

  • 캡슐화가 깨지고 결합도가 높아짐
  • 유연성 및 확장성이 떨어짐
  • 다중상속에 의한 문제가 발생할 수 있음
  • 클래스 폭발 문제 발생 우려

상속을 사용해야 하는 경우

  • 부모와 자식 클래스가 Is-a 관계인 경우
  • 행동 호환성이 만족하는 경우
  • 타입 계층을 구현하는 것
  • 코드를 재사용하는 것(제약이 많기 때문에 사용자제)

상속을 반드시 사용해야 한다면,
유사한 두 함수를 추출하여 동일한 형태로 만들고, 부모 클래스의 코드를 자식으로 옮기는 것이 아니라 자식 클래스의 코드를 부모로 옮기도록하자!

객체 합성을 사용하면 구현을 효과적으로 캡슐화 할 수 있다. 의존하는 객체를 교체하는 것이 비교적 쉽고, 설계가 유연해지기 때문!
상속은 클래스를 통해 강하게 결합되지만, 합성은 메세지를 통해 느슨하게 결합되기 때문!



잊지말자!

  • 객체 합성은 public 상속이 가진 의미와는 완전히 다르다.
  • 응용영역은 has-a, 구현영역은 is-implemented-in-terms-of 의미를 갖는다.
profile
개에에에바알

0개의 댓글