0Pricing
C# Academy · 강의

박싱과 언박싱

object로 변환할 때 발생하는 비용을 이해합니다.

박싱과 언박싱은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

박싱이란?

박싱은 값 형식을 객체 안에 넣어 참조 형식처럼 다룰 수 있게 합니다. object o = 5;는 int 값을 힙에 박싱합니다.

using System;

class Program
{
    static void Main()
    {
        int n = 5;
        object o = n;   // boxing
        Console.WriteLine("Boxed value: " + o);
    }
}

박싱이 발생하는 이유

값 형식을 object 형식의 변수(또는 인터페이스)에 할당할 때마다 박싱이 발생합니다. 실행 환경은 값의 복사본을 담은 힙 객체를 할당합니다.

using System;

class Program
{
    static void Main()
    {
        double d = 3.14;
        object boxed = d;   // boxing copies d into a heap object
        Console.WriteLine(boxed);
    }
}

언박싱이란?

언박싱은 명시적 캐스트를 사용해 상자에서 값 형식을 다시 꺼냅니다. 캐스트 형식은 박싱된 형식과 정확히 일치해야 합니다.

using System;

class Program
{
    static void Main()
    {
        object o = 42;        // boxing
        int n = (int)o;        // unboxing
        Console.WriteLine("Unboxed: " + n);
    }
}

언박싱에는 올바른 형식이 필요합니다

언박싱할 때는 원래 형식과 정확히 같은 형식을 사용해야 합니다. 다른 형식으로 언박싱하면 InvalidCastException이 발생합니다.

using System;

class Program
{
    static void Main()
    {
        object o = 100;
        try
        {
            long wrong = (long)o;   // InvalidCastException at runtime
            Console.WriteLine(wrong);
        }
        catch (InvalidCastException)
        {
            Console.WriteLine("Must unbox to int, not long");
        }
    }
}

박싱은 복사본을 만듭니다

박싱은 값을 복사합니다. 그 후 원래 값을 변경해도 박싱된 복사본은 변경되지 않습니다.

using System;

class Program
{
    static void Main()
    {
        int n = 1;
        object o = n;   // box copies 1
        n = 99;
        Console.WriteLine("original=" + n + ", boxed=" + o);
    }
}

박싱의 비용

박싱할 때마다 힙 메모리가 할당되고 가비지 컬렉션 부담이 커집니다. 자주 실행되는 반복문에서는 이러한 추가 비용이 성능을 크게 떨어뜨릴 수 있습니다.

using System;

class Program
{
    static void Main()
    {
        // Each iteration boxes an int -> many heap allocations
        object sumBox = 0;
        for (int i = 0; i < 5; i++)
        {
            int current = (int)sumBox + i;
            sumBox = current;   // box again
        }
        Console.WriteLine("Result: " + sumBox);
    }
}

제네릭으로 박싱 피하기

List<int>와 같은 제네릭 컬렉션은 예전의 비제네릭 ArrayList와 달리 값 형식을 박싱하지 않고 저장합니다.

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var list = new List<int>();   // no boxing
        list.Add(1);
        list.Add(2);
        int first = list[0];           // no unboxing
        Console.WriteLine("First: " + first);
    }
}

인터페이스를 사용한 박싱

구조체를 인터페이스 변수에 할당할 때도 박싱이 발생합니다. 인터페이스 참조가 힙 객체를 가리켜야 하기 때문입니다.

using System;

class Program
{
    static void Main()
    {
        int n = 7;
        IComparable c = n;   // boxing to interface
        Console.WriteLine(c.CompareTo(10));
    }
}

박싱된 형식 확인하기

언박싱하기 전에 is를 사용해 실행 중인 환경에서 박싱된 객체의 형식을 확인하면 안전하게 언박싱할 수 있습니다.

using System;

class Program
{
    static void Main()
    {
        object o = 3.5;
        if (o is double d)
            Console.WriteLine("It is a double: " + d);
        else
            Console.WriteLine("Not a double");
    }
}

문자열 연결에서의 박싱

값 형식을 문자열과 연결하면 박싱될 수 있습니다. 보간이나 ToString을 사용하면 대개 더 명확하지만, 이 경우 박싱 비용은 보통 무시할 수 있을 정도입니다.

using System;

class Program
{
    static void Main()
    {
        int count = 3;
        string msg = "Count is " + count;   // count is converted
        Console.WriteLine(msg);
    }
}

종합하기

박싱은 값의 세계와 참조의 세계를 연결하지만 할당 비용이 발생합니다. 박싱을 피하려면 제네릭을 우선 사용하고, 안전하게 확인한 뒤 정확히 같은 형식으로 언박싱하십시오.

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        object boxed = 256;
        if (boxed is int value)
            Console.WriteLine("Safely unboxed: " + value);

        var noBox = new List<int> { 1, 2, 3 };
        Console.WriteLine("Generic count: " + noBox.Count);
    }
}

빠른 확인

박싱과 언박싱에 대한 이해도를 확인해 보십시오.

복습

박싱은 값 형식을 힙 객체 안에 넣는 작업입니다(예: object o = 5;). 언박싱은 명시적 캐스트를 사용해 정확히 같은 원래 형식으로 값을 꺼내는 작업입니다. 박싱은 값을 복사하고 메모리를 할당하므로 가비지 컬렉션 부담이 커집니다. 박싱을 피하려면 List<int>와 같은 제네릭 컬렉션을 우선 사용하고, 안전한 언박싱에는 is를 사용하십시오.

using System;

class Program
{
    static void Main()
    {
        object boxed = 42;     // box
        int n = (int)boxed;     // unbox
        Console.WriteLine(n);
    }
}

자주 묻는 질문

“박싱과 언박싱” 강의는 무료인가요?

네 — “박싱과 언박싱” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“박싱과 언박싱”에서 뭘 배우나요?

object로 변환할 때 발생하는 비용을 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“박싱과 언박싱” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 값 형식과 참조 형식 비교
  2. 박싱과 언박싱
  3. 암시적 및 명시적 변환
  4. Convert 클래스와 구문 분석
← C# Academy(으)로 돌아가기