[OOP] Prefer composition over inheritance

Jerry·2021년 8월 22일
0

language & framework study

목록 보기
15/28

상속보단 조합을 사용하라

여기에서 말하는 상속은 클래스가 다른 클래스를 확장하는 구현상속만을 말합니다.

클래스가 인터페이스를 구현하거나, 인터페이스가 다른 인터페이스를 상속하는 것과는 무관합니다.

상속(inheritance) : is a 관계

상속이란 상위클래스를 확장할 목적으로 하위클래스를 정의하는 것

상속은 올바르게 사용하면 코드를 재사용하고 하위클래스들을 추상화하여 다룰수 있는 강력한 수단이지만,

하위 클래스가 상위 클래스의 구현에 강하게 결합되어있기 때문에 상위 클래스의 매소드 변경이나 추가가 영향을 미치게 된다면 예기치 못한 오류들을 발생시킬 수 있습니다.

=> 캡슐화 문제

그래서 상속은 하위 클래스가 상위 클래스의 진짜 하위 타입인 경우에만 사용해야 합니다.

=> is-a 관계일 때만 사용 [하위클래스 is a 상위클래스]

컴포지션(composition) : has a 관계

기존 클래스를 상속하여 확장하는 대신, 기존 클래스의 인스턴스를 참조하도록 설계

=> 상위 클래스의 구현을 물려받지 않으므로 예상치 못한 결합 관계에서 발생하는 오류를 방지할 수 있음

=> 상속 대비 느슨한 결합과 캡슐화의 이점이 있음

컴포지션 설계 방법 : 인스턴스 변수로 참조하여 사용

  • 기존 클래스를 인스턴스 변수로 선언한 객체를 참조하므로 참조 객체의 내부 구현으로부터 자유로움
  • 참조 대상 구체 클래스를 추상화하여 interface를 만들고, 인스턴스 변수로 구체 클래스가 아닌 인터페이스 선언 후 생성자에서 구체 클래스를 주입할수 있도록 한다면 조금 더 변화에 유연한 설계가 됨
profile
제리하이웨이

0개의 댓글