반응형
박싱(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#을 읽고 정리하였습니다.
반응형
'책 > Effective C#' 카테고리의 다른 글
Effective C# - Item11 .NET 리소스 관리에 대한 이해 (0) | 2023.11.29 |
---|---|
Effective C# - Item10 베이스 클래스가 업그레이드된 경우에만 new 한정자를 사용하라 (0) | 2023.11.22 |
Effective C# - Item 8 이벤트 호출 시에는 null 조건 연산자를 사용하라 (0) | 2023.11.22 |
Effective C# - Item7 델리게이트를 이용하여 콜백을 표현하라 (0) | 2023.11.22 |
Effective C# - Item6 nameof() 연산자를 적극 활용하라 (0) | 2023.11.19 |
댓글