본문 바로가기

C#

C# 애플리케이션에서 메모리 풀(Object Pool) 구현하기

메모리 풀(Object Pool)은 자주 생성되고 파괴되는 객체의 재사용을 통해 성능을 최적화하는 기법입니다. C# 애플리케이션에서 효율적인 메모리 관리를 위해 직접 메모리 풀을 구현하는 방법을 알아봅니다.

1. 메모리 풀의 개념

메모리 풀은 미리 생성해둔 객체를 필요할 때마다 꺼내 쓰고, 사용 후 다시 반환하여 새 객체 생성 비용을 줄입니다. 특히 게임, 네트워크 프로그래밍 등에서 효과적입니다.

2. 간단한 Object Pool 구현 예제

using System;
using System.Collections.Concurrent;

public class ObjectPool where T : new()
{
    private readonly ConcurrentBag _objects;

    public ObjectPool()
    {
        _objects = new ConcurrentBag();
    }

    public T GetObject()
    {
        if (_objects.TryTake(out T item))
        {
            return item;
        }
        else
        {
            return new T();
        }
    }

    public void ReturnObject(T item)
    {
        _objects.Add(item);
    }
}

// 사용 예시
public class MyClass
{
    public int Value { get; set; }
}

class Program
{
    static void Main()
    {
        var pool = new ObjectPool();
        var obj = pool.GetObject();
        obj.Value = 10;
        Console.WriteLine(obj.Value);
        pool.ReturnObject(obj);
    }
}

3. 주의사항

반환된 객체는 재사용되므로 초기화가 필요한 경우, GetObject() 호출 시 필요한 상태로 초기화 코드를 추가해야 합니다. 또한 스레드 안전을 확보하기 위해 ConcurrentBag<T>를 사용했습니다.