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++이랑 똑같잖아 -_-;;
답글 남기기