본문 바로가기
Programming/C#

C# object 클래스 상속 구조 모든 타입의 시작점

by Dev_카페인 2024. 6. 10.
반응형

[C#] object 클래스 상속 구조: 모든 타입의 시작점

안녕하세요! 이번 포스트에서는 C#의 모든 타입이 상속받는 기본 클래스인 object 클래스에 대해 알아보겠습니다. C#에서 모든 타입의 기본 클래스는 object 클래스입니다. 이는 C#의 모든 타입이 object를 상속받는다는 것을 의미하며, object 클래스는 .NET 타입 시스템의 최상위에 위치합니다. object 클래스의 상속 구조, 주요 멤버들, 그리고 object 클래스에서 제공하는 기본 메서드들에 대해 자세히 알아보겠습니다.

object 클래스란?

C#에서 object 클래스는 모든 클래스, 구조체, 열거형, 델리게이트 등이 상속받는 기본 클래스입니다. 즉, C#의 모든 타입은 object에서 파생됩니다. 이는 모든 타입이 공통적으로 사용할 수 있는 기본 메서드들을 제공하며, 일관된 타입 시스템을 구성하는 데 중요한 역할을 합니다.

object 클래스의 주요 멤버

object 클래스는 다음과 같은 주요 메서드들을 제공합니다:

  • Equals(object obj): 현재 인스턴스와 지정된 객체가 같은지 여부를 결정합니다.
  • GetHashCode(): 기본 해시 함수로, 객체의 해시 코드를 반환합니다.
  • GetType(): 현재 인스턴스의 Type 객체를 가져옵니다.
  • ToString(): 현재 객체를 나타내는 문자열을 반환합니다.
  • Finalize(): 객체가 가비지 수집되기 전에 리소스를 해제합니다. 소멸자와 관련됩니다.

이제 각 메서드에 대해 자세히 알아보겠습니다.

Equals 메서드

Equals 메서드는 두 객체가 같은지 여부를 비교하는 데 사용됩니다. 기본 구현은 참조 형식의 경우 참조가 같은지 비교합니다. 값 형식의 경우, 기본적으로 값이 같은지를 비교합니다.

public class Program
{
    public static void Main()
    {
        object obj1 = new object();
        object obj2 = obj1;
        object obj3 = new object();

        Console.WriteLine(obj1.Equals(obj2)); // True
        Console.WriteLine(obj1.Equals(obj3)); // False
    }
}
 

위 예제에서 obj1과 obj2는 같은 참조를 가리키므로 Equals 메서드는 true를 반환합니다. 반면 obj1과 obj3는 다른 참조를 가리키므로 false를 반환합니다.

GetHashCode 메서드

GetHashCode 메서드는 객체의 해시 코드를 반환합니다. 해시 코드는 데이터의 빠른 검색과 비교를 위해 사용됩니다. 기본 구현은 객체의 참조를 기반으로 해시 코드를 생성합니다.

public class Program
{
    public static void Main()
    {
        object obj = new object();
        Console.WriteLine(obj.GetHashCode());
    }
}

위 예제에서 obj.GetHashCode()는 obj의 해시 코드를 반환합니다.

GetType 메서드

GetType 메서드는 현재 인스턴스의 Type 객체를 반환합니다. 이를 통해 객체의 런타임 타입 정보를 얻을 수 있습니다.

public class Program
{
    public static void Main()
    {
        int number = 42;
        Console.WriteLine(number.GetType()); // Output: System.Int32
    }
}

위 예제에서 number.GetType()은 number 변수의 타입인 System.Int32를 반환합니다.

ToString 메서드

ToString 메서드는 객체의 문자열 표현을 반환합니다. 기본 구현은 객체의 타입 이름을 반환합니다. 대부분의 클래스는 ToString 메서드를 재정의하여 객체의 의미 있는 문자열 표현을 제공합니다.

public class Program
{
    public static void Main()
    {
        object obj = new object();
        Console.WriteLine(obj.ToString()); // Output: System.Object

        DateTime now = DateTime.Now;
        Console.WriteLine(now.ToString()); // Output: 현재 날짜와 시간
    }
}

위 예제에서 obj.ToString()은 System.Object를 반환하고, now.ToString()은 현재 날짜와 시간을 반환합니다.

Finalize 메서드

Finalize 메서드는 객체가 가비지 수집되기 전에 리소스를 해제하는 데 사용됩니다. C#에서는 소멸자(destructor)로 표현되며, 주로 비관리 리소스를 해제하는 데 사용됩니다. 소멸자는 ~ClassName 형태로 정의됩니다.

public class ResourceHolder
{
    ~ResourceHolder()
    {
        // 리소스 해제 코드
    }
}

위 예제에서 ResourceHolder 클래스는 소멸자를 통해 객체가 가비지 수집되기 전에 리소스를 해제합니다.

모든 클래스의 상속 구조

C#에서 모든 클래스는 object를 상속받기 때문에, 사용자 정의 클래스도 object의 멤버를 상속받습니다.

public class MyClass
{
    public int Id { get; set; }
    public string Name { get; set; }

    public override string ToString()
    {
        return $"Id: {Id}, Name: {Name}";
    }
}

public class Program
{
    public static void Main()
    {
        MyClass myClass = new MyClass { Id = 1, Name = "Example" };
        Console.WriteLine(myClass.ToString()); // Output: Id: 1, Name: Example
    }
}

위 예제에서 MyClass는 object 클래스를 상속받으며, ToString 메서드를 재정의하여 사용자 정의 문자열 표현을 제공합니다.

 

다양한 활용 예제

object 클래스는 다양한 시나리오에서 유용하게 사용됩니다. 몇 가지 예제를 통해 object 클래스의 활용 방법을 살펴보겠습니다.

1. 타입 안전한 컬렉션

C#의 컬렉션 클래스들은 내부적으로 object 타입을 사용하여 다양한 타입을 저장할 수 있습니다. 제네릭 컬렉션을 사용하면 타입 안전성을 유지하면서도 다양한 타입을 저장할 수 있습니다.

List<object> list = new List<object>();
list.Add(1);
list.Add("string");
list.Add(new MyClass());

foreach (var item in list)
{
    Console.WriteLine(item);
}

2. 다형성

object 클래스는 다형성을 구현하는 데 중요한 역할을 합니다. 예를 들어, 매개변수 타입을 object로 지정하면 다양한 타입의 값을 받을 수 있습니다.

public void PrintObject(object obj)
{
    Console.WriteLine(obj.ToString());
}

PrintObject(123);
PrintObject("Hello, World!");
PrintObject(new MyClass { Id = 1, Name = "Example" });

3. 박싱(Boxing)과 언박싱(Unboxing)

값 형식은 필요에 따라 object 타입으로 변환될 수 있습니다. 이를 박싱(Boxing)이라고 하며, 반대로 object 타입에서 값 형식으로 변환되는 것을 언박싱(Unboxing)이라고 합니다.

int value = 42;
object boxedValue = value; // 박싱
int unboxedValue = (int)boxedValue; // 언박싱

마치며

이번 포스트에서는 C#의 모든 타입이 상속받는 기본 클래스인 object 클래스에 대해 알아보았습니다. object 클래스는 C# 타입 시스템의 최상위에 위치하며, 모든 타입이 공통적으로 사용할 수 있는 기본 메서드들을 제공합니다. 이러한 메서드들을 적절히 활용하면 더 효율적이고 일관된 코드를 작성할 수 있습니다. 추가적인 질문이나 궁금한 점이 있다면 언제든지 댓글로 남겨주세요!

반응형