이 포스트를 만든 목적
- 진짜 심심해서
이 포스트의 준비 상황
- gVim 7.2
- Microsoft Visual C# 2010 Express
- .NET 2.0 이상을 기준으로 한다.
즉, Generic IComparable<T>, IComparer<T> 만 설명한다.
2005년에 .NET 2.0 나왔으므로, 현 시점에서 Generic을 쓰지 않는건 몹시 이상하다.
참조 링크
- http://blog.naver.com/mrlongpark/150052012159
- http://support.microsoft.com/kb/320727
- http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx
- http://msdn.microsoft.com/en-us/library/4d7sx9hd.aspx
- http://stackoverflow.com/questions/538096/when-to-use-icomparablet-vs-icomparert
내용
왜 이 두 인터페이스를 이용해야 하는가?
- 닷넷 프레임 워크에서 이 두 interface 는 각 타입별 intance간 동등성
- IComparable은 타입에 동등성(등급의 정도, 높고 낮음, Equivalence)을 갖게 할 때, 사용 된다.
- 동등성이 필요할 경우란, 정렬이나 검색을 할 때 를 말한다.
- 그렇다고 <, >, >=, <= 이 되는건 아니다. 보통 IComparable 를 사용하면, <, >, >=, <= 를 정의해 준다.
- IComparer은 타입의 인스턴스간 비교를 별도(비교자)로 처리하기 위해서 사용 된다.
- 클래스 자체에 동등성을 부여할 수 없거나, 재정의 하고 싶거나, 타입이 컬렉션내 sort 되게 할 때, 사용한다.
어떻게 IComparable<T> 을 사용 하는가?
IComparable interface를 사용 하고, ComparaeTo 함수만 정의해 주면 된다. 하지만 다음에 나열한 규칙들을 지켜야 한다.
- 내가 비교할 객체보다 작을 경우, 음수를 리턴해야 한다. 보통 -1을 사용 한다.
- 내가 비교할 객체보다 같을 경우, 0을 리턴해야 한다.
- 내가 비교할 객체보다 클 경우, 양수를 리턴해야 한다. 보통 1을 사용 한다.
IComarable<T> interface Example Code - 맛보기 코드
어떻게 IComparer<T> 을 사용 하는가?
IComparer<T> interface를 사용 했을 때, Compare(...)의 반환값은 각자가 정하는데, 보통은 ComparerTo 와 똑같이 해준다.
IComparer<T> interface Example Code - 맛보기 코드
결론
- 동등성을 부여해 주거나, 별도로 처리해 주기 위해선 IComparable<T> 혹은 IComparer<T> 로 구현해 주는게 좋다. 왜냐하면 이것은 표준화된 방법이기 때문이다.
- 보통은 IComparable<T>로 처리하고, 클래스 자체를 수정 할 수 없을 떄는 IComparer<T>를 사용한다.
여담
- 끝으로 갈 수록 점점 어려워 진다.
'책 정리 > Effective C#' 카테고리의 다른 글
item 31, 작고 단순한 메서드가 더 좋다. (0) | 2010.07.25 |
---|---|
item 30, CLS를 준수하는 어셈블리가 더 좋다. (0) | 2010.07.25 |
item 29. 기반 클래스의 변경이 영향을 줄 경우에만 new 한정자를 사용하라. (0) | 2010.07.22 |
item 28, 형변환 연산자의 구현을 피하라 (0) | 2010.07.21 |
item 27, ICloneable의 구현을 피하라 (4) | 2010.07.20 |
item 25, serializable 타입이 더 좋다. (0) | 2010.07.18 |
item 24, 명령적 프로그래밍보다 선언적 프로그래밍이 더 좋다. (0) | 2010.07.14 |
item 23, 클래스 내부 객체에 대한 reference 반환을 피하라. (0) | 2010.07.11 |
item 22, 이벤트를 이용하여 외부로 노출할 인터페이스를 정의하라. (0) | 2010.07.10 |
item 21, delegate를 이용하여 콜백을 표현하라. (1) | 2010.07.10 |
최근댓글