본문 바로가기
Language/CPP&C#

[C#] object (boxing/unboxing)

by nyangzzi 2021. 5. 20.
반응형

 

object

 

object 형식은 .NET Framework에서 제공하는 어떤 데이터든지 다룰 수 있는 데이터 형식이다.

 

 

C#은 object가 모든 데이터를 다룰 수 있도록 기본 데이터 형식 뿐 아니라 모든 복합 데이터 형식, 사용자 정의 형식까지도 object 형식으로부터 *상속 받도록 개발되었다.

 

* 상속: 부모 데이터 형식의 유산을 자식이 물려받는 것. 부모로부터 데이터와 메소드를 물려받은 자식은 부모와 똑같이 동작하는 것이 가능

 

int나 double 등의 값 형식은 스택에 데이터를 할당한다.

하지만 object  형식은 참조형식이므로 힙에 데이터를 할당하며, 값 형식의 데이터를 힙에 할당하기 위해 "박싱(boxing)" 기능과 "언박싱(unboxing)" 기능을 제공한다.

object식에 값 형식의 데이터를 할당하려는 시도가 이루어지면 object형식은 박싱을 수행해서 해당 데이터를 힙에 할당한다. 스택에는 이 힙의 주소가 저장되며, 값이 필요할 때마다 힙에 접근하여 값을 가져올 수 있다. 이것을 '참조'라고 부르는데, 이 과정은 택배에 비유할 수 있다.

 

다음은 참조의 예시이다.

 

'꼬롱이'는 인형이 가지고 싶어 온라인 쇼핑을 하려고 한다. 하지만 엄마는 꼬롱이가 인형을 가지고 있도록 허락해주지 않았고, 꼬롱이는 대신 친구 '말랑이'네 집에 대신 택배를 시키기로 하였다. 말랑이는 인형을 숨겨둘 집의 주소를 꼬롱이에게 알려주었고, 꼬롱이가 인형이 필요할 때 말랑이의 집으로 찾아가기로 하였다.

 

위의 비유를 박싱으로 풀이하면 다음과 같다.

먼저, 인형은이다. 그리고 인형(값)을 박스에 담아서 포장하는 것을 박싱이라고 한다. 엄마는 인형을 집에 둘 수 없다고 말했기 때문에, 대신 말랑이네 집에 숨겨두기로 하였다. 

꼬롱이는 포장한 박스를 말랑이네 집에 숨겨두었다. 집들은 한 줄로 쭉 서 있는데, 그 중에 두 번째 집이 말랑이의 집이다.

그리고 이때, 이 집들이 바로 힙 영역이라고 할 수 있다.

 

박스(값 상자)를 보관하는 데 성공한 꼬롱이는, 말랑이의 집 주소를 잊어버리지 않게 수첩에 기록해두기로 하였다. 이제 꼬롱이는, 인형을 찾으러 가고 싶을 때 메모장을 보고 언제든 인형을 찾아올 수 있을 것이다.

이때 메모장이 바로 스택 영역이며 메모장에는 말랑이의 집 주소, 즉 박스가 있는 위치의 주소가 적혀있다. 꼬롱이는 메모지를 가지고 있는 이상, 말랑이네 집에 가서 인형을 가지고 올 수 있다.

 

 

반대로 어느날, 꼬롱이는 친구 뭉뭉이에게 인형을 자랑하고 싶어졌다. 그래서 말랑이네 집으로 가 인형을 가지고 와, 박스를 뜯은 뒤 꺼냈다. 이것은 언박싱이라고 할 수 있다.


결론적으로, object는 다음과 같은 boxing / unboxing을 통해 동작한다.

 

//Boxing
int a = 30;
object b = (object)a;   //a에 담긴 값을 박싱해서 힙에 저장

WriteLine("a: " + a);
WriteLine("b: " + b);

 

//unboxing
object y = 30;   
int x = (int)y;//y에 담긴 값을 언박싱해서 스택에 저장

WriteLine("x: " + x);
WriteLine("y: " + y);
반응형

'Language > CPP&C#' 카테고리의 다른 글

[C#] object와 var의 차이  (0) 2021.05.20
[C#] var 키워드  (0) 2021.05.20
[C#] Null  (0) 2021.05.18
[C#] CLR(Common Language Runtime)  (0) 2021.05.18
[Visual Studio] 명령 프롬프트(cmd)로 파일 실행하기  (0) 2021.05.18

댓글