C# 에서 Boxing과 Unboxing이란.

현재 페이지를 로딩중입니다.
만약 페이지 로딩이 끝났는데 본문이 보이지 않는다면
광고차단 플러그인 때문이니 잠시 플러그인을 꺼주시면 감사하겠습니다.

The current page is loading.
If the page loading is over but the text is not visible
This is because of the ad blocking plugin, so please be sure to turn off the plugin for a while.

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.