item 9, ReferenceEquals(), static Equals(), instance Equals(), operator==의 상호 연관성을 이해해라.
Purpose-built post
공부하려고 정리한다.
Content
관련 링크
주의
제목에서 ReferenceEquals() 와 static Equals()는 System.Object 객체의 static 멤버 함수이며, instance Equals()는 생성된 객체의 멤버함수, operator== 는 C#의 operator 를 뜻한다는 것을 알아야 한다.
왜 이러한 연관성을 알아야 할까?
C# 에서 서로 "같다" 라는 "비교" value 타입 과 reference 타입이 서로 다르기 때문에 같다 비교 연산이 4개나 존재 한다. :)
위의 결과를 보면 difference 가 출력 되는데, 그 이유가 바로 reference 비교이기 때문이다. 이러한 같다 비교 연산이 서로 얽혀 있어, 재정의시 주의 해야 하기 때문에, 알아야 한다.
어떻게 서로 연관되어 있는가?
Object.ReferenceEquals()
참조자가 같은지만 비교 한다.
Object.Equals()
operator== 과 instanace.Equals() 을 사용하여 구현되어 있다.
instance Equals()
Reference 타입의 instance 일 경우, 기본동작은 Object.ReferenceEqaul() 과 동일하다.
Value 타입의 instance 일 경우, 기본동작은 System.ValueType.Equals()과 동일하다. System.ValueType.Equals()는 Object.Equals()를 재정의 한 것이다.
operator==()
다른 비교 함수를 사용 하는 것은 아니지만, instance Equals()을 재정의 해야 할 경우, ValueType 이면, 똑같이 만들어 주기 위해서 재정의 해야 하고, Reference 타입일 경우, Object.ReferenceEqulas()와 동일하지만, instance Eauls()와 동일하게 작동시키기 위해선 재정의 해야 한다.
언제 재정의를 해야 하는가?
- 비교 방법이 달리 해야 할 경우, 예를 들어 string 객체같을 경우이다.
- 성능에서 비용을 많이 지불 할 경우, 예를 들어 ValueType의 경우 reflection을 이용하기 때문에, 비용이 크므로, 재정의 하는게 보통 성능이 더 빨라진다.
- 위의 경우로 재정의 해서, 얽힌것도 재정의 해야 할 경우
이렇게 3가지 정도쯤 있다.
Digression
- Object.ReferenceEquals() 와 Object.Equals()는 재정의 하지 마라. 왜냐하면 기본 역활을 충실히 수행 하고 있으므로 재정의할 필요가 없기 때문이다.
- 오늘은 우리나라가 2010 남아공 월드컵에서 우루과이와 16강 대전하는 날이다. .. 오후 11시에 하므로, 여기서 이만 줄이고, 나가서 맛난거 좀 사와야겠다. : )