C#에서 모든 데이터 형식의 최상위 기본 클래스는 바로 Object입니다. .NET의 공용 형식 시스템(Common Type System, CTS)에 속한 모든 데이터 형식은 결국 Object 형식을 뿌리로 두고 있으며, C# 코드에서 사용하는 object 키워드는 사실 System.Object 클래스의 별칭(alias)입니다.
Object가 모든 형식의 부모인 이유
.NET은 값 형식(int, double, struct 등)과 참조 형식(class, string, 배열 등)이라는 서로 다른 범주로 나뉘지만, 두 범주 모두 System.Object를 상속합니다. 덕분에 어떤 형식이든 object 변수에 담을 수 있고, ToString(), Equals(), GetHashCode() 같은 공통 메서드를 모든 객체에서 호출할 수 있습니다.
박싱(Boxing)과 언박싱(Unboxing)
Object와 관련해 반드시 알아야 할 개념이 박싱과 언박싱입니다.
- 박싱(Boxing): 값 형식을 object 형식으로 변환하는 과정입니다. 값이 힙(heap) 메모리에 새로운 객체로 복사됩니다.
- 언박싱(Unboxing): object 형식을 다시 원래의 값 형식으로 변환하는 과정이며, 명시적 캐스팅이 필요합니다.
object 데이터 형식 사용 예제
다음 예제는 object 변수에 정수를 할당했다가(박싱), 다시 사용자 정의 클래스 객체를 할당하고 캐스팅하여 활용하는 방법을 보여줍니다.
using System;
using System.IO;
namespace Demo {
class objectClass {
public int x = 56;
}
class MyApplication {
static void Main() {
// 값 형식 96을 object에 할당 (박싱 발생)
object obj;
obj = 96;
Console.WriteLine(obj);
// 참조 형식 객체를 object에 할당 후 캐스팅
obj = new objectClass();
objectClass newRef;
newRef = (objectClass)obj;
Console.WriteLine(newRef.x);
}
}
}실행 결과
96 56
위 코드에서 obj = 96;은 int 값을 object로 박싱하는 대표적인 예이며, (objectClass)obj처럼 명시적 캐스팅을 통해 object를 원래 형식으로 되돌릴 수 있습니다. 다만 박싱과 언박싱은 성능 오버헤드를 유발할 수 있으므로, 제네릭(Generic)을 활용하면 불필요한 변환 없이 타입 안전성과 성능을 동시에 확보할 수 있습니다.