Contents
🚀 결론: 실무에서는 컴퍼지션을 더 선호!✅ BurgerSet
에서의 컴퍼지션 적용
우리는
BurgerSet
을 만들 때, Burger
와 Coke
를 상속받지 않고 포함(Has-a 관계)했다.즉,
BurgerSet
은 단순히 Burger
와 Coke
객체를 필드로 가지고 있을 뿐이다.public class BurgerSet {
private final Burger burger;
private final Coke coke;
public BurgerSet(Burger burger, Coke coke) {
this.burger = burger;
this.coke = coke;
}
public int getTotalPrice() {
return burger.getPrice() + coke.getPrice();
}
public String getAllNames() {
return burger.getName() + " " + coke.getName();
}
}
📌 컴퍼지션의 특징 (Has-a 관계)
BurgerSet
은 Burger와 Coke를 직접 상속받지 않음
- 대신 각 객체를 필드로 포함하여 조합하는 방식
Burger
와Coke
의 기능을 그대로 사용할 수 있음
BurgerSet
을 변경하더라도Burger
와Coke
에는 영향을 주지 않음 → 유연성이 높아짐
✅ 컴퍼지션을 사용하면 좋은 점 (장점)
1️⃣ 유연성 (객체의 독립성 유지)
BurgerSet
이 Burger
와 Coke
를 상속받았다면, 다른 음료(예: Sprite)나 사이드 메뉴(예: Fries)를 추가하려면 클래스를 수정해야 함.하지만 컴퍼지션을 사용하면 객체를 조합하는 방식으로 확장 가능!
// 감자튀김 추가된 세트 만들기
public class BurgerSetWithFries {
private final Burger burger;
private final Coke coke;
private final Fries fries; // 새로운 객체 추가
public BurgerSetWithFries(Burger burger, Coke coke, Fries fries) {
this.burger = burger;
this.coke = coke;
this.fries = fries;
}
}
→ 기존 코드 수정 없이 새로운 조합을 추가할 수 있음!
2️⃣ 코드 재사용성 증가 (다른 조합도 쉽게 가능)
컴퍼지션을 사용하면 Burger와 Coke를 독립적으로 활용할 수 있다.
예를 들어, 단품 버거, 세트 메뉴, 사이드 메뉴 조합을 쉽게 만들 수 있다.
Burger burger = new Burger("기본버거", 1000);
Coke coke = new Coke("콜라", 500);
BurgerSet set = new BurgerSet(burger, coke);
System.out.println(set.getAllNames()); // "기본버거 콜라"
→
BurgerSet
의 코드 수정 없이 새로운 조합을 만들 수 있음!3️⃣ 유지보수성 향상 (결합도를 낮춤)
만약
BurgerSet
이 Burger
를 상속받았다면버거의 변경이 세트 메뉴 전체에 영향을 미쳐 유지보수가 어려워진다.
하지만 컴퍼지션을 사용하면,
BurgerSet
이 Burger
와 Coke
에 직접 의존하지 않기 때문에각 클래스가 독립적으로 수정될 수 있다.
// Coke 클래스의 가격 계산 방식이 변경되더라도, BurgerSet은 영향을 받지 않음.
public class Coke {
private String name;
private int basePrice;
private boolean isLargeSize;
public Coke(String name, int basePrice, boolean isLargeSize) {
this.name = name;
this.basePrice = basePrice;
this.isLargeSize = isLargeSize;
}
public int getPrice() {
return isLargeSize ? basePrice + 200 : basePrice; // 큰 사이즈는 200원 추가
}
}
→
Coke
의 가격 정책이 바뀌더라도 BurgerSet
은 수정할 필요 없음!✅ 상속 vs 컴퍼지션 비교 (정리)
비교 항목 | 상속(Inheritance) | 컴퍼지션(Composition) |
관계 | is-a 관계 ( ShrimpBurger is a Burger ) | has-a 관계 ( BurgerSet has a Burger and Coke ) |
유연성 | 부모 클래스 변경 시 자식 클래스도 영향받음 | 독립적인 객체를 조합하므로 영향이 적음 |
확장성 | 새로운 기능 추가 시 기존 클래스 변경 필요 | 새로운 객체를 조합하면 됨 (유지보수 쉬움) |
다중 조합 | 어렵다 (다중 상속 불가능) | 여러 객체를 자유롭게 조합 가능 |
🚀 결론: 실무에서는 컴퍼지션을 더 선호!
- 상속은 공통 기능을 공유해야 하는 경우에 적합하지만, 유연성이 떨어지고 유지보수가 어려울 수 있음
- 컴퍼지션은 객체의 독립성을 유지하면서 다양한 조합이 가능하므로, 실무에서 더 많이 사용됨!
BurgerSet
처럼 여러 개의 객체를 조합해야 하는 경우라면 컴퍼지션이 훨씬 적절한 선택
Share article