boxing/unboxing
박싱/언박싱?
내가 알고 있는 박싱/언박싱은 자료의 형변환이 일어날때
값 형식을 참조형식으로 박싱
참조형식을 값형식으로 언박싱이다 라는정도인데 메모리영역에서 어떻게 일어나는지 알아보았다.
박싱
값 형식을 참조 형식으로 변환되는 것을 말한다.
static void Main(string[] args)
{ int i = 93; object s = i; //박싱 }
int i 는 93이라는 값을 받고, object s는 i의 값을 받고있다.
값 형식인 정수형 자료 int를 object(참조형식)객체로 할당하게 되면 박싱이 일어나게 된다.
=> 스택에 있는 데이터가 힙으로 복사 된 것이다.
Stack에 있는 93이라는 정수형 자료가 Heap영역으로 복사되고, 이영역을 객체 변수 s가 가리키게 된다.
언 박싱
참조 형식을 값 형식으로 변환하는 것,
static void Main(string[] args) { int i = 93; object s = i; int j = (int)s; //언 박싱(명시적 변환) }
s를 int로 값 형식으로 변환한다.
박싱된 객체인 s를 다시 값 형식으로 변환하면 언박싱이 일어난다.
=> 힙에 있는 데이터가 스택으로 복사된다.
언 박싱이 가능한 객체
값 형식을 박싱하여 생성된 객체이어야만 가능
static void Main(string[] args) { short i = 93; object s = i; int j = (int)s; //언 박싱 불가 }
short타입을 박싱한 객체를 int타입으로 언 박싱은 불가능
해당 타입보다 작은 범위로 변환 불가능
높은 비용의 박싱/언박싱
박싱과 언박싱은 많은 시간이 소모된다고 한다. 되도록 제네릭을 사용해서 박싱과 언박싱이 일어나지 않도록 구성하도록 하는게 좋다.
박싱의 과정 :
1. 값 타입을 힙에 생성하기 위해 메모리를 힙 영역에 생성
2. 값을 힙 영역에 할당된 메모리로 복사
3. 참조할 변수에 할당된 메모리 주소를 할당
언박싱의 과정 :
1. 박싱값인지 확인
2. 박싱된 값이라면 값 타입 변수에 복사
3. 박싱한 메모리와 언박싱한 메모리 2개 존재 ( 가비지 발생 )
학습참고 : http://www.mkexdev.net/Article/Content.aspx?parentCategoryID=1&categoryID=5&ID=671
https://grayt.tistory.com/87 [IT's me]
https://hongjinhyeon.tistory.com/90
'프로그래밍언어 > C#' 카테고리의 다른 글
C#) 캐스팅/ 암시적형변환 / 명시적 형변환 (0) | 2019.02.15 |
---|---|
C#) 네임스페이스 / 유니티 네임스페이스 (0) | 2019.02.13 |
C#) ref 키워드 (참조자) , out 키워드 (1) | 2019.02.09 |
C#) Lamda #2 (0) | 2019.02.07 |
C#) Lamda 람다 식 (0) | 2019.02.06 |