20240117_박싱 & 언박싱

2024. 1. 18. 00:32IT/TIL

오늘의 TIL은 박싱 & 언박싱으로 내일 기술면접의 문제인데,

 

내용을 아예 모르는 상태이기 때문에 오늘 정리하고 내일은 나만의 언어로 답을 제출하기 위해 공부하기로 했다.

 

 

박싱과 언박싱이란?

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

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

 

이는 object 타입을 사용하여 작업할 수 있는데, 모든 타입을 object로 형변환할 수 있기 때문에 가능하다.

이 때, object가 참조 형식이기 때문에 object로 형변환하는 것으로 형식을 참조 형식으로 변환할 수 있다.

 

박싱과 언박싱 하는 법

박싱은 아래와 같이 코드를 짜면 된다.

int n = 10;
object obj = n;

 

언박싱은 아래와 같이 새로운 m을 선언하여 명시적으로 (obj)으로 변환하면 된다.

int n = 10;
object obj = n;
int m = (int)(obj);

 

 

박싱과 언박싱을 사용하는 이유

박싱과 언박싱을 이용하면 타입에 관계 없이 데이터를 저장할 수 있다는 장점이 생기는데,

이는 다시 말해서 하나의 배열에 여러 타입의 데이터들을 저장할 수 있다는 말이고,

이는 데이터 저장에 있어서 범용적인 코드를 만들 수 있다는 것이다.

 

다시 말해서 int와 string, char의 3개의 데이터를 갖는 배열을 만드는데 있어서

박싱을 사용하면 하나의 배열로 만들 수 있지만, 이를 사용하지 않으면 3개의 배열을 만들어야된다는 뜻이다.

 

하지만 박싱과 언박싱의 단점은 최적화적인 관점에서 매우 좋지 않은데,

박싱을 하는 과정에서

heap 영역에 새로운 메모리를 할당하고 stack의 값을 heap 메모리로 복사한 뒤

heap 메모리의 주소 값을 갖는 새로운 stack 메모리를 할당하는 과정을 거치는데,

이 과정에서 메모리 참조를 많이 하게되므로 최적화에 좋지 않다.

언박싱을 하는 과정에서 박싱의 역과정을 거치면서 메모리 참조도 많이하지만,

추가적으로 사용했던 heap 메모리가 가비지가 되는 단점이 생긴다.

 

 

정리하면 박싱과 언박싱은 여러가지 타입을 하나의 타입으로 생각하고 작성할 수 있게 도와주는 장점이 있지만,

메모리를 사용하는 관점과 가비지가 생기는 관점에서 최적화에서는 좋지 않은 방법이라고 할 수 있다.