Composition
기존 클래스가 새로운 클래스의 구성요소가 되는것
상속
장점
- 코드의 재사용을 통해서 중복을 줄인다.
- 확장성이 증가한다.
- 클래스 간의 계층적 관계를 구성함으로써 다형성을 구현할 수 있다.
- 개발 시간이 단축된다.
단점
- 캡슐화를 깨뜨린다.
- 상위 클래스의 구현이 하위 클래스에게 노출되기 때문에 캡슐화가 깨진다.
- 따라서 자식 클래스가 부모 클래스에 강하게 결합 및 의존하게 된다.
- 부모 클래스의 내부 구현이 달라지면 코드 한줄 건드리지 않은 하위 클래스가 오작동할 수 있다.
- 부모클래스의 결함이 자식 클래스에게 넘어온다.
컴포지션
- 상속처럼 기존의 클래스를 확장하는 것이 아닌, 새로운 클래스를 생성하여 private 필드로 기존 클래스의 인스턴스를 참조하는 방식이 바로 컴포지션이다.
- forwarding이라고도 부른다.
- 새로운 클래스이기 때문에, 여기서 어떤한 생성 작업이 일어나더라도 기존의 클래스는 전혀 영향을 받지 않는다는 점이 핵심이다.
- 메서드를 호출하는 방식으로 동작하기 때문에 캡슐화를 깨뜨리지 않는다.
- 상위클래스에 의존하지 않기 때문에 변화에 유연하다.
일반적으로 상속은 Is -a 관계에 있다고 표현한다.
조합도 이와 비슷하게 Has -a 관계에 있다.
그렇다면 상속은 사용하면 안될까?
답은 아니다. 쓰는 경우가 따로 명확히 존재한다는 뜻!
상속을 써야하는 경우
- 명확한 Is -a 관계의 경우
- 상위 클래스가 확장할 목적으로 설계되었고 문서화도 잘되어 있는 경우
'Computer science > JAVA' 카테고리의 다른 글
Interned String in Java (0) | 2023.03.22 |
---|---|
Error & Exception (0) | 2023.03.16 |
GC (0) | 2023.03.16 |
JVM (0) | 2023.03.16 |
Instrinsic Lock (0) | 2023.01.08 |