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