NMP-Study / EffectiveJava2022

Effective Java Study 2022
5 stars 0 forks source link

아이템 18. 상속보다는 컴포지션을 사용하라 #18

Closed okhee closed 2 years ago

bluewbear commented 2 years ago

상속

그래서 상속 대신 Composition을~

public class ForwardingSet implements Set { private final Set set; public ForwardingSet(Set set) { this.set = set; } public void clear() { set.clear(); } public boolean isEmpty() { return set.isEmpty(); } public boolean add(E e) { return set.add(e); } public boolean addAll(Collection<? extends E> c) { return set.addAll(c); } // ... 블라블라.. }


- NewBluewSet은 Set interface를 활용해서 설계 + Set 인스턴스를 인수로 받는 생성자 제공 
- Set의 여러 구현제를 계속 활용 가능
  - HashSet, TreeSet 등등등
- Wrapper Class, [Decorator pattern](https://gmlwjd9405.github.io/2018/07/09/decorator-pattern.html), [Delegation](https://june0122.github.io/2021/08/21/design-pattern-delegate/)

### 아니아니 그럼 상속은 언제 왜~

- 반드시 하위 클래스가 상위 클래서의 "진짜" 하위 타입인 상황에서만 쓰자
- [is-a 관계](https://codedragon.tistory.com/5358)
  - 비슷한 속성 및 동작을 가지는 객체 
  - [is-a 관계와 has-a 관계 차이](https://unit-15.tistory.com/entry/Java-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5-IS-A-%EA%B4%80%EA%B3%84-HAS-A-%EA%B4%80%EA%B3%84-%EC%B0%A8%EC%9D%B4-%EC%83%81%EC%86%8D-Inheritance)

### 책에서 말하는 핵심 정리

> 상속은 강력하지만 캡슐화를 해친다
> 클래스의 관계가 is-a인 경우면 사용해야한다. 단 이런 관계라도 안심할 수는 없다.
> 상속 대신 Composition, 전달 등의 패턴등을 활용하자. 아니면 Wrapper Class로~