박싱(Boxing)
박싱은 C#에서 기본 데이터 타입(원시 데이터 타입)을 해당 타입의 객체로 변환하는 과정.
이로써 기본 데이터 타입을 참조형식으로 다룰 수 있게 됩니다.
박싱은 주로 값 형식(구조체)을 object나 다른 참조형식으로 저장해야 할 때 사용됩니다.
int primitiveInt = 42;
object boxedInt = primitiveInt; // 박싱
언박싱(Unboxing)
언박싱은 박싱된 객체에서 값을 추출하여 해당 값을 기본 데이터 타입으로 변환하는 과정.
언박싱을 수행하려면 명시적으로 언박싱 연산자인 (타입)을 사용해야 합니다.
object boxedInt = 42;
int unboxedInt = (int)boxedInt; // 언박싱
주의 사항
박싱과 언박싱은 메모리와 성능 오버헤드를 발생시킬 수 있음
박싱(Boxing)
박싱 작업을 수행하면 새로운 Integer 객체가 힙(heap) 메모리에 생성 -> 객체는 기본 데이터 타입 값을 포함->
이 객체는 참조형식이므로 객체를 가리키는 참조(주소)를 스택(stack) 메모리에 저장.
박싱은 추가적인 메모리 할당 및 객체 생성 작업을 수반하며, 가비지 컬렉션의 대상이 될 수 있음.
이로 인해 메모리 오버헤드와 가비지 컬렉션 작업이 발생
언박싱(Unboxing)
예를 들어, Integer 객체에서 정수를 언박싱한다고 가정하면
언박싱을 수행하면 먼저 기본 데이터 타입의 변수가 스택 메모리에 생성 -> 박싱된 객체에서 값을 추출하여 이 변수에 복사 ->
이 과정에서 값 복사 및 데이터 형식 변환 작업이 발생하게 됨.
추가적인 계산 작업 및 메모리 사용이 필요해짐.
박싱된 객체가 null인 경우
박싱된 객체가 null인 상태에서 언박싱을 시도하면 예외(NullReferenceException)가 발생할 수 있음.
따라서 언박싱 작업을 수행하기 전에 박싱된 객체가 null 여부를 확인하거나 예외 처리를 수행해야 함.
object boxedValue = null; if (boxedValue != null) { int unboxedValue = (int)boxedValue; // 언박싱 전에 null 체크 }
안전한 언박싱
박싱된 객체가 어떤 타입인지 확인 후 언박싱해야 함.
잘못된 타입으로 언박싱하려고 하면 InvalidCastException 예외가 발생할 수 있음.
object boxedValue = 42; if (boxedValue is int) { int unboxedValue = (int)boxedValue; // 안전한 언박싱 } else { // 처리할 수 없는 타입일 때의 예외 처리 }