Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

닷넷!시작하기

Microsoft. NET 을 시작하는 분들을 위한 강좌입니다. 주로 기초적인 내용과 때론 기본적인 내용을 다룹니다

Boxing & UnBoxing (박싱&언박싱)

작성자 : 박종명
최초 작성일 : 2008-06-16 (월요일)
최종 수정일 : 2008-06-16 (월요일)
조회 수 : 3426

* 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) 박싱, 언박싱시 주의사항
간혹 런타임 환경에서 박싱,언박싱을 하는 과정 중 버그를 유발하는 코드를 작성하기 쉽다.

이런 식의 버그는 쉽사리 찾을 수 없는 버그 이기도 하다.
 
다음의 글을 보면서 박싱,언박싱 중에 발생하기 쉬운 버그를 음미 해보자
--> 바로가기

이름
비밀번호
홈페이지
EQ <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요