본문 바로가기
프로그래밍/C#

Boxing, UnBoxing에 대해서 알아보자

by bantomak 2023. 3. 31.

 


값 타입과 참조 타입을 서로 변환해주는걸 Boxing, UnBoxing이라고 합니다.

 

값 타입과 참조 타입

  저장 위치 상속 데이터 타입 예시
값 타입(Value Type) 스택(Stack) 영역 System.ValueType int, char, double..등 기본타입과 struct
참조 타입(Reference Type) 힙(Heap) 영역 System.Object class

 

박싱 (Boxing)

값 타입(Value Type)의 객체를 참조 타입(Reference Type)으로 변환하는 작업을 말합니다.

예제 코드

int i = 10;
object o = i;
Console.WriteLine(o.ToString());

 

언박싱 (UnBoxing)

참조 타입(Reference Type)을 값 타입(Value Type)으로 변환하는 작업을 말합니다.

예제 코드

object firstParam = 10;
object o = firstParam;
int i = (int)o;
string output = i.ToString();

 

 

 

프로그래머가 모르는 사이에 C#에서 박싱과 언박싱이 일어나고 있습니다.

박싱, 언박싱이 일어나면 추가적인 메모리 블럭과 새로운 오브젝트가 생겨나므로 퍼포먼스에 영향을 줍니다.

따라서 프로그래머는 이에 대해서 알아야할 필요가 있습니다.

 

주로 컨테이너 사용시에 Object 타입을 받는 컨테이너가 아니라 명시적은 타입을 요구하는 컨테이너를 사용하면 암시적으로 일어나는 박싱 언박싱을 최소화 할 수 있습니다.

 

예제 코드

Hashtable ht = new Hashtable();
ht.Add("irina", "Irina SP");
ht.Add("tom", "Tom Cr");

if (ht.Contains("tom"))
{
    Console.WriteLine(ht["tom"]);
}

 

Dictionary<int, string> emp = new Dictionary<int, string>();
emp.Add(1001, "Jane");
emp.Add(1002, "Tom");
emp.Add(1003, "Cindy");

string name = emp[1002];
Console.WriteLine(name);

 

모든 타입을 받는 HashTable보다 명시적으로 타입을 선언하는 Dictionary의 사용이 권장된다.

댓글