- 박싱과 언박싱은 C#에서 값형(value Type)과 참조형(Reference Type) 간의 변환을 의미한다.
- 이 과정은 메모리 구조와 성능에도 영향을 미치기 때문에, C#을 이해할 때 꼭 짚고 넘어가야 한다고 한다.
1. 박싱(Boxing)
- 박싱은 값형 데이터를 참조형으로 변환하는 과정이다.
- 즉, 값형 변수의 값을 힙(heap) 영역에 객체로 감싸서(래핑) 참조형으로 다루게 된다.
- 박싱된 값은 object 타입 변수에 저장될 수 있으며, 참조로 전달된다.
- 이 과정에서 메모리 할당과 복사 비용이 발생하므로 성능 오버헤드가 생길 수 있다.
2. 언박싱(Unboxing)
- 언박싱은 박싱된 객체를 다시 원래의 값형으로 되돌리는 과정이다.
- 힙에 존재하던 객체에서 값을 꺼내에 스택에 할당한다.
- 명시적 형 변환이 필요하며, 런타임 타입 검사가 수행된다.
- 타입이 일치하지 않을 경우 런타임 예외가 발생한다(실행 중 오류).
3. 박싱과 언박싱의 특징 정리
- 박싱과 언박싱은 성능에 영향을 미칠 수 있는 비용이 큰 연산이다.
- 반복적인 박싱/언박싱은 가비지 컬렉션의 부담을 증가시켜 성능 저하로 이어질 수 있다.
- 박싱된 객체는 원래 값형과는 독립적이므로, 값을 수정해도 서로 영향을 주지 않는다.
4. 예제 코드
// 값형 예제
int x = 10;
int y = x;
y = 20;
Console.WriteLine("x: " + x); // 출력: 10
Console.WriteLine("y: " + y); // 출력: 20
// 참조형 예제
int[] arr1 = new int[] { 1, 2, 3 };
int[] arr2 = arr1;
arr2[0] = 4;
Console.WriteLine("arr1[0]: " + arr1[0]); // 출력: 4
Console.WriteLine("arr2[0]: " + arr2[0]); // 출력: 4
// 박싱과 언박싱
int num1 = 10;
object obj = num1; // 박싱
obj = 2; // 이렇게 해도 값 변경됨(박싱, int -> object형으로)
// obj = 2.12; // 이렇게 하면 언박싱 시 런타임 중 오류 발생
// 2.12는 Double형이기 때문
int num2 = (int)obj; // 언박싱
Console.WriteLine("num1: " + num1); // 출력: 10
Console.WriteLine("num2: " + num2); // 출력: 2
'Programming > C#' 카테고리의 다른 글
| C# static 함수의 구조와 그 의미 (2) | 2025.07.09 |
|---|---|
| C# object: 참조 타입의 뿌리 (1) | 2025.07.07 |
| C# 문자열 (0) | 2025.06.17 |
| C# is와 as (Type Checking and Casting) (0) | 2025.06.11 |
| C# ref vs out (Pass by Reference) (0) | 2025.06.11 |
