본문 바로가기

C#/기본 문법

C# Object

 

 

 

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)

 

박싱(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