데코레이터 패턴은 어떻게 작동하나요?

데코레이터 패턴은 소프트웨어 디자인 패턴 중 하나로, 객체에 동적으로 추가적인 기능을 첨가할 수 있도록 하는 구조적 패턴입니다.

이 패턴을 사용하면 기능을 확장하기 위해 기존 클래스를 수정하거나 서브클래싱할 필요 없이, 객체를 감싸는(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 ``` --- 요약 - 데코레이터 패턴은 객체에 기능을 동적으로 추가 하는 구조적 패턴이다. - 객체를 감싸면서 원래 인터페이스를 유지해 확장성을 높인다. - 기존 클래스 변경 없이 기능을 조합하고 확장할 수 있다. - 고객 요구사항 변화에 유연하게 대응하는 데 효과적이다.


관련 게시글

자바에서 병렬 처리를 구현하는 방법은 무엇인가요?

자바에서 병렬 처리는 여러 작업을 동시에 실행하여 프로그램의 성능과 응답성을 향상시키는 기법입니다....

문제 해결 및 면접 질문

문제 해결 및 면접 질문에 관한 글 --- 1. 문제 해결의 중요성 문제 해결 능력은 개인과...

자바에서 중복된 요소를 제거하는 방법은 무엇인가요?

자바(Java)에서 중복된 요소를 제거하는 방법에는 여러 가지가 있습니다. 주로 컬렉션프레임워크를 활용하...

자바 Collections에서 정렬하는 방법은 무엇인가요?

자바 Collections에서 정렬하는 방법에 대해 설명드리겠습니다. 자바에서는 컬렉션(Collection) 자료구조의...

자바의 메모리 누수 문제를 해결하는 방법은 무엇인가요?

자바의 메모리 누수 문제를 해결하는 방법 --- 1. 메모리 누수란? 자바는 가비지 컬렉션(GC)...

팩토리 패턴을 사용하여 주어진 문제를 해결해보세요.

팩토리 패턴을 사용하여 주어진 문제를 해결해보세요. --- 1. 팩토리 패턴이란? 팩토리 패턴...