728x90

* Boxing & UnBoxing
Value Type <-> Reference Type
값 타입과 참조타입 사이의 변환을 박싱(Boxing) , 언박싱(UnBoxing) 이라 일컫는다.

1) 박싱(Boxing) : 값 타입 -> 참조 타입
박싱이란 값 타입의 데이터를 참조 타입으로 변환하는 것을 말한다.

자세히 말하자면 메모리상의 스택영역에 저장된 값을 힙영역으로 복사하는 과정을 말한다.

즉, 값 타입의 데이터를 System.Object 또는 그 값 형식이 구현하는 인터페이스 형식으로의 변환시 발생하는 것을 일컫는다.

(이 과정은 묵시적 으로 일어난다.)

닷넷에서 값 타입은 스텍(Stack) 이라는 메모리 영역에, 참조 타입은 힙(Heap) 라는 영역에
각각 저장된다.
아래의 코드를 살펴 보자.

Object obj = 1;


Object 라는 참조 타입에 1이라는 값 타입의 리터럴 상수를 대입하는 간단한 코드이다.

obj 는 값 타입의 1의 값 자체가 아니라 1이 복사된 힙 영역의 참조를 가르키게 된다.

바로 이 과정에서 박싱(Boxing)이 일어난다. 이 과정의 메모리를 도식화 해보자

2) 언박싱(UnBoxing) : 참조 타입 -> 값 타입
언박싱이란 박싱과는 반대로 힙 영역에 있는 값을 스택 영역으로 복사하는 과정을 말한다.

즉, 힙영역의 데이터를 값 형식으로 캐스팅 할때 언박싱이 일어난다.

(이 과정은 명시적으로 캐스팅(형변환) 할 때 일어난다)
역시 아래의 코드와 메모리를 살펴 보자

Object obj = 1;
int i = (int) obj


결국 수형 I 변수는 스택영역을 가리키는 것이 된다.

3) IL 코드
위 코드의 IL 코드를 살펴 보자

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Main 메서드의 IL 코드를 보면 박싱과 언박싱이 일어나고 있음을 알 수 있다.

4) 비용
결국 메모리 위치를 변화 시켜 가는 박싱과 언박싱은 비용이 많이 든다.
대표적으로 ArrayList 와 같은 object 형 컬렉션에 대량의 값 타입을 넣고 빼고 하여

발생하는 박싱,언박싱은 실제로 많은 속도 저하를 유발하는 원인이기도 하다.

(실제로 닷넷 2.0에서는 박싱,언박싱 (업캐스팅,다운캐스팅)의 비용을 줄이기 위해 지네릭이라는
새로운 개념이 도입되었다)

5) 박싱, 언박싱시 주의사항
간혹 런타임 환경에서 박싱,언박싱을 하는 과정 중 버그를 유발하는 코드를 작성하기 쉽다.

이런 식의 버그는 쉽사리 찾을 수 없는 버그 이기도 하다.


출처 : http://mkex.pe.kr

728x90

'WEB' 카테고리의 다른 글

RGB 컬러 코드 색상표 #FFFFFF  (0) 2012.07.29
브라우저 캐시 자동으로 지우기  (0) 2012.07.29
ASP.NET GENERIC  (0) 2012.07.29
XML이란 - 2  (0) 2012.07.29
XML이란  (0) 2012.07.29

+ Recent posts