삽질의 현장/- .NET

#032_닷넷(.NET)_.Net Framework 기본 - Boxing & Unboxing

shovelman 2015. 10. 27. 19:51


안녕하세요 삽잡이입니다.


이번 시간에는 boxing, unboxing에 대해서 알아보겠습니다.


int, double 과 같은 내장 타입 역시 object를 부모로 가지고 있는 자식들입니다.

따라서 이와 같은 구조는 성립될 수 있습니다.



모든 형식은 object 이기 때문에 가능합니다.

물론, interface를 제외하고 말입니다.

하지만, 여기에는 아직 설명하지 않은 부분이 있습니다...

잠시후에 설명하도록 하지요...


그런데, 이처럼 값 복사가 아닌 참조 복사일 때는요?

똑같습니다.



형식은 성질을 뜻하는 것일 뿐입니다.

따라서 object로 참조를 하면 object만큼의 기능을 수행할 수 있는 것이고,

Rect를 참조하면 Rect만큼의 기능을 참조할 수 있는 것입니다.




반대로 object에서 변환한 값을 Rect로 받고 싶다면,

업케스팅을 해서 넣은 값을 다시 Rect로 형식 변환해주어 참조하게 만들면 됩니다.



이제 맨 처음 하려다 만 내용을 언급해보도록 하겠습니다..

그런데 말입니다... 예제 코드에서 아래를 보시면...



object 형식의 on은 참조자입니다.

그런데, object 형식은 class 입니다. 따라서 절대로 값이 될 수 없습니다.

값이 될 수 없으니 누군가를 가리켜야된다는 소리입니다.


참조자는 heap에 있는 객체를 가리킵니다.

stack에 있는 객체를 가리킬 수 없다 이거죠...


항상 참조자는 heap에 있는 객체를 가리킵니다.

int형 변수 n은 값 객체로써 stack에 할당되어 있습니다.

그런데, on은 stack 객체를 가리킬 수 없지요...


이 이유는,

참조란 객체를 가리킨다는 소리인데,

객체가 가리킬 때 까지 객체가 사라지면 안되지 않겠습니까...

stack 객체라면 함수의 block이 종료되면 메모리에서 사라질 것이기 때문에

절대로 stack 객체는 참조를 가리킬 수 없게 됩니다.


이때 'Boxing'을 하게 되는 것입니다.




object형 on 변수는 n이 int 형식이기 때문에 

int를 object로 형식 변환을 해주면 boxing이라고 해서 heap에 객체가 하나 만들어지게됩니다.


따라서 위의 그림과 같이 100이라는 정수를 boxing 하여 

heap 객체로 만들어냅니다.

객체를 만들어서 100이라는 값이 들어있는 

'내부적으로 공개되지 않은' boxing 객체 하나를 만들어준다 이 말입니다.


이 변환하는 작업을 boxing이라고 부르며,

만들어진 객체를 boxing 객체라고 부릅니다.

그리고 object 형식의 on 변수는 boxing 객체를 가리키게 되는 것이지요...

그렇다면 int형 변수 n은 메모리에서 날라가도 상관이 없겠군요...


object형 변수 on에 대입을 하기 이전에

(object)n 이라는 작업이 먼저 일어나게 되는 것입니다.

즉, Boxing 객체가 하나 생성되는 것이지요...


반대로 다시 object에서 int형 변수로 값을 넣고 싶다면?
on이라는 object형식을 Down Cast할 수 있습니다.


그렇게 되면 boxing을 벗겨낸다고 해서 unboxing 과정을 거칩니다.

즉, 형식 변환이 먼저 수행되니 unboxing이 발생합니다.

따라서 boxing 객체에 있는 100이라는 값이 임시적으로 stack 영역에 만들어지고

그 값을 대입할 변수에 복사하게 됩니다.


정리해보겠습니다.

참조는 모두 동일한 참조입니다...


그런데 값 형식을 참조할 때에는

boxing, unboxing과 같은 많은 작업들이 일어나게됩니다.



이번 시간은 여기까지 알아보도록 하겠습니다.


이상 삽잡이였습니다!