반응형

 

개발을 하면서, 무의식적으로 Boxing / Unboxing (박싱/언박싱)을 사용하고 있다.

되도록이면 박싱/언박싱 이 발생하지 않는 것이 좋다는 것을 알기에 이번에 정리하면서 적당히 사용해야겠다.

 

Boxing (박싱) 이란?

값 형식을 object 형식으로 변환하는 것을 말한다.

값 형식은 Stack(스택)에 저장되어 있지만, boxing 되어질때 힙에 데이터가 복사되어 저장된다.

 

예제를 보면서 확인해보자.

1
2
int i = 123;
object o = i;   // boxing
cs

int는 값 형식이기 때문에, i라는 공간에 123이라는 값이 스택에 저장되어 있다.

암시적 형변환을 통해서 2번째 줄에서 박싱이 발생하게 된다.

123이라는 값이 복사되어 힙에 저장되고, 스택에는 힙에 저장된 공간을 가리키는 주소 값을 o라는 공간에 저장한다.

아래 그림을 보면 조금 더 명확하게 이해할 수 있다.

 

Boxing 예제 (출처: msdn)

Unboxing (언박싱) 이란?

object 형식 개체에 boxing 상태의 값 형식 데이터를 추출하는 것을 말한다.

 

예제를 보면서 확인해보자.

1
2
3
int i = 123;
object o = i;   // boxing
int j = (int)o; // unboxing
cs

3번째 줄에서 명시적 형변환이 발생하면서 언박싱이 발생한다.

j라는 공간에 123이라는 값이 복사되면서 스택에 저장된다.

 

Unboxing 예제 (출처: msdn)

 

결론

박싱과 언박싱이 이루어질 때,

저장되는 공간이 다르고 불필요한 형변환이 이루어지기 때문에 Overhead(오버헤드)가 발생할 수 있다.

이러한 오버헤드는 우리 눈에 잘 보이지 않고 시스템 부하가 발생할 수 있기 때문에

숙련된 개발자가 되기 위해서 박싱/언박싱에 대해 숙지해야겠다.

 

만약 사용자 정의 형식을 개발해야 하는 경우,

구조체(값 형식)보다는 클래스(참조 형식)를 활용하는 것이 더 효율적이다.

 

반응형

+ Recent posts