Object는 C#의 모든 클래스와 타입이 궁극적으로 상속받는 최상위 기본 클래스로 int, string, List <T>, Dictionary <K, V> 같은 모든 타입이 Object에서 상속된다.
기본적으로 ToString(), Equal(), GetType() 등의 메서드가 제공되며 다형성 활용이 주목적이며
다형성 활용하면 떠오르는 방식인 <T> 제네릭과는 큰 틀에서는 비슷한 성향을 보이지만 일부 차이점이 존재하며 상황에 맞도록 둘을 구분하여 사용해야 한다.
Object와 비교하면 <T> 제네릭이 대부분의 상황에서 효율적이지만 다음 설명할 차이점에 따라 Object를 사용해야 하는 경우도 존재한다.
✅ 제네릭과 object를 언제 써야 할까?
상황 | T(제네릭)을 사용해야 하는 경우 | object를 사용해야 하는 경우 |
타입 안정성 | 타입이 명확하고, 캐스팅 없이 안전하게 사용해야 할 때 | 여러 타입을 다뤄야 하고, 특정 타입을 미리 정하기 어려울 때 |
성능 | 값 타입(int, float)을 다룰 때 (박싱/언박싱 방지) | 성능보다는 유연성이 중요한 경우 |
저장 | 같은 타입의 데이터를 저장해야 할 때 (List<T>) | 여러 타입을 저장해야 할 때 (List<object>) |
타입 처리 | 타입을 미리 알고 있어야 할 때 | 런타임에서 동적으로 타입을 결정해야 할 때 |
이벤트 시스템 | 타입별로 다른 이벤트를 만들 때 (Action<T>) | 여러 타입의 이벤트를 하나의 핸들러에서 처리할 때 (Action<object>) |
이와 같이 아직 정해지지 않은 타입을 다룰 때, 하나의 같은 타입 데이터 만들 저장 및 다룰 시 T(제네릭)을 사용하고
여러 타입 데이터를 저장 및 다룰 시 Object를 사용해야 한다.
이때 Object의 경우 여러 타입을 사용하기 때문에 타입을 꺼낼 때 (int)@@ (string)@@ 과 같이 캐스팅이 필요하다.
✅ 박싱(Boxing), 언박싱(Unboxing)
위와 같은 캐스팅이 필요한 이유는 Object의 특징 때문인데, 여러 타입의 데이터를 저장할 때 Object로 박싱 해주고, 타입을 꺼내쓸 때 원래의 타입으로 돌리기 위한 언박싱 작업이 바로 캐스팅이다.
object boxedNumber = 10; // 박싱 (int → object)
int unboxedNumber = (int)boxedNumber; // 언박싱 (object → int)
✅ Object 클래스 예시
그럼 이러한 Object 클래스는 어떻게 활용을 할까?
void PrintInfo(object obj)
{
Console.WriteLine(obj.ToString());
}
PrintInfo(123); // "123"
PrintInfo("Hello"); // "Hello"
PrintInfo(new Monster("드래곤")); // "Monster Name: 드래곤"
Object의 특징은 이와 같이 유연한 타입활용, 형변환이기 때문에 특정 행동을 할 때 유연하게 사용 및 여러 타입에 접근해야 할 경우 사용할 수 있다.
✅ 유니티에서의 활용
유니티에서 Object 클래스를 사용할 경우 이벤트 시스템에서 유연한 형변환 특성을 이용할 수 있다.
public class EventManager
{
public static event Action<object> OnEventTriggered;
public static void TriggerEvent(object data)
{
OnEventTriggered?.Invoke(data);
}
}
// ✅ 이벤트 사용 예시
EventManager.OnEventTriggered += (data) =>
{
Debug.Log($"이벤트 발생! 데이터: {data}");
};
// ✅ int 타입도 가능
EventManager.TriggerEvent(100); // 이벤트 발생! 데이터: 100
// ✅ string도 가능
EventManager.TriggerEvent("몬스터 출현!"); // 이벤트 발생! 데이터: 몬스터 출현!
이벤트 시스템뿐만 아니라 게임의 데이터를 JSON이나 PlayerPrefs에 저장할 때에도 Object를 통해 유연하게 저장 및 불러오기를 할 수 있다는 점이 Object만의 장점이라고 볼 수 있다.
3줄 요약
1. Object는 모든 타입을 저장할 수 있지만, var나 T(제네릭)와는 다르게 캐스팅이 필요할 수 있음.
2. 유니티에서는 Object를 활용해서 이벤트 시스템, 저장 시스템 등에 활용할 수 있음.
3. 하지만 Object를 쓸 때는 박싱/언박싱 비용이 발생할 수도 있어서 제네릭을 활용하는 것이 더 효율적일 수도 있음.
'C# > 기본 문법' 카테고리의 다른 글
C# 상속 시 클라스 확인 (0) | 2025.03.14 |
---|---|
C# Parsing (0) | 2025.02.17 |
C# HashSet<T> (자료구조) (0) | 2025.02.12 |
C# Stack (자료구조) (0) | 2025.02.11 |
C# Nullable (0) | 2025.02.10 |