[C# 문법] 박싱과 언박싱이란?

참조 사이트

값 타입(Value Type)

  • 값 타입(Value Type) 은 스택영역 에 저장합니다. (int, char, double...)
  • 값 타입은 Object를 상속받은 System.ValueType을 상속받은 구조체입니다. (System.ValueType)
  • int -> System.Int32로 정의. 상속관계는 Object -> ValueType -> Int32
  • char -> System.Char로 정의. 상속관계는 Object -> ValueType -> Char

참조 타입(Reference Type)

  • 모든 타입의 base class인 System.Object를 상속받으며, 힙 영역에 저장됩니다.
  • 값 형식은 해당 데이터에 직접 값이 저장된다면, 참조 타입은 데이터에 대한 참조가 저장됩니다.
  • 참조 타입은 처음 변수를 선언하면 값 타입과 달리 메모리가 생성되지 않습니다.
Class A
{

}
A a = null; // 메모리 생성되지 않음.
  • 이후 A를 생성한다면 실제 생성된 A는 힙에 메모리를 할당, a는 그 값에 대한 참조만 스택에 저장합니다.
A a = new A(); // 메모리 생성, 변수 a는 생성된 A의 참조(주소)만 갖게 됨.
  • a를 새로운 aa에 할당한다면 새로운 메모리를 할당하지 않고 참조하는 값만 복사
A aa = a; // 새로운 메모리를 할당하지 않고, a의 참조 값을 갖는 값만 복사함.

박싱(Boxing)

  • 값 타입(Value Type)의 객체를 참조 타입(Reference Type)로 변환하는 작업을 말합니다.
int i = 123;
object o = i; // 박싱
Console.WriteLine(o.ToString());

1

  • 단순한 형변환 같지만 값 타입은 스택에 저장되어 있고 참조 타입은 힙에 저장되어 있습니다.
  • 그래서 위 과정을 수행하기 위해선 스택에 저장된 값 타입을 힙 타입으로 복사가 한번 일어납니다.
  • 그리고 힙에 복사된 이 영역을 참조 타입이 가리키게 되는 일을 수행합니다.

언박싱(UnBoxing)

  • 참조 타입을 값 타입으로 변환하는 작업을 말합니다.
int i = 123; // a value type
object o = o; // boxing
int j = (int)o; // unboxing

2

  • 박싱과 반대로, 힙에 있던 데이터를 다시 스택으로 복사가 일어납니다.
  • 박싱과 언박싱은 System.Object 타입이나 인터페이스 타입이 필요한 부분에 Value 타입의 객체를 적용하기 위해서 필요한 기능이지만 가능하면 쓰지 않는 것이 좋습니다.
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY