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++이랑 똑같잖아 -_-;;
젠장 난 귀가 너무 앏은건가


크리에이티브 커먼즈 라이선스Linsoo의 저작물인 이 저작물은(는)크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

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

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

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

    UserObject uo = new object() as UserObject

댓글 남기기

이메일은 공개되지 않습니다.

This site uses Akismet to reduce spam. Learn how your comment data is processed.