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시에 하므로, 여기서 이만 줄이고, 나가서 맛난거 좀 사와야겠다. : )
'책 정리 > Effective C#' 카테고리의 다른 글
item 14, 연쇄적인 생성자 호출을 이용하라. (4) | 2010.07.02 |
---|---|
item 13, static 클래스 멤버는 static 생성자를 사용하여 초기화 하라. (0) | 2010.07.01 |
item 12, 할당문보다는 변수 초기화를 사용하는 편이 더 좋다 (0) | 2010.06.30 |
item 11, foreach 루프가 더 좋다. (0) | 2010.06.29 |
item 10, GetHashCode()의 함정을 유의하라 (0) | 2010.06.27 |
item 8, value 타입을 사용할 때 0이라는 값이 의미를 가질 수 있도록 하라 (0) | 2010.06.24 |
item 7, immutable atomic value 타입이 더 좋다 (0) | 2010.06.23 |
item 6, value 타입과 reference 타입을 구분하라. (0) | 2010.06.20 |
Item 5, 항상 ToString()을 작성하라. (0) | 2010.06.11 |
item 4, #if 대신 Conditional Attribute를 사용하라. (0) | 2010.06.05 |
최근댓글