C#의 가장 중요한 특성 중 하나는 '모든 Type은 System.Obejct를 상속받는 것'이다. 다시말하면, C#언어의 모든 타입은 System.Object가 제공하는 메소드를 가지고 있다는 것이다. System.Obejct에는 4개의 instance method와 2개의 static method가 존재한다.
public virtual bool Equals(object obj)
값을 비교한 결과를 반환한다. Value와 Reference에 대해 비교대상이 달라지는데, Reference는 할당된 메모리 위치를 가리키는 식별자의 값을 비교한다.
public virtual int GetHashCode()
특정 인스턴스를 고유하게 식별할 수 있는 4바이트 int값을 반환한다.
public Type GetType()
클래스가 보유한 System.Type 인스턴스를 반환한다.
public virtual string ToString()
인스턴스가 속한 클래스의 이름을 반환한다. C#에서 제공되는 기본 타입(short, int, ...)은 클래스의 이름이 아닌 해당 타입이 가지고 있는 값을 반환하도록 되어있다.
이 외에는 MemberwiseClone이라는 메소드가 있다. Object의 단순 복사본을 만든다고 공식문서에 설명되어있다.
System.Object에 기본적으로 구현되어 있는 ToString 메소드는 '타입 이름을 문자열로 반환'하도록 구현되어 있다. 아래 예제를 보면 간단한 좌표를 나타내는 Point 클래스가 정의되어 있고 p1, p2라는 인스턴스가 할당 되어 있다.
p1, p2의 ToString 결과는 객체의 이름인 Point가 될 것이다.
class Point
{
private int xPos = 0;
private int yPos = 0;
public Point(int x, int y) { xPos = x; yPos = y; }
}
class Program
{
public static void Main(string[] args)
{
Point p1 = new Point(1, 1);
Point p2 = new Point(2, 2);
Console.WriteLine(p1.ToString()); // Point
Console.WriteLine(p2.ToString()); // Point
}
}
하지만, Point 객체를 문자열로 바꿀 때 (x, y)나 [x, y]같은 좌표 표현 방식으로 하고 싶다면 ToString 함수를 override하는 방법이 있다. 이 외에도 다른 가상함수를 응용하여 특정 클래스 만의 일치방식이나 문자열을 추출할 수 있다.
class Point
{
private int xPos = 0;
private int yPos = 0;
public Point(int x, int y) { xPos = x; yPos = y; }
public override string ToString()
{
return string.Format($"[{xPos}, {yPos}]");
}
}
class Program
{
public static void Main(string[] args)
{
Point p1 = new Point(1, 1);
Point p2 = new Point(2, 2);
Console.WriteLine(p1.ToString());
Console.WriteLine(p2.ToString());
}
}