본문 바로가기
면접 준비

[면접 준비][C#] 박싱(boxing)과 언박싱(unboxing)의 차이점

by 스테디코디스트 2023. 7. 20.
반응형

1. 박싱(boxing)

- 값 형식(value types)을 참조 형식(reference types)으로 변환 해주는 것 

 

2. 언박싱(boxing)

- 박싱했던 값을 다시 원상태로 복귀 시키는 것

- 즉, 참조 형식을 값 형식으로 변환 해주는 것

 

3. object 타입

- 박싱과 언박싱이 가능한 이유

- 모든 타입의 부모 객체 -> 모든 타입이 object로 변환이 가능함

- object 타입이 참조 형식이기 때문에 임의의 타입을 object형으로 형변환 하는것을 박싱이라 한다.

- 반대로, object형에서 다시 원상태로 복귀 시키는 것을 언박싱이라 한다.

 

4. 박싱 언박싱을 사용하는 이유

- 만약 int형으로 배열을 선언한다면 int형 외에 string형 등의 참조형은 배열에 넣을 수 없지만, object의 형태로 배열을 선언한다면 해당 배열에는 값 형인 int형, 참조 형인 string형 등 다양한 타입을 다 넣을 수 있고, 이러한 데이터들이 배열에 들어갈 때 박싱이 일어난다.

- 편리하긴 하지만 값형이 참조형으로 바뀌는 박싱이 일어날 때, 스택에 있는 값을 복사하여 힙에 할당시키게 되고, 언박싱

이 일어날 때, 다시 스택에 가져오는 작업을 하게되면서 힙에 가비지가 쌓이게 되고, 단순 힙에 넣는 작업에 비해 박싱을 하게되면 약 20배 많은 시간이 소요되고, 언박싱시 약 4배 정도의 시간이 소요된다고 한다.

 

cf) object의 장점도 가져가면서 성능적 이슈를 해결할 방법 -> 제네릭(generic)
cf) 값형식, 참조형식 예시

1. 값 형식

- int, float, long, char, bool, byte, decimal, double, enum, sbyte, short, struct, uint, ulong, ushort 등이 해당

2. 참조 형식

- string, array, class, delegate 등이 해당됨


<면접 예시 답안>

박싱이란 값 형식을 참조 형식으로 바꾸는 것을 말하고, 언박싱이란 박싱했던 값을 원래대로 복귀 시키는 것을 말합니다. 이는 c#에 object라는 최상위 부모 객체가 있기에 가능하고, 다양한 타입을 혼용해서 편리하게 사용할 수 있다는 장점이 있습니다. 하지만 박싱이나 언박싱이 일어날 때, 시간이 많이 든다는 성능적인 단점이 발생합니다. (그러므로 이를 보완한 제네릭을 사용하는 것이 좋습니다. -> 제네릭에 대한 지식 필요!)


<참고한 자료>

https://yeko90.tistory.com/entry/c-%EB%B0%95%EC%8B%B1-%EC%96%B8%EB%B0%95%EC%8B%B1-%EA%B0%9C%EB%85%90