박싱과 언박싱
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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.