1. 플라이웨이트 패턴이란?
플라이웨이트 패턴은 많은 객체를 생성해야 할 때 메모리를 절약하기 위해 공유할 수 있는 객체를 재사용하는 디자인 패턴입니다. 동일한 데이터는 공유하고, 개별 객체는 고유한 상태만 유지하도록 설계합니다. 주로 게임, 그래픽 애플리케이션 등에서 효율적인 리소스 관리에 사용됩니다.
2. 플라이웨이트 패턴의 구성 요소
- Flyweight (공유 객체): 공유 가능한 객체를 정의합니다.
- Intrinsic State (내재 상태): 공유 객체가 공통적으로 가지는 불변 상태입니다.
- Extrinsic State (외재 상태): 객체별로 고유한 가변 상태이며, 외부에서 제공됩니다.
- Flyweight Factory (팩토리): Flyweight 객체를 관리하며, 중복 생성 방지를 위해 기존 객체를 반환하거나 새로 생성합니다.
3. 플라이웨이트 패턴 예제 (C#)
캐릭터 글자 렌더링 최적화 예제
플라이웨이트 패턴은 텍스트 렌더링에서 자주 사용됩니다. 같은 글자를 여러 번 렌더링할 때, 동일한 글자 객체를 재사용해 메모리를 절약합니다.
using System;
using System.Collections.Generic;
// Flyweight (공유 객체)
public class Character
{
public char Symbol { get; private set; } // Intrinsic State
public string Font { get; private set; } // Intrinsic State
public Character(char symbol, string font)
{
Symbol = symbol;
Font = font;
}
public void Display(int positionX, int positionY) // Extrinsic State
{
Console.WriteLine($"Character: {Symbol}, Font: {Font}, Position: ({positionX}, {positionY})");
}
}
// Flyweight Factory
public class CharacterFactory
{
private readonly Dictionary<string, Character> _characters = new();
public Character GetCharacter(char symbol, string font)
{
string key = $"{symbol}_{font}";
if (!_characters.ContainsKey(key))
{
_characters[key] = new Character(symbol, font);
}
return _characters[key];
}
}
// Client Code
class Program
{
static void Main(string[] args)
{
CharacterFactory factory = new CharacterFactory();
// Reusing 'A' with the same font
var charA1 = factory.GetCharacter('A', "Arial");
var charA2 = factory.GetCharacter('A', "Arial");
charA1.Display(10, 20);
charA2.Display(30, 40);
Console.WriteLine(Object.ReferenceEquals(charA1, charA2)); // True
}
}
4. 플라이웨이트 패턴의 사용 시 주의점 ✅
- 상태 구분: 내재 상태와 외재 상태를 명확히 분리해야 합니다. 잘못된 설계는 객체의 불변성을 깨뜨릴 수 있습니다.
- 팩토리 관리: Flyweight Factory에서 객체의 생명 주기를 잘 관리해야 메모리 누수를 방지할 수 있습니다.
- 적합한 상황: 객체 생성 비용이 크고, 동일한 상태의 객체가 반복될 때 효과적입니다. 객체가 항상 고유 상태를 가진다면 이 패턴은 적합하지 않을 수 있습니다.
5. 결론
플라이웨이트 패턴은 메모리 사용을 최적화하고 객체 생성 비용을 줄이는 강력한 도구입니다. 특히 대규모 애플리케이션에서 성능 병목을 해결하는 데 유용합니다. 하지만 상태 관리와 사용 환경에 주의해야 제대로 된 효과를 볼 수 있습니다. 😊
6. 관련 링크
반응형
'Workspace > Design Pattern' 카테고리의 다른 글
컴포지트 패턴 (Composite Pattern): 객체를 트리 구조로 구성하여 복잡성을 줄이기 (0) | 2025.01.22 |
---|---|
상태 패턴 (State Pattern): 객체의 상태에 따라 행동을 다르게 구현하기 (2) | 2025.01.22 |
템플릿 메서드 패턴 (Template Method): 알고리즘 뼈대를 정의하는 패턴 (0) | 2025.01.22 |
미디에이터 패턴 (Mediator Pattern): 객체 간의 복잡한 상호작용을 단순화하기 (0) | 2025.01.22 |
빌더 패턴 (Builder Pattern): 객체 생성의 유연함을 더하다 (0) | 2025.01.22 |