ITEM 6 : Understand the Relationships Among the Many Different Consepts of Equality.
(Equality의 다양한 다른 의미들의 관계를 이해하라)
■ 요약 및 장점
1. 두 가지를 같다(Equality)라고 할 때는, 대상마다 다른 비교방식을 사용한다.
(예를 들어서 참조타입은 같은 object를 참조하고 있으면 같다라고 하고, 값타입은 같은 타입이면서 동시에 같은 값을 가지고 있어야 한다.)
2. 두 가지의 타입이 같다(Equality)를 정의하는 데는 4가지의 함수가 존재한다.
ReferenceEquals(object left,object right) - 재정의 하면 안됨
Equals(object left,object right) - 재정의 하면 안됨
Equals(object right) - 재정의 가능
operator==(Mycalssleft,Mycalss right) - 재정의 가능
3. 4가지의 함수 중에서 위의 2가지는 재정의 하거나 오버로드(overload)하면 안된다.
이 두가지는 이미 원하는 기능을 정확히 수행하기 때문이다.(because it already does exactly what it needs to do)
4. Object.ReferenceEquals()는 값타입 이든 참조타임 이든, 항상 Obejct identity만 테스트 한다. object contents는 테스트 하지 않는다.
따라서 값타입에 대한 Equality 테스트는 항상 False를 리턴한다.
심지어 자기 자신을 비교해도 boxing이 일어나기 때문에 false를 리턴한다.
5. Object.Equals()는 두개의 인자(argument)의 런타임 타입을 알지 못 할 때,두 변수가 같은지 아닌지를 테스트할 때 사용한다.
6. static Equals(Object.Equals())는 두개의 객체가 같은지 아닌지를 결정하기 위해서 왼쪽 인자(left argument)의 instance Equals() 사용한다.<return left.Equals(right)>
7. instance Equals()의 오버라이드는 당신이 참조타입에 대해서 정의된 의미를 바꾸고 싶을때만해야한다.
8. 당신의 타입이 참조 의미 대신, 값 의미를 따를 때 instance Object.Equals()를오버라이드해야한다.
9. C#에서는 this는 절대 null이 될 수 없다.
10. 값 타입을 생성할때마다 Equals()를 override 하고, 참조 타입이 참조 의미를 따르고 싶지 않을 때 override 해라.
11. 참조 타입을 생성할 때마다 operator==()를 재정의 해라. 기본 메서드는 두개의 값 타입을 비교할 때 리플렉션을 사용하기 때문에
효울적이지 못하다.
12. 결론적으로, 값 타입에 대해서 속도가 빠르기 때문에 instance Equals()과 operator==()를 항상 재정의 해야한다.
같다는 것이 object identity가 아니다 다른 의미를 원할때만 참조 타입에 대해서 instance Equals()를 재정의 하라.
Equals()를 재정을 할때는 언제나 IEquatable<T>를 구현해라.
■ Terms
■ 해석이 모호하거나 중요한 구문
1. So how does this method test the equality of two variables, without knowing their type,when equality changes its meaning depending on the type?(타입에 따라서 Equality가 그 의미를 변경 할 때, 그들의 타입을 알지 못하고 어떻게 두 변수의 같음을 이 메소드가 테스트 할 수 있을까?) 무슨 말일까…
■ 단어
1. semantic : 의미의, 의미론적인
2. just[only] because : ~이라고 해서,오로지 ~ 이므로
3. need : ~을 필요로 하다/~ 해야한다./(반드시)~ 해야한다.
4. identity : 신원,정체/유사성,동질감
5. refer to :~을 지칭하다,~을 나태내다/~을 보다[참고하다,참조하다],~에게 문의하다.
6. referred to as : ~라고 불리다 cf)refer to A as B : A를 B라고 부르다의 수동태형
7. that is(to say) : 즉[말하자면]
8. whether : ~인지/~이든
9. depending on : ~에 따라/~에 의존하다.
10. delegate : 위임하다/선정하다.
11. in question : 문제의, 논의가 되고 잇는
12. in detail : 상세하게.
13. as with : ~와 마찬가지로
14. as : ~하는 동안에/~대로/~때문에
15. consistentwith :~와 일치하는
16. reflexive : 재귀 용법의
17. symmetric : 대칭적인/균형이잡힌
18. transitive :이행성(a와 b가 같고 b와 c가 같으면 a와c가 같아야되는 것)
19. now that : ~이므로, ~ 이기 때문에
20. implication:결과,영향
21. elide :발음을 생략하다.
22. hierarchy: 계급/지배층/체계.
23. practice : 실행,실천/관습,관행
24. along with : ~에 덧붙여,~와 마찬가지로/~와 함께.~에 따라
■ 피드백 및 개인 생각
:난해한 챕터이다. 저는 클래스를 생성할때 Equality를 사용을 잘 안합니다.
클래스 인스턴스 사이에서 내부의 상태에 대한 비교가 필요할때 재정의 해서 사용을 하면 좋은거 같습니다.
'프로그래밍 > Effective C#' 카테고리의 다른 글
ITEM 8 : Loop 구문보다 Query Syntax를 이용하라. (0) | 2013.08.23 |
---|---|
ITEM 7 : GetHashCode의 함정을 이해하라. (0) | 2013.07.11 |
ITEM 5 : 항상 ToString()을 제공해라. (1) | 2013.07.11 |
ITEM 4 : #if 대신에 Conditional Attributes를 사용해라 (0) | 2013.07.11 |
ITEM 3 : Cast 보다 is 나 as 연산자를 선호해라 (2) | 2013.05.28 |