2010.07.19 13:43 책 정리/Effective C#

이 포스트를 만든 목적

  • 진짜 심심해서

이 포스트의 준비 상황

  • 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>를 사용한다.

여담

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


저작자 표시
신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요

  1. 지나가는개발자 2010.11.11 18:02 신고  Addr  Edit/Del  Reply

    잘 보았습니다! 깔끔하게 정리를 잘해주셨네요 -_-b

  2. Favicon of http://blog.hasol.net/ 하솔 2011.02.21 21:54 신고  Addr  Edit/Del  Reply

    책은 한번 읽어봤는데 사실 기억이 잘 안나더라구요~
    깔끔하게 잘 정리해 주셔서 기억을 더듬을 수 있었습니다. ^^

  3. Favicon of http://blog.naver.com/bassfrontier 엘리후 2012.04.18 13:17 신고  Addr  Edit/Del  Reply

    좋은 정보 감사합니다.
    다른 곳보다 훨씬 깔끔하고, 명확하게 정리가 되어 있어서 유일하게 도움이 되었네요.^^

  4. 앞으로 전진 2013.01.31 13:32 신고  Addr  Edit/Del  Reply

    정말 정리가 잘되어있어요 짱입니다. ^^
    쉽게 이해했습니다.
    최익필님 감사합니다 :)

  5. 이혜성 2013.11.11 00:19 신고  Addr  Edit/Del  Reply

    감사합니다 정말 머리가 빵! 시원하네요
    아 저 그리고 여쭤볼게 있는데 혹시 블로그에 소스 어떻게 올리세요?
    저는 소스를 올리면 다 자동으로 왼쪽정렬되더라구요 tab쓰면 또 이상해지고.. ;