박싱과 언박싱

박싱(Boxing)은 포장, 언박싱(Unboxing)은 포장풀기를 뜻한다. 박싱은 값형을 포장에서 참조형처럼 쓰일 수 있도록 해주고, 언박싱은 포장 안에 들어있는 데이터의 포장을 풀어서 값형으로 꺼내주는 일을 한다. 값형을 참조형으로 변환할 필요가 있으면 박싱을 통해 참조형으로 변환해 주고 언박싱을 통해 다시 값형으로 변환하면 된다.


결론부터 말하자면,

박싱을 하면 단순히 참조에 할당하는 것보다 20배까지 시간이 소모되며, 언박싱은 할당에 4배정도 소모된다.
(출처 : MSDN)

박싱과 언박싱에는 많은 시간이 소모된다. 되도록이면 제네릭을 사용해서 박싱과 언박싱이 일어나지 않도록 구성을 해야하며, 어쩔 수 없이 사용하려면 그 타입에 맞는 캐스팅을 해서 오류가 없이 처리해야 한다.


박싱(Boxing)

값타입을 Object 형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 것을 말한다.

기존에 저장된 스택영역에서 힙영역에 값형식을 저장한다.


위에서 int의 값형식을 Object라는 참조형식으로 형변환을 시도한다.  그 목적는 여러가지가 있을 수 있는데,

보통 파라미터로 전달되거나, List<Object> 형식으로 모든 값들을 입력받는 목적으로도 사용될 수 있다.

위의 코드는 메모리상에서 아래와 같이 메모리가 할당이 된다.


스택영역에 있는 i 값이 o로 변환이 되면서 힙영역에 object 형식으로 선언이 되고, 값이 복사 된다.

o는 스택영역에 존재하며 boxed된 i의 주소값을 가지고 있다.


박싱은 보통 암시적으로 되며, 명시적으로도 가능합니다.


언박싱(UnBoxing)
Object 형식에서 값형식으로, 또는 인터페이스 형식에서 해당 인터페이스를 구현하는 값 형식으로 변환하는 것을 말한다.

 

언박싱 과장은 두가지의 절차를 거친다.
1.개체 인스턴스가 지정한 값 형식을 boxing한 값인지 확인
2. 인스턴스의 값을 값 형식 변수에 복사

위의 그림에서 보면, int를 박싱한 o의 객체를 다시 int 타입의 j 값에 넣고 있다.

언박싱을 할 때 다른 타입으로 하거나, 해당 타입보다 작은 범위로 변환을 하려면 오류(InvalidCastException)가 발생 한다. 이때는 미리 같은 타입인지를 먼저 확인하는 절차를 거쳐야한다. is 연산자를 이용해서 미리 같은 타입인지 확인 후에 캐스팅을 해야 안전하다.


박싱과 언박싱 사용 예제






'Develop > C#' 카테고리의 다른 글

Dispose/Finalize  (0) 2016.12.08
using  (0) 2016.12.01
프로젝트 exe 파일(Release 버전) 생성  (1) 2016.11.15
ListBox items Random 함수 사용  (0) 2016.11.15

+ Recent posts