[C#] Object형식, 박싱과 언박싱.


1. Object형식


object형식은 "상속" 덕분에 어떤 데이터든지 다룰수 있는 데이터 형식이다.


C#은 object가 모든 데이터를 다룰 수 있도록 하기 위해 특별 조치를 취했는데,

모든 데이터 형식이 자동으로 object형식으로부터 상속받게 한 것이다.

다시 말해 object형식이 모든 데이터 형식의 부모라고 하면 된다.


※ 모든 데이터 형식이 가능하다. 프로그래머가 만든 데이터 형식도 마찬가지다.



따라서 컴파일러는 어떤 형식의 데이터라도 object에 담아 처리할 수 있게 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System
 
namespace Object
{
    class Test
    {
        static void Main(string[] args)
        {
            object a = 100;
            object b = 3.14;
            object c = true;
            object d = "헬로우 월드";
            
            Console.WriteLine(a);
            Console.WriteLine(b);
            Console.WriteLine(c);
            Console.WriteLine(d);
        }
    }
}
cs



각 자료형이 처리하는 방식이 다른데 어떻게 이런일이 가능할까?

우리는 그걸 알기 위해 이 뒤에 일어나는 메커니즘을 이해할 필요가 있다.

그 메커니즘을 박싱, 언박싱 이라고 한다.




2. 박싱과 언박싱


object형식은 참조 형식이기 때문에 힙에 데이터를 할당한다.

int나 double 형식은 값 형식이기 때문에 스택에 할당한다.


그런데 앞에서 값 형식의 데이터를 object형식 객체에 담았다.

이 경우는 어느 메모리에 데이터가 할당될까?


object형식은 값 형식의 데이터를 힙에 할당하기 위한 박싱(Boxing)기능을 제공한다.


object형식에 값 형식의 데이터를 할당하려는 시도가 이루어지면 object형식은 박싱을 수행해서 해당 데이터를 힙에 할당한다.


이렇게 박싱이 일어나는 한 편, 힙에 있던 값 형식 데이터를 값 형식 객체에 다시 할당해야 하는 경우가 있다.

다음이 그런 경우다.


1
2
object a = 20;
int b = (int)a;
cs

위 코드에서 a는 20이 박싱되어 저장되어 있는 힙을 참조하고 있다.

b는 a가 참조하고 있는 메모리로부터 값을 복사하려고 하는 중이다.

이 때, 박싱되어 있는 값을 꺼내 값 형식 변수에 저장하는 과정을 언박싱(UnBoxing)이라고 한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
 
namespace BoxingUnBoxing
{
    class MainApp
    {
        static void Main(string[] args)
        {
            int a = 123;
            object b = (object)a;        // a에 담긴 값을 박싱하여 힙에 저장
            int c = (int)b;              // b에 담긴 값은 언박싱하여 스택에 저장
            
            Console.WriteLine(a);        // 결과 : 123
            Console.WriteLine(b);        // 결과 : 123
            Console.WriteLine(c);        // 결과 : 123
        }
    }
}
cs