어그리게이션(Aggregation)과 컴포지션(Composition)은 객체 지향 프로그래밍에서 클래스 간의 관계를 설명하는 두 가지 중요한 개념입니다. 두 개념 모두 "부분-전체 관계(Part-Whole Relationship)"를 나타내지만, 그 결합의 강도와 객체 간의 의존성 측면에서 차이가 있습니다.
1. 어그리게이션(Aggregation)
어그리게이션은 객체 간의 약한 결합(Loose Coupling)을 나타내는 관계입니다. 이는 "부분-전체" 관계에서 부분(Part) 객체가 전체(Whole) 객체에 포함되지만, 두 객체는 독립적인 생명 주기를 가집니다. 즉, 전체 객체가 없어져도 부분 객체는 여전히 존재할 수 있습니다.
- 특징:
- 독립적인 생명 주기: 전체 객체가 삭제되어도 부분 객체는 계속 존재할 수 있습니다.
- 약한 결합: 부분 객체와 전체 객체 간의 결합이 비교적 약합니다.
- 부분 객체의 재사용 가능성: 부분 객체는 다른 전체 객체에서 재사용될 수 있습니다.
- 예시:
- 학교와 학생: 학교(School) 클래스가 여러 학생(Student) 객체를 포함하고 있을 때, 학교가 없어져도 학생들은 여전히 존재할 수 있습니다.
class Student {
private String name;
public Student(String name) {
this.name = name;
}
}
class School {
private List<Student> students;
public School() {
students = new ArrayList<>();
}
public void addStudent(Student student) {
students.add(student);
}
}
2. 컴포지션(Composition)
컴포지션은 객체 간의 강한 결합(Strong Coupling)을 나타내는 관계입니다. 이는 "부분-전체" 관계에서 부분 객체가 전체 객체의 일부로 포함되며, 전체 객체가 삭제되면 부분 객체도 함께 삭제됩니다. 부분 객체는 전체 객체에 강하게 의존하며, 독립적으로 존재할 수 없습니다.
- 특징:
- 종속적인 생명 주기: 전체 객체가 삭제되면 부분 객체도 함께 삭제됩니다.
- 강한 결합: 부분 객체와 전체 객체 간의 결합이 강합니다.
- 부분 객체의 독립성 없음: 부분 객체는 독립적으로 존재할 수 없으며, 전체 객체에 종속적입니다.
- 예시:
- 자동차와 엔진: 자동차(Car) 클래스가 엔진(Engine) 객체를 포함하고 있을 때, 자동차가 없어지면 엔진도 함께 없어집니다. 엔진은 자동차의 일부로 간주됩니다.
class Engine {
private String type;
public Engine(String type) {
this.type = type;
}
}
class Car {
private Engine engine;
public Car(String engineType) {
this.engine = new Engine(engineType);
}
}
어그리게이션과 컴포지션 비교
특성 | 어그리게이션 (Aggregation) | 컴포지션 (Composition) |
---|---|---|
결합도 | 약한 결합 (Loose Coupling) | 강한 결합 (Strong Coupling) |
생명 주기 | 독립적인 생명 주기 (부분 객체는 전체 객체 없이도 존재 가능) | 종속적인 생명 주기 (전체 객체가 사라지면 부분 객체도 사라짐) |
객체 간 의존성 | 부분 객체는 독립적이며, 다른 전체 객체에 포함될 수 있음 | 부분 객체는 전체 객체에 강하게 의존하며, 독립적으로 존재 불가 |
예시 | 학교와 학생 (학교가 없어도 학생은 존재) | 자동차와 엔진 (자동차가 없어지면 엔진도 함께 사라짐) |
요약
- 어그리게이션: 클래스 간의 관계에서 부분 객체가 전체 객체와 약한 결합을 가지며, 전체 객체가 없어져도 부분 객체는 여전히 존재할 수 있는 관계를 나타냅니다.
- 컴포지션: 클래스 간의 관계에서 부분 객체가 전체 객체에 강하게 결합되며, 전체 객체가 없어지면 부분 객체도 함께 삭제되는 관계를 나타냅니다.
이 두 개념은 객체 지향 설계에서 중요한 역할을 하며, 객체 간의 관계를 설계할 때 결합의 강도를 결정하는 데 사용됩니다.
'Java Study' 카테고리의 다른 글
jar, war 설명과 차이 (0) | 2024.10.09 |
---|---|
Shallow copy와 Deep copy (0) | 2024.09.19 |
파라미터화된 타입(Parameterized Type)과 원시 타입(Raw Type) (0) | 2024.08.19 |
제네릭 타입 매개변수(T)와 와일드카드(?)의 역할 (0) | 2024.08.19 |
바운딩과 와일드카드의 차이 (0) | 2024.08.19 |