데코레이터 패턴은 어떻게 작동하나요?
데코레이터 패턴은 소프트웨어 디자인 패턴 중 하나로, 객체에 동적으로 추가적인 기능을 첨가할 수 있도록 하는 구조적 패턴입니다.
이 패턴을 사용하면 기능을 확장하기 위해 기존 클래스를 수정하거나 서브클래싱할 필요 없이, 객체를 감싸는(wrapper) 형태로 새로운 행동을 덧붙일 수 있습니다.
--- 데코레이터 패턴의 핵심 아이디어 - 기능의 동적 확장 : 기존 객체를 포함하면서, 원래 객체의 인터페이스를 유지하고 기능을 추가하거나 변경할 수 있다. - 객체 감싸기(Wrapper) : 데코레이터 객체가 원래 객체를 내부에 참조하고 메서드를 호출하기 전에 또는 후에 추가 작업을 수행한다.
- 기존 클래스에 영향 없음 : 기존 코드의 변경 없이 새로운 기능을 적용 가능하며, 여러 데코레이터를 조합해 다양한 기능을 유연하게 구현할 수 있다. --- 구성 요소 1. Component (컴포넌트 인터페이스) - 기능을 정의하는 인터페이스 또는 추상 클래스. 2. ConcreteComponent (기본 컴포넌트) - 기본 기능을 구현하는 실제 객체. 3. Decorator (데코레이터 추상 클래스) - Component 인터페이스를 구현하며, 내부에 Component 객체를 참조한다.
4. ConcreteDecorator (구체 데코레이터) - Decorator를 상속하여 추가 기능을 덧붙인다. --- 동작 원리 - 클라이언트는 실제 객체(ConcreteComponent)에 접근하지 않고, Component 타입으로 된 객체를 사용한다.
- 필요한 기능 확장이 있으면 ConcreteDecorator를 생성하여 기존 객체를 감싸고, 추가 기능을 수행하도록 한다.
- 여러 데코레이터를 중첩해 점진적으로 기능을 더할 수 있다. --- 예시 (의사 코드) ```java interface Coffee { String getDescription(); double getCost(); } class SimpleCoffee implements Coffee { String getDescription() { return "Simple coffee"; } double getCost() { return 2.0; } } abstract class CoffeeDecorator implements Coffee { protected Coffee decoratedCoffee; CoffeeDecorator(Coffee c) { this.decoratedCoffee = c; } String getDescription() { return decoratedCoffee.getDescription(); } double getCost() { return decoratedCoffee.getCost(); } } class MilkDecorator extends CoffeeDecorator { MilkDecorator(Coffee c) { super(c); } String getDescription() { return decoratedCoffee.getDescription() + ", Milk"; } double getCost() { return decoratedCoffee.getCost() + 0.5; } } class SugarDecorator extends CoffeeDecorator { SugarDecorator(Coffee c) { super(c); } String getDescription() { return decoratedCoffee.getDescription() + ", Sugar"; } double getCost() { return decoratedCoffee.getCost() + 0.3; } } // 사용 예 Coffee coffee = new SimpleCoffee(); coffee = new MilkDecorator(coffee); coffee = new SugarDecorator(coffee); System.out.println(coffee.getDescription()); // Simple coffee, Milk, Sugar System.out.println(coffee.getCost()); // 2.8 ``` --- 요약 - 데코레이터 패턴은 객체에 기능을 동적으로 추가 하는 구조적 패턴이다. - 객체를 감싸면서 원래 인터페이스를 유지해 확장성을 높인다. - 기존 클래스 변경 없이 기능을 조합하고 확장할 수 있다. - 고객 요구사항 변화에 유연하게 대응하는 데 효과적이다.