Object는 C#에서 모든 클래스의 기본 클래스인 최상위 클래스이다.
C#의 모든 클래스는 암시적으로 오브젝트 타입(System.Object
)을 상속받고, C#의 모든 데이터 형식 (int, double, char 등)도 System.Object
를 간접적으로 상속받는다.
만약 직접 설계한 MyClass
라는 클래스가 있다면 그 또한 System.Object
를 상속받는다는 것이다.
Object는 참조 타입의 최상위 클래스이다.
박싱이란 값 형식을 Object
(참조) 형식으로 형변환 시키는 것이고, 언박싱이란 반대로 Object
(참조) 형식을 값 형식으로 형변환시키는 것이다.
박싱은 값 형식을 참조 형식(Object)으로 변환시키는 것이다.
//암시적 형변환
int a = 10;
Object obj = a;
위와 같이 암시적 변환이 가능한 이유는 데이터 형식(int, float 등)이 System.ValueType
을 상속 받고, System.ValueType
이 System.Object
을 상속받기 때문이다.
"System.Object
-> System.ValueType
-> int (float, double ...)"
//명시적 형변환
Object obj = (Object)a;
이처럼 명시적 형변환도 물론 가능하다.
박싱을 하면 힙 영역에 새로운 Object
객체를 생성하고 스택에 있는 값을 복사해오고, 참조를 하게된다.
박싱을 하면 데이터의 원래의 형식은 무의미해지며 int형이라고 할 수 없기 때문에 위 그림처럼 표현해봤다.
언박싱은 참조 형식(Object)을 값 형식으로 변환하는 과정이다.
int a = 10;
Object obj = a;
int b = (int)obj;
언박싱은 명시적으로 이루어진다.
언박싱을 하면 힙에 있는 Object의 값을 스택으로 복사해온다.
a와 b는 전혀 상관이 없는 값 형식의 변수이다.
여러 종류의 값 형식의 데이터를 담고자 할 때 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