Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 박싱(Boxing)이란? 개념부터 예제까지 한눈에 이해하기

C# 박싱(Boxing)의 기본 개념

박싱(Boxing)은 C#에서 값 형식(value type)을 객체 형식(object type)으로 변환하는 과정을 말합니다. 값 형식 변수에 저장된 데이터를 힙(heap) 메모리에 존재하는 객체로 감싸는 작업이며, 암시적(implicit) 변환이기 때문에 별도의 형변환 코드 없이 자동으로 수행됩니다.

다음은 박싱의 가장 간단한 예입니다.

int x = 50;
object ob = x; // 박싱 발생

박싱이 동작하는 방식

박싱이 일어나면 스택(stack)에 저장되어 있던 값이 복사되어 힙(heap) 메모리의 객체로 옮겨집니다. 즉, 원본 값과 박싱된 객체는 서로 독립적인 복사본이 됩니다. 따라서 이후 원본 변수의 값을 변경해도 이미 박싱된 객체에는 영향을 주지 않습니다.

박싱은 값 형식을 가비지 컬렉션(garbage-collected) 힙에 저장할 때 유용하게 사용되며, 값 형식에서 object 타입으로의 암시적 변환에 해당합니다.

박싱 예제 코드

아래 예제를 통해 박싱 후 원본 값이 변경될 때 어떤 일이 발생하는지 확인할 수 있습니다.

using System;
using System.Collections.Generic;
using System.Linq;

public class Demo {

    static void Main() {
        int x = 50;
        object ob = x; // 박싱

        x = 100;

        // x 값이 변경되어도 ob에는 영향을 주지 않음
        System.Console.WriteLine("Value Type = {0}", x);
        System.Console.WriteLine("Object Type = {0}", ob);
    }
}

출력 결과:

Value Type = 100
Object Type = 50

위 결과에서 알 수 있듯이, x가 100으로 변경된 후에도 ob에는 여전히 박싱 시점의 값인 50이 유지됩니다. 이는 박싱 시 값이 복사되기 때문입니다.

언박싱(Unboxing)이란?

언박싱(Unboxing)은 박싱의 정반대 동작으로, 힙 메모리의 객체에 저장된 값을 다시 값 형식 변수(스택)로 복사하는 과정입니다. 박싱이 암시적 변환인 것과 달리, 언박싱은 반드시 명시적(explicit) 형변환을 사용해야 합니다.

object ob = 50;
int y = (int)ob; // 언박싱 (명시적 변환)

정리: 박싱 vs 언박싱 비교

  • 박싱(Boxing): 값 형식 → object 형식, 암시적 변환, 스택의 값을 힙으로 복사
  • 언박싱(Unboxing): object 형식 → 값 형식, 명시적 변환 필수, 힙의 값을 스택으로 복사
  • 두 과정 모두 데이터 복사가 발생하므로 빈번한 박싱/언박싱은 성능 저하의 원인이 될 수 있습니다.