C#은 모든 데이터 형식이 자동으로 object 형식을 상속 받는다.

object는 모든 데이터 형식의 base class가 된다.

 

object 형식은 참조 형식이기 때문에 힙에 데이터를 할당한다.

반면 int 나 double은 값 형식이기 때문에 스택에 데이터를 할당한다.

하지만 앞서 모든 데이터는 object를 상속받는다고 했는데

어떻게 값 형식의 데이터를 object에 담을 수 있는가?

 

object 형식은 값 형식의 데이터를 힙에 할당하기 위해

박싱 기능을 제공한다.

 

박싱

값 형식을 참조 형식으로 변환

ex. object a = 20;

 

박싱의 과정

1. 값 타입을 힙에 생성하기 위해 메모리를 힙 영역에 생성

2. 힙 영역에 할당된 메모리로 복사

3. 참조할 변수에 할당된 메모리 주소를 할당

 

언박싱

참조 형식을 값 형식으로 변환

ex. int b = (int)a;

 

언박싱의 과정

1. 박싱값인지 확인

2. 박싱된 값이라면 값 타입 변수에 복사

3. 박싱한 메모리언박싱한 메모리 2개 존재 (가비지 발생)

 

 

공통적으로 메모리 단편화가 발생한다.

 

*메모리 단편화 - 사용 가능한 메모리가 존재하지만  할당(사용)이 불가능한 상태

 

*박싱은 할당 작업 보다 최대 20배의 시간이 걸린다.

언박싱 또한 캐스팅 과정이 할당 작업 보다 4배의 시간이 걸릴 수 있다.

 

*보다시피 엄청난 성능상의 단점이 있지만, 그 편리성 때문에 간혹 쓰이기도 한다.

ex. ArrayLis, HashTable 등등..

 

참고 블로그 : https://grayt.tistory.com/87

'공부 > 개념 & 유용한 내용' 카테고리의 다른 글

메모리 구조  (0) 2020.06.17
C# - 코루틴 & yield  (0) 2020.06.15
포인터와 참조자의 차이  (0) 2020.06.15
Deque란?  (0) 2020.06.10
디자인 패턴 - 상태 패턴, 싱글턴 패턴, 컴포넌트 패턴  (0) 2020.06.05

+ Recent posts