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시에 하므로, 여기서 이만 줄이고, 나가서 맛난거 좀 사와야겠다. : )



  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기