본문 바로가기

C# 박싱과 언박싱

@코야딩구2025. 7. 7. 20:41

- 박싱과 언박싱은 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
목차