⚡데코레이터 패턴이란?
데코레이터 패턴(Decorator Pattern)은 객체지향 디자인 패턴 중 하나로 객체에 추가적인 책임을 동적으로 부여할 수 있게 해 준다. 이 패턴은 기본 객체를 래핑하고 이 래핑 된 객체에 새로운 기능을 추가하는 방식으로 동작한다. 즉 객체에 대한 구성 요소를 수정하지 않으면서 객체의 기능을 확장하는 방법을 제공한다.
데코레이터 패턴 구성 요소
- Component: 기본 객체에 대한 인터페이스를 정의
- ConcreteComponent: Component 인터페이스를 구현하는 기본 객체
- Decorator: Component 인터페이스를 구현하면서, 추가적인 책임을 부여할 수 있는 데코레이터를 정의
- ConcreteDecorator: Decorator 인터페이스를 구현하여 데코레이터의 책임을 실제로 구현
⚡데코레이터 패턴은 어떤 경우에 사용하는가 ?
- 객체의 기능을 동적으로 확장해야 할 때: 데코레이터 패턴은 기존 객체의 기능을 동적으로 확장할 수 있도록 해준다. 즉 런타임 시에 객체에 기능을 추가하거나 제거할 수 있다.
- 상속을 통해 기능을 확장하는 것이 어려운 경우: 상속을 사용하면 객체의 기능을 확장할 수 있지만 클래스 계층 구조가 복잡해지고 유지보수가 어려워질 수 있다. 데코레이터 패턴은 상속을 사용하지 않기 때문에 이러한 문제점을 해결할 수 있다.
- 객체를 변경하지 않고도 기능을 추가하고 제거할 수 있는 유연한 구조를 필요로 할 때: 데코레이터 패턴은 객체를 변경하지 않고도 기능을 추가하고 제거할 수 있는 유연한 구조를 제공한다. 기존 객체에 대한 변경 없이도 새로운 기능을 추가할 수 있다.
- 객체의 책임을 분리하고 단일 책임 원칙을 지킬 때: 데코레이터 패턴은 객체의 책임을 분리하여 단일 책임 원칙을 지키도록 해준다. 각각의 데코레이터 클래스는 추가 기능에 대한 책임만을 가지고 있으며 기존 객체는 자신이 가지고 있는 기능에 대한 책임만을 가진다. 이렇게 구현하면 객체 간의 결합도가 낮아지고 유지보수가 용이해진다.
Java I/O 클래스의 경우 데코레이터 패턴을 사용하여 입출력 기능을 제공한다.
예를 들어 BufferedInputStream, BufferedOutputStream, DataInputStream, DataOutputStream 등은 모두 FilterInputStream 또는 FilterOutputStream 클래스를 상속하고 있으며 입출력 스트림에 기능을 추가할 수 있도록 데코레이터 패턴을 활용하고 있다.
⚡데코레이터 패턴의 장단점
장점
- 클래스를 수정하지 않고도 기능을 추가하거나 수정할 수 있다. 이는 기존 코드를 변경하지 않고 확장이 가능하다는 점에서 유연성이 높아진다.
- 데코레이터 클래스는 서로 독립적으로 작성할 수 있으며 이는 코드 재사용성을 높이게 된다.
- 객체 간의 결합도를 낮출 수 있으며 이는 유지보수와 테스트 용이성을 높이게 된다.
단점
- 많은 데코레이터 클래스가 존재할 경우 클래스 수가 늘어나 코드의 복잡성이 증가할 수 있다.
- 코드를 디버깅하거나 이해하는 것이 어려워질 수 있다. 데코레이터 패턴을 사용하는 코드는 기능을 계층적으로 조합하기 때문에 어떤 데코레이터가 어떤 작업을 수행하는지 이해하기 어려울 수 있다.
- 데코레이터 패턴을 사용하면서 성능 저하가 발생할 수 있다. 데코레이터 클래스의 생성 및 호출 과정에서 오버헤드가 발생할 수 있기 때문이다.
⚡데코레이터 소스 정리
⚡생각
데코레이터 패턴을 사용할 때 드는 생각의 경우는 객체의 기능을 쉽게 추가하고 수정할 수 있다는 것이다.
데코레이터 패턴은 객체에 대한 기능을 계층적으로 조합하여 필요한 기능을 동적으로 추가하거나 수정할 수 있게 해 준다. 이는 객체 지향 프로그래밍에서 개방-폐쇄 원칙(OCP)을 준수하는 방법 중 하나이다. 하지만 데코레이터 패턴을 사용할 때에는 코드의 복잡성에 대해서는 다시 한번 생각해 볼 필요성이 있다고 생각한다.
반응형
'디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 플라이웨이트 패턴에 대한 내용 정리 (0) | 2023.04.07 |
---|---|
[디자인 패턴] 퍼사드 패턴에 대한 내용 정리 (0) | 2023.04.05 |
[디자인 패턴] 복합체 패턴에 대한 내용 정리 (0) | 2023.03.26 |
[디자인 패턴] 브리지 패턴에 대한 내용 정리 (0) | 2023.03.25 |
[디자인 패턴] 어댑터 패턴에 대한 내용 정리 (0) | 2023.03.24 |