[C#] 박싱과 언박싱

KYJ의 Tech Velog·2023년 7월 20일
0

C#

목록 보기
3/6

이전 포스팅인 [C#] 메모리에서 값 형식과 참조 형식에 대해서 이야기했었습니다.

박싱과 언박싱은 값 형식과 참조 형식 간의 형병환입니다.

박싱(Boxing)

값 형식을 참조 형식으로 변환해주는 작업입니다.

int i = 123;
object o = i; // Boxing

스택 영역에 저장된 값 형식의 변수가 힙 영역으로 복사가 일어납니다.

그리고 힙 영역에 복사된 이 데이터를 참조 형식의 변수가 가리키게 되는 것입니다.

언박싱(Unboxing)

참조 형식을 값 형식으로 변환해주는 작업입니다.

int i = 123;
object o = i;
int j = (int)o;

힙 영역에 있던 데이터가 스택 영역에 복사됩니다.

💡박싱과 언박싱을 사용하는 이유

기본적으로 배열에는 선언할 때 지정한 한 가지 형식의 데이터밖에 추가할 수 없습니다.

하지만 배열을 object 형식으로 선언한다면 다양한 형식의 데이터를 배열에 추가할 수 있게 됩니다.

object[] array = new object[2];

array[0] = 1;
array[1] = "hello";

이 때 내부적으로 배열에 데이터가 추가될 때 박싱이 발생합니다.

그리고 배열의 데이터를 다시 원래 형식으로 사용하고자 할 때 언박싱이 발생하게 되는 거죠.

박싱과 언박싱을 지양하는 이유

매우 편리해보이지만 큰 단점이 있습니다.

메모리를 사용함에 있어서 비효율적이라는 점입니다.

박싱을 할 때에는 스택 영역에 있는 값이 힙 영역에 복사되고, 언박싱을 할 때에는 힙 영역에 있던 데이터를 스택 영역으로 가져오면서 힙에 가비지가 쌓이게 됩니다.

Reference

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

잘 읽었습니다. 좋은 정보 감사드립니다.

답글 달기