1. 컴포지트 패턴이란? 🌳
컴포지트 패턴(Composite Pattern)은 객체를 트리(tree) 구조로 구성하여 부분-전체 계층 구조를 구현하는 데 사용됩니다. 이를 통해 클라이언트는 개별 객체와 복합 객체를 동일하게 다룰 수 있습니다.
이 패턴은 특히 UI 구성 요소나 파일 시스템처럼 계층적 구조를 가진 시스템에서 유용합니다. 컴포지트 패턴은 단순한 인터페이스를 통해 복잡한 구조를 효율적으로 관리할 수 있게 해줍니다.
2. 컴포지트 패턴의 구성 요소 🧩
- Component (구성 요소): 트리 구조에서 공통 인터페이스를 정의합니다.
- Leaf (잎 노드): 트리 구조의 말단에 해당하며, 실제 작업을 수행합니다.
- Composite (복합 노드): 다른 Leaf 또는 Composite를 자식으로 포함할 수 있으며, 자식 요소에 작업을 위임합니다.
3. 컴포지트 패턴 예제 🎮
Unity3D에서 게임 오브젝트 트리 관리
Unity의 GameObject 트리 구조는 컴포지트 패턴의 대표적인 예입니다. 이를 간단히 구현한 예제를 보겠습니다.
using System;
using System.Collections.Generic;
// Component: 공통 인터페이스
public interface IGameObject
{
void Render();
}
// Leaf: 단일 요소
public class GameObject : IGameObject
{
private string _name;
public GameObject(string name)
{
_name = name;
}
public void Render()
{
Console.WriteLine($"Rendering GameObject: {_name}");
}
}
// Composite: 자식 요소를 포함하는 복합 객체
public class GameObjectGroup : IGameObject
{
private List<IGameObject> _children = new List<IGameObject>();
public void Add(IGameObject gameObject)
{
_children.Add(gameObject);
}
public void Remove(IGameObject gameObject)
{
_children.Remove(gameObject);
}
public void Render()
{
Console.WriteLine("Rendering GameObjectGroup:");
foreach (var child in _children)
{
child.Render();
}
}
}
// 예제 실행
public class Program
{
public static void Main()
{
// Leaf 생성
var player = new GameObject("Player");
var enemy = new GameObject("Enemy");
// Composite 생성 및 Leaf 추가
var scene = new GameObjectGroup();
scene.Add(player);
scene.Add(enemy);
// Composite 내에 또 다른 Composite 추가
var uiGroup = new GameObjectGroup();
var uiElement = new GameObject("HealthBar");
uiGroup.Add(uiElement);
scene.Add(uiGroup);
// 전체 트리 구조 렌더링
scene.Render();
}
}
출력 결과
Rendering GameObjectGroup:
Rendering GameObject: Player
Rendering GameObject: Enemy
Rendering GameObjectGroup:
Rendering GameObject: HealthBar
4. 컴포지트 패턴 사용 시 고려할 점 ⚠️
- 객체의 복잡성: 트리 구조가 너무 깊거나 복잡하면 관리가 어려워질 수 있습니다. 불필요한 계층화를 피해야 합니다.
- 단일 책임 원칙: 컴포지트 객체는 자식 관리와 작업 위임이라는 두 가지 책임을 가지므로, 적절히 설계해야 책임이 분리됩니다.
- 성능: 큰 트리 구조에서는 순회를 최소화하는 최적화가 필요할 수 있습니다.
5. 결론 🚀
컴포지트 패턴은 객체를 계층적으로 구성하고, 클라이언트가 개별 요소와 복합 요소를 동일하게 처리할 수 있게 해줍니다. 특히 Unity3D와 같은 게임 엔진에서 UI, 씬 관리 등에 매우 유용하게 활용됩니다. 하지만 설계 단계에서 계층 구조의 복잡성을 신중히 고려해야 합니다.
6. 관련 링크 🔗
반응형
'Workspace > Design Pattern' 카테고리의 다른 글
책임 연쇄 패턴 (Chain of Responsibility): 요청 처리의 유연한 흐름 만들기 (0) | 2025.01.24 |
---|---|
브리지 패턴 (Bridge Pattern): 구조를 분리해 유연성을 극대화하기 (0) | 2025.01.22 |
상태 패턴 (State Pattern): 객체의 상태에 따라 행동을 다르게 구현하기 (2) | 2025.01.22 |
플라이웨이트 패턴 (Flyweight Pattern): 메모리 절약을 위한 객체 재사용 설계 (0) | 2025.01.22 |
템플릿 메서드 패턴 (Template Method): 알고리즘 뼈대를 정의하는 패턴 (0) | 2025.01.22 |