C# 에서 Boxing과 Unboxing이란.

C#에서 자료형인 CTS(Common Type System)에는 두가지 형태의 자료형이 있는데
하나는 Value 타입이고 하나는 Reference 타입이다.

C 공부하시던 분이라면 누구나 간단하게 이해 할것이다 그리고 그 생각이 맞았다.
Boxing은 value 타입의 자료형을 Reference 타입으로 바꾸는거고 Unboxing은 Reference 타입을 Value 타입으로 바꾸는 것이다.

Boxing

int A = 30;
int *pA = &A;

처음에 Boxing이 위와같은식으로 해서 value타입의 메모리를 참조하는거라 생각했었는데 아니였음.

C#에서 Boxing을 하면 C++ 에서는 대략 아래와 같은 작업이 일어난다.

int A =30;
int *pA = new int;
*pA = A;

C#에서는 이런식으로 코딩하면 된다.

int foo = 43;
object bar = foo;

Unboxing
boxing을 할때는 명시적인 변환은 필요하지 않지만, Unboxing의 경우에는 필요하다고 한다.
이유는 object가 모든 타입으로 변환될 수 있기 때문이라는군 그래서 결론은 아래와 같다.

object bar = 43;
int a = (int)bar;

근데 object bar =43; 해주고 디버그 찍어보니 자동적으로 object{int} 타입으로 된다.
그리고 43.3으로 입력하면 역시 자동적으로 object{double} 타입으로 잡힌다.
그래서 bar를 double형 값을 넣어주고 캐스트를 int 형으로 넣어보니 {“Specified cast is not valid.”} 라는 에러를 보여준다.

뭐 대량 이정도
추가적으로 지문이 길어서 이곳에 남기진 않았지만 저 박싱이랑 언박싱에 대해 뭔가 중요한거는 value값으로 구성된 구조체가 배열이던지 뭔가 자료구조에 들어갈때 인자값이 Reference 형식으로 되어 있다면 value값으로 만들어진 구조체를 Boxing해서 힙공간에 새롭게 올린다음에 그 값이 자료구조에 들어가게 된다.
뭐 C++에서는 애초에 그런 형태면 new로 힙에 생성해서 넣었겠지만 포스팅할땐 아 그렇구나 책에 써 있는데로 최적화 뭐 이런 문제로 저렇게 하면 안되겠구나 했는데 생각해보니 C++이랑 똑같잖아 -_-;;


Comments

“C# 에서 Boxing과 Unboxing이란.”에 대한 4개의 응답

  1. 좋은글 감사합니다. 스크랩하고 다시보다가 발견하여 글남겨둡니다!

    1. 넵~

  2. 지나가던 행인 아바타
    지나가던 행인

    무려 C#에는 as 라는 연산자가 있지요

    이거 이용하면 boxing과 unboxing 사이에서 일어나는 성능 손실이 줄어든대요

    UserObject uo = new object() as UserObject

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다