본문으로 바로가기

[C#] 박싱과 언박싱

category Program/C# 2019. 1. 24. 13:39

Boxing과 Unboxing에 대해서.


Value Type은 int, char 등의 기초 데이타(Primitive data)를 저장하는 타입으로 그 값이 Stack에 저장된다. (주:struct 타입은 Value Type이다) Reference Type은 Managed Heap에 객체를 생성하고 이 참조값을 스택 혹은 Heap에 갖는다. Reference Type인 클래스가 객체를 Heap에 만들 때, 클래스 멤버로 Value Type을 갖는 경우, 이는 Heap에 생성된다.

Value Type의 값을 캐스팅을 통해 Reference Type으로 변경할 경우, Reference Type의 객체는 새 객체를 Managed Heap에 만들고, 스택의 값을 Heap에 복사하는데, 이를 Boxing이라 한다.


어려운가? 나도 무슨말인지 잘모르겠다


Boxing은 값타입을 참조타입으로 변환하는것, 반대로 Unboxing은 참조타입을 값타입으로 변환하는 것이다.


Boxing의 예

int val = 100;
object obj1 = (object)val;

반대로 박싱된 값을 Heap에서 Stack으로 Value Type으로 복원하는 과정은 Unboxing이라고 한다.


Unboxing의 예

int v = (int)obj1;

박싱/언박싱을 대량의 데이타 구조에서 자주 발생시키면, 성능을 크게 저하시키는 요인이 된다.


그럼, 박싱과 언박싱을 최소화하자.

System.Collections 대신 System.Collections.Generic

  • 박싱과 언박싱을 피할 수 있는 다른 규칙은 가능한 .NET 1.x의 System.Collections을 사용하는 것을 피하고, .NET 2.0에 추가된 Generic 컬렉션을 이용하는 것이다.

  • System.Collections의 ArrayList를 사용하는 예를 보자.

ArrayList arrList = new ArrayList();
arrList.Add(15);
  • ArrayList의 Add 메소드가 매개변수로 object 타입을 받기 때문에 위와 같은 코드에서는 필연적으로 박싱이 일어난다.

List<int> intList = new List<int>();
intList.Add(15);
  • 위와 같이 제네릭 컬렉션인 List를 활용하자.


출처 

http://www.csharpstudy.com/algo/qa.aspx?id=2

https://debuglog.tistory.com/153

'Program > C#' 카테고리의 다른 글

[C#] 델리게이트(Delegate)  (1) 2019.01.25
[C#] 프로퍼티 ( Property )  (0) 2019.01.25
[C#] Task 클래스  (0) 2019.01.24
[C#] 해시테이블 (Hash Table)  (0) 2019.01.23
[C#] 링크드 리스트 (Linked List)  (0) 2019.01.23