기초 메모지

C# - 컬렉션 / 박싱(Boxing), 언박싱(UnBoxing) 본문

Languages/C#

C# - 컬렉션 / 박싱(Boxing), 언박싱(UnBoxing)

라큐브 2022. 7. 15. 15:59

박싱(Boxing)

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

스택(Stack)에 할당된 iNum을 힙(Heap)에 복사하고 oNum에 힙에 복사된 iNum 주소 값을 할당합니다

 

언박싱(UnBoxing)

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

힙(Heap)에 할당된 iNum을 스택(Stack)에 할당되어있는 rNum으로 복사합니다. 

 

박싱(Boxing) 과 언박싱(UnBoxing) 현상이 일어나면 왜 성능이 떨어질까?

할당하거나 이용할때 스택(Stack)과 힙(Heap) 사이에 복사가 이뤄지면서 값(Value) 타입을 그대로 사용할때보다 지연이 발생하여 성능이 낮아집니다. 

 

컬렉션(Collection)과 박싱(Boxing), 언박싱(UnBoxing)은 어떤 관계일까?

대표적인 컬렉션(Collection)인 ArrayList를 살펴보면 리스트를 추가할때  ArrayList.Add(object) 즉, 참조 타입인 Object로 받고 있습니다.

ArrayList.Add(Object) 메서드 (System.Collections) | Microsoft Docs

 

ArrayList.Add(Object) 메서드 (System.Collections)

개체를 ArrayList의 끝 부분에 추가합니다.

docs.microsoft.com

 

그림을 참고하면 ArrayList 배열은 각 힙(Heap)에 할당되어있는 값 주소를 참조하고 있습니다.

다시 말하면 배열 길이 만큼 박싱(Boxing)과 언박싱(UnBoxing)이 일어나므로 성능이 크게 하락하게 됩니다. 

 

 

그런 이유로 박싱(Boxing)과 언박싱(UnBoxing)이 일어나는 콜렉션(Collection) 대신
값 타입인 제네릭 컬렉션(Generic Collection)을 사용해야합니다. 

반응형

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

C# - 상대 경로(Reletive Path)  (0) 2022.08.18
C# - 디렉토리(Directory)  (0) 2022.08.18
C# - 열거형(Enum)  (0) 2022.07.14
C# - 조건문(Conditional Statements) / switch  (0) 2022.07.13
C# - 조건문(Conditional Statements) / if  (0) 2022.07.13
Comments