Object, 박싱, 언박싱

Clean·2025년 3월 26일

Object

  • Object참조 타입이며,
    모든 타입의 부모 클래스다. (C#의 최상위 클래스)

  • Object obj = 10;
    따라서 모든 타입Object 타입으로 암시적 변환이 가능하다.


박싱

int number = 10;
object obj = number; // 박싱 발생
  • 값 타입(Value Type) → 참조 타입(Reference Type) 으로 변환하는 것.

  • 값 타입의 데이터를 스택에서 힙으로 복사한다.

  • 타입 변환시 자동으로 업캐스팅된다.


언박싱

object obj = 10;
int number = (int)obj; // 언박싱 발생
  • 참조 타입(Reference Type) → 값 타입(Value Type) 으로 변환하는 것.

  • 힙에 있는 데이터를 다시 스택에 복사한다.

  • 타입 변환시 명시적으로 타입을 지정해야 한다.


특징

  • 박싱, 언박싱은 성능 저하의 원인이 될 수 있다.
    특히 언박싱은 런타입 타입 검사 + 메모리 복사가 발생한다.

  • 언박싱은 반드시 명시적인 타입을 지정해줘야 하며,
    잘못된 타입으로 언박싱 시 런타임 오류가 발생한다.

  • 이 때 제네릭(Generic)을 사용하면 박싱, 언박싱을 피할 수 있다.
    값 타입도 박싱 없이 처리 가능


박싱, 언박싱은 업캐스팅, 다운캐스팅과 비슷하다고 느꼈다.

상위 클래스로의 변환은 암시적으로 허용되지만,
하위 클래스로 변환할 때는 명시적인 타입 지정이 필요하다.

나무로 비유하자면, 부모 클래스는 나무기둥, 자식 클래스는 나뭇가지라고 볼 수 있다.

나뭇가지에서 몇 번을 거슬러 올라가든 결국 도착하는건 나무기둥이지만
나무기둥에서 나뭇가지로 내려갈 때는 어떤 나뭇가지인지 알 수 없기 때문에,
명시적으로 지정해줘야 한다.

0개의 댓글