이 포스트를 만든 목적

  • 진짜 심심해서

이 포스트의 준비 상황

  • gVim 7.2
  • Microsoft Visual C# 2010 Express
  • .NET 2.0 이상을 기준으로 한다.
    즉, Generic IComparable<T>, IComparer<T> 만 설명한다.
    2005년에 .NET 2.0 나왔으므로, 현 시점에서 Generic을 쓰지 않는건 몹시 이상하다.

참조 링크

내용

왜 이 두 인터페이스를 이용해야 하는가?

  • 닷넷 프레임 워크에서 이 두 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>를 사용한다.

여담

  • 끝으로 갈 수록 점점 어려워 진다.


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