
✍️ 개요
모든 .NET 클래스의 루트 상속 클래스는 항상 object입니다. 즉, 모든 클래스는 object에서 비롯되었다고 볼 수 있습니다. 오늘은 C# object 클래스가 무엇인지, 그리고 object가 제공하는 메서드가 무엇인지 Unity 예제를 통해 알아보도록 하겠습니다.
📌 Object란?

Object: .NET의 System.Object을 의미하며, C#의 모든 데이터 타입이 상속받는 클래스입니다.
간단한 예시를 통해 object에 대해 알아보도록 하겠습니다.
using System;
// The Point class is derived from System.Object.
class Point
{
public int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
}
위 코드는 (x, y) 위치 정보를 담은 [ Point ] 클래스입니다.
이때, [ Point ] 클래스는 System.Object 클래스에서 파생됩니다.

그렇기 때문에 [ Point ] 클래스는 System.Object 클래스 메서드를 사용할 수 있습니다.
(GetType, Equals, ToString, GetHashCode 메서드 등)
public override bool Equals(object obj)
{
// If this and obj do not refer to the same type, then they are not equal.
if (obj.GetType() != this.GetType()) return false;
// Return true if x and y fields match.
var other = (Point) obj;
return (this.x == other.x) && (this.y == other.y);
}
// Return the XOR of the x and y fields.
public override int GetHashCode()
{
return x ^ y;
}
// Return the point's value as a string.
public override String ToString()
{
return $"({x}, {y})";
}
// Return a copy of this point object by making a simple field copy.
public Point Copy()
{
return (Point) this.MemberwiseClone();
}
원한다면 오버라이딩을 통해 ==, != 연산자를 새롭게 정의하거나, ToString()을 커스터마이징 할 수 있습니다.
위 코드는 Object 클래스의 메서드를 커스텀하여 정의한 코드입니다.
코드 해석
- Eqauls : Type이 같은 지 체크한 후, 좌표 (x, y)가 동일하다면 true, 아니면 false를 리턴합니다.
- 사용 예시: if (p1 == p2) { ... } 혹은 if (p1 != p2) { ... }
- GetHashCode : 좌표 (x), (y) 값을 XOR 한 값을 리턴합니다.
- 사용 예시: Dictionary Key의 고유성을 GetHashCode로 판단
- ToString() : Point 객체를 좌표 (x, y) string으로 반환합니다.
- 사용 예시: Debug.Log($"좌표 ({p.x}, {p.y})");
- Copy() : MemberwiseClone 메서드로 참조만 복사하여 반환합니다. (얕은 복사)
- 사용 예시: Point new_p = p;
- 깊은 복사를 원한다면 로직을 새롭게 작성해야 합니다.
⚠️ Unity의 Object와 System.Object는 서로 다릅니다!
Unity Object: UnityEngine 네임스페이스에 정의된 클래스로, Unity Engine에서 제공하는 객체(GameObject, Transform, Texture 등)의 기본 클래스입니다.
Unity Object는 System.Object와 달리 Unity 에디터와 게임 런타임에서 동작하기 위해 설계된 추가 기능을 제공하는 클래스입니다.
이때, Unity Object는 ==, != 연산자를 오버라이딩하였기 때문에 개발을 하다 null 비교 문제가 많이 발생합니다. 이 문제를 Fake Null 문제라고 부르는데, 이 부분에 대해선 추후에 자세히 다루도록 하겠습니다.
📌 Boxing & Unboxing

Boxing: 값 형식을 object 형식으로 형변환
Unboxing: object 형식을 값 형식으로 형변환
즉, 값 형식인 int, float, double, bool, struct 데이터 형식도 object로 관리할 수 있다는 말입니다.

하지만 새로운 object 객체를 Heap 메모리 영역에 할당하고 생성하기 때문에 성능이 좋지 않습니다.
참고로 unboxing의 경우 캐스트 프로세스가 추가되어 boxing보다 약 4배 정도 느립니다.
따라서 잦은 Boxing & Unboxing이 발생한다면 데이터를 값 형식가 아닌, 참조 형식을 사용하는게 좋습니다.
그렇다면 Unity에서는 주로 어떻게 Boxing & Unboxing을 활용할까요?
Unity Manager 초기화 활용


위 코드를 살펴보면 초기화 함수 인자로 [ data ] object 값을 받습니다.
그리고 내부에서 SceneDataBase로 형변환을 수행하고 값을 처리합니다.
object는 값 형태와 참조 형태를 모두 받을 수 있기 때문에 범용성이 매우 높습니다.
따라서 Manager를 관리하거나, 씬 전환 시 특정 데이터를 넘겨줄 때 많이 사용합니다.
(성능 문제가 발생할 수 있으니 매번 호출하는 구조에서는 사용하지 않는게 좋습니다)
📝 정리
오늘은 Object와 Boxing & Unboxing에 대해서 알아보았습니다.
① System.Object : .NET의 System.Object을 의미하며, C#의 모든 데이터 타입이 상속받는 클래스
② Boxing: 값 형식을 object 형식으로 형변환
③ Unboxing: object 형식을 값 형식으로 형변환
Object를 통해 모든 데이터를 받을 수 있기 때문에, 게임 시스템 설계에 많이 사용됩니다. 다만, 범용성이 큰 만큼 예외 처리를 확실히 해야 하며, 지나친 남용은 구조를 파악하기 힘들게 만듭니다. 또한 성능 비용이 크기 때문에 실시간으로 Boxing & Unboxing을 처리하는 것은 피하는게 좋습니다.
💡 참고 자료
[ Microsoft Learn 공식 문서: Object 클래스 ]
Object 클래스 (System)
.NET 클래스 계층의 모든 클래스를 지원하고 파생 클래스에 하위 수준 서비스를 제공합니다. 이는 모든 .NET 클래스의 궁극적인 기본 클래스입니다. 형식 계층의 루트입니다.
learn.microsoft.com
[ Microsoft Learn 공식 문서: Boxing & Unboxing ]
boxing 및 unboxing - C#
C# 프로그래밍의 boxing 및 unboxing에 대해 알아봅니다. 코드 예제를 살펴보고 사용 가능한 추가 리소스를 확인합니다.
learn.microsoft.com
'C#' 카테고리의 다른 글
[C#] 소개 및 특징 (1) | 2024.11.22 |
---|