컴포지션(Composition)
컴포지션은 다른 클래스의 객체를 더 큰 클래스의 일부로 포함시키는 방식이다. 이것은 "has-a" 관계를 나타내는데, 한 클래스가 다른 클래스를 포함하고 그 클래스의 기능을 사용할 수 있게 해준다.
컴포지션 vs 상속
- 컴포지션은 "has-a" 관계를 나타내며 한 클래스는 다른 클래스의 객체를 포함하고 있다. 상속은 "is-a" 관계를 나타내며 한 클래스는 다른 클래스를 확장(상속)한다. 예를 들어, 자식 클래스가 부모 클래스를 상속받는 경우 자식 클래스는 부모 클래스의 하위 유형이다.
- 컴포지션은 낮은 결합도를 가지며. 클래스 간의 결합도가 느슨하며 한 클래스의 변경이 다른 클래스에 큰 영향을 미치지 않는다. 상속은 높은 결합도를 가질 수 있으며 부모 클래스의 변경이 하위 클래스에 영향을 미칠 수 있다.
- 컴포지션은 다중컴포지션을 구현하기 쉽지만, 상속은 다중상속을 구현할 수 없다.
컴포지션 예시 코드
// 엔진 클래스
class Engine {
private String type;
public Engine(String type) {
this.type = type;
}
public void start() {
System.out.println("Engine started");
}
}
// 자동차 클래스
class Car {
private String make;
private String model;
private Engine engine; // 엔진을 포함하는 컴포지션 관계
public Car(String make, String model, Engine engine) {
this.make = make;
this.model = model;
this.engine = engine;
}
public void start() {
System.out.println("Car started");
engine.start(); // 엔진을 사용
}
}
public class Main {
public static void main(String[] args) {
Engine carEngine = new Engine("V6");
Car myCar = new Car("Toyota", "Camry", carEngine);
myCar.start(); // 자동차 시작 시 엔진도 시작
}
}
- 'Car' 클래스는 'Engine' 객체를 포함하고 있다.
- 'Car' 클래스가 'Engine' 클래스를 포함하기 때문에, 'Car'은 'Engine'의 기능을 사용할 수 있다.
- 'Engine'과 'Car'은 느슨하게 결합되어 있으며, 'Car' 객체가 생성될 때 'Engine' 객체를 주입받는다.
- 'Car' 클래스가 다른 종류의 엔진을 사용하도록 변경하기 쉽다.
상속 예시 코드 :
// 엔진 클래스
class Engine {
public void start() {
System.out.println("Engine started");
}
}
// 자동차 클래스에서 상속을 사용
class Car extends Engine {
private String make;
private String model;
public Car(String make, String model) {
this.make = make;
this.model = model;
}
public void startCar() {
System.out.println("Car started");
start(); // 상속받은 엔진의 start 메서드 호출
}
}
public class Main {
public static void main(String[] args) {
Car myCar = new Car("Toyota", "Camry");
myCar.startCar(); // 자동차 시작 시 엔진도 시작
}
}
- 'Car' 클래스는 'Engine' 클래스를 상속한다.
- 'Car' 클래스는 'Engine' 클래스의 모든 기능을 상속하므로 'start' 메서드를 직접 호출할 수 있다.
- 'Car'과 'Engine'은 강하게 결합되어 있으며, 'Car'는 항상 'Engine'의 일부여야 한다.
- 'Car' 클래스가 다른 종류의 엔진을 사용하도록 변경하려면 상속 구조를 변경해야 할 수 있다.
'Languages > Java' 카테고리의 다른 글
[Java] Stream API (0) | 2023.09.14 |
---|---|
[Java] Error & Exception (0) | 2023.09.07 |
[Java] Garbage Collection (0) | 2023.09.06 |
[Java] JVM (Java Virtual Machine) (0) | 2023.09.06 |
[Java] 고유 락 (Intrinsic Lock) (0) | 2023.08.31 |