오브젝트 타입(System.Object)과 박싱, 언박싱 (Boxing, Unboxing)

강성원·2024년 1월 8일
0

C# 끄적끄적

목록 보기
9/11
post-thumbnail

System.Object 클래스

  • Object는 C#에서 모든 클래스의 기본 클래스인 최상위 클래스이다.

  • C#의 모든 클래스는 암시적으로 오브젝트 타입(System.Object)을 상속받고, C#의 모든 데이터 형식 (int, double, char 등)도 System.Object를 간접적으로 상속받는다.
    만약 직접 설계한 MyClass라는 클래스가 있다면 그 또한 System.Object를 상속받는다는 것이다.

  • Object는 참조 타입의 최상위 클래스이다.

1. 박싱과 언박싱이란?

박싱이란 값 형식을 Object(참조) 형식으로 형변환 시키는 것이고, 언박싱이란 반대로 Object(참조) 형식을 값 형식으로 형변환시키는 것이다.

1-1. 박싱(Boxing)

박싱은 값 형식을 참조 형식(Object)으로 변환시키는 것이다.

//암시적 형변환
int a = 10;
Object obj = a;

위와 같이 암시적 변환이 가능한 이유는 데이터 형식(int, float 등)이 System.ValueType을 상속 받고, System.ValueTypeSystem.Object을 상속받기 때문이다.
"System.Object -> System.ValueType -> int (float, double ...)"

//명시적 형변환
Object obj = (Object)a;

이처럼 명시적 형변환도 물론 가능하다.

박싱을 하면 힙 영역에 새로운 Object 객체를 생성하고 스택에 있는 값을 복사해오고, 참조를 하게된다.

박싱을 하면 데이터의 원래의 형식은 무의미해지며 int형이라고 할 수 없기 때문에 위 그림처럼 표현해봤다.

1-2. 언박싱(Unboxing)

언박싱은 참조 형식(Object)을 값 형식으로 변환하는 과정이다.

int a = 10;
Object obj = a;

int b = (int)obj;

언박싱은 명시적으로 이루어진다.

언박싱을 하면 힙에 있는 Object의 값을 스택으로 복사해온다.

a와 b는 전혀 상관이 없는 값 형식의 변수이다.

1-3. 박싱 언박싱 사용 이유

여러 종류의 값 형식의 데이터를 담고자 할 때 Object 형식의 배열을 만들어서 담아놓고 언박싱하여 사용할 수 있어서 좋지만,

박싱할 때는 새로운 객체를 생성하고 값 형식의 데이터를 복사하며, 언박싱 할 때 객체의 값을 복사하기 때문에 대량의 데이터를 다룰 때에는 오버헤드가 많이 발생할 수 있음에 주의해야한다.


참고
Object 클래스 : https://learn.microsoft.com/ko-kr/dotnet/api/system.object?view=net-7.0
ValueType 클래스 : https://learn.microsoft.com/ko-kr/dotnet/api/system.valuetype?view=net-8.0
ChatGPT

profile
개발은삼순이발

0개의 댓글