본문 바로가기

C#

C# Boxing과 Unboxing 성능 분석

C#에서 Boxing과 Unboxing은 값 형식과 참조 형식 간 변환을 의미합니다. 이 과정은 편리하지만 성능에 영향을 줄 수 있어 이해가 필요합니다.

1. Boxing과 Unboxing 개념

Boxing은 값 형식을 객체 타입으로 변환해 힙에 저장하는 과정입니다. 반대로 Unboxing은 객체 타입을 다시 값 형식으로 변환합니다.

2. 성능 저하 원인

Boxing 시 힙 메모리 할당이 발생해 GC 부담이 커집니다. Unboxing은 타입 캐스팅 비용이 추가됩니다. 잦은 Boxing/Unboxing은 프로그램 성능 저하로 이어질 수 있습니다.

3. 성능 비교 코드

using System;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        const int iterations = 10000000;
        Stopwatch sw = new Stopwatch();

        // Boxing
        sw.Start();
        object boxed = 0;
        for (int i = 0; i < iterations; i++)
        {
            boxed = i; // Boxing 발생
        }
        sw.Stop();
        Console.WriteLine($"Boxing: {sw.ElapsedMilliseconds} ms");

        // Unboxing
        sw.Reset();
        sw.Start();
        int unboxed = 0;
        boxed = 123;
        for (int i = 0; i < iterations; i++)
        {
            unboxed = (int)boxed; // Unboxing 발생
        }
        sw.Stop();
        Console.WriteLine($"Unboxing: {sw.ElapsedMilliseconds} ms");
    }
}

4. 성능 최적화 팁

  • 값 형식을 가능한 한 객체로 박싱하지 않고 사용합니다.
  • 제네릭을 활용해 Boxing/Unboxing 발생을 막습니다.
  • 불필요한 캐스팅은 피하고 명확한 타입 사용을 권장합니다.

결론적으로 Boxing과 Unboxing은 편리하지만, 자주 사용하면 성능 저하를 일으킵니다. 알고 쓰면 효율적인 C# 코드를 작성할 수 있습니다.