본문 바로가기
책/Effective C#

Effective C# - Item9 박싱과 언박싱을 최소화하

by 코딩하는 돼징 2023. 11. 22.
반응형

박싱(Boxing)

값 타입의 객체를 타입이 정해져 있지 않은 임의의 참조 타입 내부에 포함시키는 방법이다. 이를 이용하면 참조 타입이 필요한 경우에도 값 타입을 쓸 수 있다.

int intValue = 42;
object boxedValue = intValue; // 박싱

언박싱(UnBoxing)

박싱되어 있는 참조 타입의 객체로부터 값 타입 객체의 복사본을 가져오는 방법이다.

object boxedValue = 42;
int intValue = (int)boxedValue; // 언박싱

박싱 언박싱을 수행하는 과정에서 임시 객체가 생성되기도 하는데 간혹 이로 인해 예상치 못한 버그가 발생하기도 한다. 박싱은 값타입을 참조 타입으로 변경한다. 이 과정에서 새롭게 생성된 참조 타입의 객체는 힙에 생성되며 값 타입의 복사본이 새롭게 생성된 객체 내부에 저장된다. 이는 가비지 컬렉션의 대상이 된다.

버그 예시

박싱된 값과 원본 값은 별개의 객체이므로 값의 변경이 서로에게 영향을 미치지 않는다.

object boxedValue = 42;
int intValue = (int)boxedValue;

boxedValue = 99;
Console.WriteLine(intValue); // 출력: 42

이렇게 되면 예상치 못한 결과가 나타날 수 있으므로 주의해야한다.


.ToString()을 이용하면 박싱을 피할 수 있다.

int intValue = 42;
Console.WriteLine(intValue.ToString());

intValue.ToString()은 int 값인 42를 문자열로 변환하는 과정에서 새로운 참조 객체를 생성하는 것이 아니라 42를 나타내는 문자열을 바로 반환한다. 이는 박싱을 피하는 효과가 있다. 

 

하지만 ToString()메서드가 호출할 때 또 다른 복사본이 만들어지기도 한다. 여러가지 이유에서라도 변경 불가능한(immutable)값 타입을 만드는 것이 좋다.


결론

박싱과 언박싱 작업은 객체에 대한 복사본을 생성하곤 하는데 이로인해 버그가 발생할 수도 있고 값 타입을 다형적으로 처리하는 과정에서 성능을 느리게 만든다.

 

 

 

본 게시글은 Effective C#을 읽고 정리하였습니다.

반응형

댓글