목차
개요
이번 글에선 Object Structural Pattern인 컴포 패턴에 대해 알아보겠습니다
내용
요약
부분-전체 계층구조를 표현하기 위해 객체를 트리 구조로 합치자
예시
디자인 패턴의 단골 예시인 파워포인트, 구글 스라이드같은 GUI 앱을 생각해봅시다. 파워포인트는 큰 요소를 만들기 위해 작은 요소들을 하나의 그룹으로 묶을 수 있습니다.
이러한 GUI 앱을 만들기 위해 가장 처음 생각해볼만한 구조는 Text, Line, Square같은 primitive 클래스를 정의하고 이를 담을 수 있는 container 클래스를 작성하는 것입니다.
하지만 이러한 구조는 단점이 있습니다. 이 클래스를 쓰는 개발자들은 반드시 primitive와 container를 따로 취급해줘야 한다는 것입니다. 컴포짓 패턴은 사용자들이 이런 구분을 할 필요가 없게 해줍니다.
컴포짓 패턴의 핵심은 primitive와 container를 모두 포함하는 추상 클래스를 정의하는 것입니다. 이 클래스를 이용해 재귀적으로 트리 구조를 만들 수 있습니다.
구조
이야깃거리
이 패턴을 구현할 땐 고려해야할 점이 꽤 있습니다.
- 부모 객체 참조 변수. 자식이 부모 객체의 참조를 가지고 있으면 편합니다.
- 컴포넌트 인터페이스 극대화. 사용자가 리프 노드와 컨테이너 노드를 모르게 하려면 컴포넌트 인터페이스에 최대한 많은 공통 연산을 넣는 것이 좋습니다.
- 그 외 트리 구조를 구현할 때 고민할만한 여러가지 내용들도 같이 고려해주면 좋습니다.
언제 써야 할까?
- 부분 전체 계층 구조의 객체들을 표현하고 싶을 때
- 사용자가 합쳐진 객체와 각각의 객체의 구분을 할 필요가 없게하고 싶을 때
장단점
- (Pros) 사용자에게 사용하기 쉬운 인터페이스를 제공해줍니다.
- (Cons) 컴포넌트 인터페이스를 너무 과하게 일반화하면 이해하기 어려워집니다.
Case Study
Case 1. Java AWT
자바의 GUI 프레임워크 중 하나인 AWT는 컴포짓 패턴의 아주 전형적인 예입니다. java.awt 패키지의 클래스들을 살펴보면 Component, Container 클래스를 볼 수 있는데 위 구조와 거의 같은 역할을 합니다.
- https://docs.oracle.com/javase/8/docs/api/java/awt/Component.html
- https://docs.oracle.com/javase/8/docs/api/java/awt/Container.html
- https://docs.oracle.com/javase/8/docs/api/java/awt/Button.html
출처
GoF Design Patterns
'Design Patterns' 카테고리의 다른 글
[Design Patterns] Facade (0) | 2024.03.24 |
---|---|
[Design Patterns] Decorator (0) | 2024.03.20 |
[Design Patterns] Bridge (0) | 2024.03.16 |
[Design Patterns] Adapter (0) | 2024.03.16 |
[Design Patterns] Singleton (0) | 2024.02.25 |