[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 |
'C#' 카테고리의 다른 글
[C#] 메소드 오버로딩, 가변길이 매개 변수, 선택적 매개 변수 (0) | 2017.03.25 |
---|---|
[C#] 참조에 의한 매개 변수 전달. ref / 출력 전용 매개 변수. out (0) | 2017.03.24 |
[C#] 공용 형식 시스템. (0) | 2017.03.24 |
[C#] var형식 (0) | 2017.03.24 |
[C#] 값 형식과 참조형식 (0) | 2017.03.23 |