상속 (Inheritance)이란?
- 상속이란 한 클래스가 다른 클래스의 필드와 메서드를 물려받아 사용하는 방식입니다.
- 상속을 받은 클래스를 자식 클래스라고 하며, 부모 클래스의 기능을 그대로 사용하거나, 오버라이딩하여 변경할 수 있습니다.
- Java에서 extends 키워드로 사용합니다.
합성(Composition)이란?
- 합성이란 한 클래스가 다른 클래스의 인스턴스를 내부에 포함하여 필요한 기능만 선택적으로 사용하는 방식입니다.
- 객체 간 has-a 관계로 이루어지며, new 또는 의존성 주입 방식으로 구현합니다.
상속(Inheritance)의 단점
- 상속을 사용할 경우 불필요한 메서드까지 함께 노출되어, 의도하지 않은 방식으로 클래스가 사용될 수 있습니다.
- 또한, 부모 클래스의 변경이 자식 클래스 전체에 영향을 주기 때문에 유지보수가 어렵습니다.
- 자바는 단일 상속만을 지원하여, 여러 역할을 구현할 경우 클래스가 과도하게 늘어날 수 있습니다.
import java.util.LinkedList;
// 상속 예시 - 불필요한 메서드까지 노출됨
class InheritedQueue extends LinkedList {
public void enqueue(Object item) {
addLast(item);
}
}
합성(Composition)의 장점
- 합성은 필요한 기능만 선택적으로 조합할 수 있어, 설계가 유연하고 관리가 수월합니다.
- 또한, 내부 구현을 감출 수 있어 캡술화에 유리하며, 테스트 시 mock 객체로 대하기도 용이합니다.
- 합성은 인터페이스 기반으로 결합할 수 있어 결합도가 낮아 유연한 구조 설계가 가능합니다.
import java.util.LinkedList;
// 합성 예시 - 필요한 메서드만 노출
class ComposedQueue {
private LinkedList list = new LinkedList();
public void enqueue(Object item) {
list.addLast(item);
}
public Object dequeue() {
return list.removeFirst();
}
}
결론
상속은 부모 클래스의 모든 기능을 자식 클래스가 강제로 물려받기 때문에 결합도가 높고, 불필요한 기능까지 포함될 수 있으며, 부모의 변경이 자식 클래스 전체에 영향을 미치는 등 유지보수가 어려운 단점이 있습니다.
반면 합성은 필요한 기능만 조합해서 사용할 수 있어 결합도가 낮고, 내부 구현을 감춤으로써 캡슐화에 유리합니다. 또한 인터페이스 기반 설계를 활용하면 유연성과 테스트 용이성도 높아져, 실제 개발에서는 상속보다 합성이 더 선호되는 경향이 있습니다.
'CS' 카테고리의 다른 글
CS 스터디 (DB) 13 - 쿼리 실행 순서는 어떻게 될까요? (0) | 2025.05.20 |
---|---|
CS 스터디 (Java) 12 - 직렬화에서 SerialVersionUID 를 선언해야하는 이유는? (1) | 2025.05.17 |
CS 스터디 (Java) 10 - type erasure 에 대해 설명해주세요. (0) | 2025.05.17 |
CS 스터디 (Java) 9 - IntegerCache 에 대해 설명해주세요. (0) | 2025.05.15 |
CS 스터디 (Java) 8 - String, StringBuffer, StringBuilder 차이와 성능 비교 (0) | 2025.05.15 |