개발 지식/디자인패턴

경량 패턴

게임만드는학생 2025. 4. 18. 17:39

경량패턴은 메모리 최적화를 위한 패턴이다. 

 

많은 객체를 생성해야할 때, 에를 들어, 나무 오브젝트를 생성할 때, texture와 model은 동일하지만 위치와 색 등을 바꿔 숲을 만들 수 있다. 이 때, 100개의 나무라면 텍스처와 모델도 100개가 생성되는데, 동일한 이 백개를 공유데이터 1개로 대체하여 메모리를 최적화하는 것이다. 

이 때, texture, model 같은 공유되는 데이터를 내부상태라 하고, 위치, 값 등 달라지는 변수를 외부상태라 한다. 

 

내부 상태는 모든 나무 객체가 참조하게끔 하고 외부상태만 설정하게끔 하면 된다. 

 

타일도 마찬가지로 고유한 타일의 값, 텍스처, 이 타일위에서의 캐릭터 이동속도 등은 변하지않는다. 

그렇지만 위치는 매번 다르다. 

 

따라서 각 타일마다 객체를 하나씩 만들어두고, 타일마다 해당타입의 클래스를 참조하게 둔다. 

그리고 draw할 때는 위치만 변경해서 같은 타입을 그린다. 

 

using System;
using System.Collections.Generic;

// 경량 객체 - TreeType
public class TreeType
{
    public string Species { get; private set; }  // 나무의 종류 (예: 소나무, 단풍나무 등)
    public string LeafColor { get; private set; } // 나무의 잎 색상

    public TreeType(string species, string leafColor)
    {
        Species = species;
        LeafColor = leafColor;
    }
}

// TreeNode - 실제 나무 객체
public class TreeNode
{
    public TreeType Type { get; private set; }  // 경량 객체 참조 (나무의 종류와 색상)
    public string Position { get; private set; }  // 나무의 위치
    public float Height { get; private set; }     // 나무의 높이

    public TreeNode(string position, float height, TreeType type)
    {
        Position = position;
        Height = height;
        Type = type;
    }

    // 트리 정보를 출력하는 메서드
    public void Display()
    {
        Console.WriteLine($"Tree at {Position}: {Type.Species} with {Type.LeafColor} leaves, Height: {Height} meters");
    }
}

// TreeType 객체를 관리하는 클래스 - TreeTypeFactory
public class TreeTypeFactory
{
    private Dictionary<string, TreeType> treeTypes = new Dictionary<string, TreeType>();

    // 주어진 종류와 색상에 대한 TreeType을 반환 (경량 객체)
    public TreeType GetTreeType(string species, string leafColor)
    {
        string key = species + leafColor;
        if (!treeTypes.ContainsKey(key))
        {
            // TreeType이 없으면 새로 생성
            treeTypes[key] = new TreeType(species, leafColor);
        }
        return treeTypes[key];
    }
}

public class Program
{
    public static void Main()
    {
        // 경량 객체 관리 팩토리
        TreeTypeFactory typeFactory = new TreeTypeFactory();

        // 트리 노드 타입 생성 (경량 객체)
        TreeType pineTree = typeFactory.GetTreeType("Pine", "Green");
        TreeType mapleTree = typeFactory.GetTreeType("Maple", "Red");

        // 트리 객체 생성 (각각 고유한 위치와 높이를 가지지만, 타입은 공유)
        TreeNode tree1 = new TreeNode("Park", 5.0f, pineTree);
        TreeNode tree2 = new TreeNode("Street", 3.5f, mapleTree);
        TreeNode tree3 = new TreeNode("Garden", 7.2f, pineTree);
        TreeNode tree4 = new TreeNode("Hill", 10.0f, mapleTree);

        // 트리 정보 출력
        tree1.Display();
        tree2.Display();
        tree3.Display();
        tree4.Display();
    }
}

 

이 처럼 하나의 공용 데이터클래스를 만들고 이를 참조하여 동일한 메모리가 낭비되지 않게 최적화하는 기법이 경량패턴이다. 

'개발 지식 > 디자인패턴' 카테고리의 다른 글

이중버퍼  (0) 2025.04.21
상태 패턴  (0) 2025.04.19
싱글턴 패턴  (1) 2025.04.19
관찰자 패턴  (0) 2025.04.18
명령 패턴  (0) 2025.04.18