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 |