값 타입과 참조 타입을 서로 변환해주는걸 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의 사용이 권장된다.
'프로그래밍 > C#' 카테고리의 다른 글
C# Ref 와 Out 키워드 차이점에 대해서 (0) | 2023.04.04 |
---|---|
C# 확장 메서드(Extension Method) (2) | 2023.04.03 |
C# 코드 컴파일 단계에 대해서 (2) | 2023.03.29 |
C# Discards _의 정체 (9) | 2023.03.23 |
C# Equals()과 GetHashCode()를 함께 재정의 해야하는 이유 (4) | 2023.03.23 |
댓글