호빵의 IT 개발소

[C#] 박싱과 언박싱 본문

CS(전공지식)/프로그래밍언어

[C#] 박싱과 언박싱

호빵Stack 2022. 6. 21. 18:49

박싱(Boxing)

  • 값 타입의 객체 -> 참조 타입으로 변환하는 작업
  • 스택에 있는 데이터가 힙으로 데이터가 힙으로 복사되는 작업을 이룬다.
  • 보통 암시적으로 변환되며, 명식적 변환도 가능하다.
  • 리소스를 많이 잡아먹는다.
int i = 123;
object o = i; // Boxing
Console.WriteLine(o.ToString());

 

 

언박싱(UnBoxing)

  • 참조 타입 -> 값 타입으로 변환하는 작업
  • 힙에 있던 데이터를 스택으로 복사를 하는 과정이다.
  • 언박싱을 할 때 기존과 다른 타입으로 언박싱하거나, 해당 타입보다 작은 범위로 변환을 하면 에러가 호출된다. 그러므로 선언할 때 is 연산자를 통해 미리 같은 타입인지 캐스팅을 해보는 것이 필요하다.
  • 리소슬르 많이 잡아먹는다.
int i = 123; // a value type
object o = o; // boxing
int j = (int)o; // unboxing

 

 

값 타입(Value Type)

  • 값 타입은 스택 영역에 저장(int, char, double, long 등)
  • 값 타입은 Object를 상속 받은 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를 새로운 aa에 할당한다면 새로운 메모리를 할당하지 않고 참조하는 값만 복사
A aa = a;
  • a를 새로운 aa에 할당한다면 새로운 메모리를 할당하지 않고 참조하는 값만 복사

 

 


기술 면접 대비!

Object Type에 Value Type을 대입하면 어떤 일이 일어날까?

- 밸류(Value)를 참조타입(Reference Type)으로 박싱(Boxing)한다. 스택(Stack)에 있던 밸류(Value)를 힙(Heap)으로 복사 후 주소값을 할당


 

 

참조 및 출처 :  https://afsdzvcx123.tistory.com/entry/C-%EB%AC%B8%EB%B2%95-%EB%B0%95%EC%8B%B1%EA%B3%BC-%EC%96%B8%EB%B0%95%EC%8B%B1%EC%9D%B4%EB%9E%80

https://jeongkyun-it.tistory.com/79

Comments