TIL/C#

[C#] 박싱과 언박싱

Sh_Blog 2023. 11. 1. 09:48

박싱과 언박싱에 대한 개념은 잘모르지만 무의식적으로 코딩할 때 자연스럽게 쓰는

경우가 있다. 그렇기 때문에 박싱과 언박싱에 대한 개념을 확실히 알고 사용하면

좋을 것 같아서 이에 대해 설명하고자 한다.

 

 

박싱(boxing)이란?

boxing은 가비지에서 수집되는 힙에 값 형식을 저장하는 데 사용한다. 이를 풀어서

설명하자면 boxing은 값 형식을 object형식이나 값 형식에서 구현된 임의의 인터페이스

형식으로 암시적 변환을 한다. 그 다음 힙에 개체 인스턴스가 할당되고 값이 새 개체에 복사된다.

i라는 변수를 선언한 뒤 object o = i라는 박싱 연산을 적용하는 과정이다.

 

힙에서 개체 인스턴스가 할당되고 그 곳에 값 형식이 복사되는 것을 볼 수 있다.

 

 

언방식(unboxing)이란?

박싱은 값 형식에서 object, 인터페이스 형식으로 변환했다. 그럼 언박싱은 말 그대로

인터페이스나 object형식에서 값 형식으로 명시적으로 변환하는 과정이다.

 

박싱 과정에서는 값 형식을 개체 인스턴스가 할당된 힙 영역에 값 을 복사했다.

그럼 언박싱 과정은 힙 영역에 i라는 값 형식이 복사되어 있는 인스턴스 영역의 값을

int j라는 값 형식 변수에 복사한다.

 

여기서 주의할 점은 언박싱의 경우 무조건 박싱하여 생성된 개체에 대한 참조여야 한다.

null을 언박싱하면  NullReferenceException 오류가 발생하고 호환되지 않는 값 형식에

대한 참조를 언박싱하려고 하면 InvalidCastException 오류가 발생한다.

 

 InvalidCastException이란 오류를 예시로 들면

처음엔 값을 int 형식으로 힙의 개체 인스턴스에 복사했다. 그럼 언박싱 할 때도

int 형식으로 변환하여 진행해야 하지만 개체에 대한 참조(int)가 아닌 short라는 

다른 형태를 넣어버린 상황이다. 이러면 개체에 대한 참조가 아니기 때문에

캐스팅이 실패하고 오류메시지가 발생한다.

 

 

요약

박싱은 값 형식을 object 형식이나 값 형식에서 구현된 인터페이스로 암시적으로

변환하는 과정을 말한다 이 때 값은 힙의 개체 인스턴스에 복사된다. 언박싱은 object형식이나

인터페이스 형식에서 다시 값 형식 으로 명시적 변환하는 과정을 말한다. 이는 인스턴스에 복사된 값을 

새로운 값 형식에 복사하는 과정이다. 

 

주의할점은 박싱과 언박싱은 수행하는데 많은 계산 과정이 필요하다. 왜냐하면 

박싱은 새로운 개체를 할당하고 생성해야 하고 언박싱은 캐스트에 상당한 계산과정이

필요하기 때문이다. 그래서 무분별하게 사용한다면 큰 성능 저하를 초래할 수 있다.