무효 클릭 IP 추적 중...
c#

[c#] 박싱(boxing), 언박싱(unboxing) 개념과 사용 이유

꼬예 2022. 5. 18.

기존에 타입을 변환하는것을 형변환(type casting)이라고 했었습니다. 

(형변환은 관련 포스팅 참조 바랍니다.)

 

박싱과, 언박싱형변환을 하는것이지만 조금 결이 다른데요.

 

1. 박싱과 언박싱이란?

박싱(boxing)값 형식(value types)을 참조 형식(reference types)으로 변환 해주는것을 의미하고,

언박싱(unboxing)은 박싱했던 값을 다시 원상태로 복귀 시키는 것을 의미합니다. 

(값형식, 참조형식에 대해 모르시는 분은 해당 포스팅을 읽고 오시길 추천드립니다.)

 

어떻게 이게 가능한것일까요?

바로 모두의 부모 객체인 object타입 덕분입니다. 

그렇기 때문에 모든 타입이 object로 변환이 가능한것이죠.

 

정리하자면 object타입참조 형식(reference types)이기 때문에 object형으로 형변환이 일어나는것박싱이라고 하고

object에서 다시 원상태로 복귀 시키는것을 언박싱이라고 하는 것입니다.

 

 

2. 박싱/언박싱 실제 사용 예시

하는 방식은 기존에 형변환을 하는 방법과 똑같습니다.

차이가 있다면 대상이 object가 들어 갔다는 것 뿐이죠.

더 상위 차원으로의 형변환이기 때문에 암시적인 방법으로 캐스팅을 적용해보았습니다.

물론 아래와 같이 명시적도 가능하겠죠?

 

앞서 개념 설명을 드릴때 언박싱이란 기존에 박싱한것을 다시 푸는 작업이라고 하였습니다. 

아래와 같이 그냥 object타입을 하위 차원으로 형변환을 하면 오류가 발생합니다.

"Unhandeld exception. System.~~"

 

 

다시말해 아래와 같이 박싱한걸 다시 푸는 형태가 정상적인 방법입니다.

이때는 상위차원에서 하위차원으로 푸는 것이기 때문에 명시적으로 적어줘야 한다는것도 잊지 마시기 바랍니다.

 

 

 

3. 박싱 언박싱을 왜 사용해야 하나?

 

가령 아래와 같은 배열을 만들고 싶다고 합시다.

그런데 배열을 만들때 우리는 특정 타입을 지정을 해야 하죠. 여기선 int로 지정을 하였습니다.

그렇기 때문에 아래와 같이 string타입은 넣을 수가 없습니다.

 

하지만 이때 가장 상위 타입인 object를 배열 타입으로 지정해준다면 다양한 타입을 다 넣을 수 있다는 장점이 있습니다.

이때 내부적으로 데이터가 배열에 들어갈때 박싱(boxing)이 일어나게 됩니다. 

그리고 출력시 다시 언박싱(unboxing)을 하게 되는거죠.

상당히 편리해보입니다.

 

하지만 편리하다고 좋은게 아닙니다.

왜냐하면 메모리상 비효율성이 발생 되기 때문입니다.

 

앞서 값형식/참조형식 포스팅에서도 설명 했듯이 값형참조형으로 바뀔때, 스택에 있는 값을 복사하여 힙에 할당시키게되고, 언박싱다시 스택에 가져오는 작업을 하면서 힙에 가비지가 쌓이게 됩니다. 

 

뿐만 아니라 단순히 힙에 넣는 작업에 비해 박싱을 통할시 20배 정도 더 많은 시간이 소요되고,  언박싱4배정도의 시간이 소요된다고 합니다. 

 

object의 장점도 가져가면서 성능적 이슈를 해결할 방법이 없을까요?

바로 c# 2.0을 넘어오면서 생긴 제네릭(generic)이 이 문제들을 해결 해줍니다.

 

 

이 글과 읽으면 좋은글

  • 트위터 공유하기
  • 페이스북 공유하기
  • 카카오톡 공유하기
이 컨텐츠가 마음에 드셨다면 커피 한잔(후원) ☕

댓글