Home
소개 : MKEX?
♬ .NET World
Microsoft .NET
   (Visual C#)
Windows Forms
ASP.NET
- New Feature
.NET 3.0 (WinFX)
SilverLight
♬ Essential to Dev.
Foundation
EAD
Web Prjoect
   (MS Product-based
   Applications)
Ajax.NET
MS SQL Server
♬ Ref.
Tip
허둥9단의 .NET
♬ Community
공지 사항
Q&A
아무거나..
Link
【 Favorites】
【My Blog】

Windows Forms ...

Creative Commons License

 
Microsoft .NET (Visual C#)  
  읽기 : 비회원    쓰기 : 관리자
MKEX
 
 Boxing & UnBoxing (박싱&언박싱)
등록자 :  박종명 등 록 일 : 
조회수 :   1,477    
첨부파일 : 
   

 

 

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

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




 

확대 축소 인쇄 이메일
 
사용자 의견입니다.
  표정선택


  코멘트

  의견등록
MKEX Copyright mkex. All rights reserved.