다루는 내용
- Object
- Object에서 파생된 클래스에서 재정의할 수 있는 메소드
C#의 object형식은 .NET Framework의 Object형식에 대한 별칭입니다.
Object는 모든 형식 계층 구조에서 루트여서 모든 형식은 Object로부터 암시적으로 파생이 된다.
Object는 다음과 같은 메소드들을 제공을 하고 있으며 모든 형식은 암식적으로 파생된 형식들이므로 이들을 사용할 수 있다.
또한 파생된 클래스에서는 virtual 메소드를 override할 수 있다.
[SerializableAttribute]
//클래스가 serialize될 수 있음을 표시
[ComVisibleAttribute(true)]
//COM에 대한 어셈블리 내의 관리되는 형식의 액세스 가능성을 제어
[ClassInterfaceAttribute(ClassInterfaceType.AutoDual)]
//COM에 노출될 클래스에 대해 생성될 클래스 인터페이스의 형식을 표시
public class Object
{
public virtual bool Equals(Object obj);
public static bool Equals(Object objA, Object objB);
public virtual int GetHashCode();
public Type GetType();
protected Object MemberwiseClone();
public static bool ReferenceEquals(Object objA, Object objB);
public virtual string ToString();
}
- public virtual bool Equals(Object obj);
- public static bool Equals(Object objA, Object objB);
참조형식일 경우에는 인스턴스의 일치에 대한 결과를 값 형식에 대해서는 값의 일치에 대해 반환을 하는 것으로 기본 구현되어 있다. 물론, 재정의를 통해 참조 형식일 경우에도 값의 일치를 반환할 수 있을 것이며 string의 경우가 그렇다.
- public virtual int GetHashCode();
해시 코드를 반환을 하는데 이는 해시 테이블과 같은 자료구조에서 빠른 탐색을 할 목적으로 사용될 수가 있을 것이다.
하지만 해시 코드는 서로 다른 인스턴스가 같은 해시 코드를 갖을 수 있기 때문에 인스턴스를 구분하기 위한 목적으로 사용될 수는 없다. 물론 재정의가 가능하기 때문에 그러한 목적으로 사용하게 변경을 할 수 있을 것이다.
- public Type GetType();
인스턴스의 형식(Type)을 반환하며 Type은 메타데이터에 액세스하는 매커니즘에 사용이 된다.
즉, 동일한 런타임 형식을 갖는 인스턴스의 경우 결과가 같다.
이는 Object의 static 메소드를 이용하면 쉽게 확인이 가능하다. (Object.ReferenceEquls(a.GetType(),b.GetType());)
- protected Object MemberwiseClone();
단순 복사본을 만들어 준다.
값 멤버 필드의 경우는 값을 복사를 해 주지만 참조 멤버 필드의 경우 같은 멤버를 참조하게 된다.
만약, 깊은 복사를 원할 경우에는 ICloneable 구현을 약속하여 Object Clone() 메소드를 정의를 하여 사용할 것을 권고한다.
- public static bool ReferenceEquals(Object objA, Object objB);
동일한 인스턴스인지를 판단한다.
- public virtual string ToString();
instance를 나타내는 문자열을 반환을 하는데 재정의하여 목적에 맞게 유연하게 사용할 수가 있다.
참고로 지역에 따라 기본 형식에 대한 ToString()의 결과가 다를 수 있다는 것에 주의하자.
Look & Feel & Think
앞에 항에서 말했듯이 value형식을 Object에 boxing을 하거나 역으로 unboxing을 하는 과정은 성능을 떨어트리는 요소가 된다. 자주 boxing과 unboxing을 해야 하는 경우에는 wrapper 클래스를 정의하여 이러한 과정을 줄임으로써 성능 저하를 막을 수 있을 것이다. 물론, 이는 하나의 방법일 뿐 정답이 될 수는 없다.
class WrapInt
{
public int val;
public WrapInt(int _val)
{
val = _val;
}
public override bool Equals(object obj)
{
if (obj.GetType() != this.GetType())
{
return false;
}
WrapInt other = (WrapInt)obj;
return val == other.val;
}
public override int GetHashCode()
{
return val;
}
public override string ToString()
{
return String.Format("{0}", val);
}
public WrapInt Copy()
{
return (WrapInt)this.MemberwiseClone();
}
}
class TestObject
{
public void UseWrapper()
{
WrapInt w1 = new WrapInt(3);
WrapInt w2 = w1.Copy();
WrapInt w3 = w1;
if (w2 == w3)
{
Console.WriteLine("w2 is same with a w3.");
}
else
{
Console.WriteLine("w2 is not same with a w3.");
}
Console.WriteLine("w1:{0}", w1);
}
}
'언어 자료구조 알고리즘 > C# 언어 문법' 카테고리의 다른 글
13.메소드 (0) | 2009.08.19 |
---|---|
12. 속성(Property) (0) | 2009.08.19 |
11.Class (0) | 2009.08.19 |
10.Casting (0) | 2009.08.19 |
9.String (0) | 2009.08.19 |
7. 배열 (0) | 2009.08.19 |
6. valuetype 기본 형식 (0) | 2009.08.19 |
5. .NET Framework (0) | 2009.08.19 |
4. const 와 readonly (0) | 2009.08.19 |
3. 소멸자 (0) | 2009.08.19 |