[Java] 63. 컴퍼지션 적용과 장점

백하림's avatar
Feb 17, 2025
[Java] 63. 컴퍼지션 적용과 장점

BurgerSet에서의 컴퍼지션 적용

우리는 BurgerSet을 만들 때, BurgerCoke상속받지 않고 포함(Has-a 관계)했다.
즉, BurgerSet은 단순히 BurgerCoke 객체를 필드로 가지고 있을 뿐이다.
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 관계)

  • BurgerSetBurger와 Coke를 직접 상속받지 않음
  • 대신 각 객체를 필드로 포함하여 조합하는 방식
  • BurgerCoke의 기능을 그대로 사용할 수 있음
  • BurgerSet을 변경하더라도 BurgerCoke에는 영향을 주지 않음 → 유연성이 높아짐

✅ 컴퍼지션을 사용하면 좋은 점 (장점)

1️⃣ 유연성 (객체의 독립성 유지)

BurgerSetBurgerCoke를 상속받았다면, 다른 음료(예: 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️⃣ 유지보수성 향상 (결합도를 낮춤)

만약 BurgerSetBurger를 상속받았다면
버거의 변경이 세트 메뉴 전체에 영향을 미쳐 유지보수가 어려워진다.
하지만 컴퍼지션을 사용하면, BurgerSetBurgerCoke에 직접 의존하지 않기 때문에
각 클래스가 독립적으로 수정될 수 있다.
// 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

harimmon