Section 41.4: 인터페이스 구현 예제로써의 IComparable<T>
인터페이스에 대한 개념은 실제 어떻게 사용되는지를 직접 보기 이전에는 너무 추상적이어서 이해하기 어렵다고 느낄 수 있다. 그런 점에서, IComparable
과 IComparable<T>
는 인터페이스가 실제로 어떻게 유용하게 사용될 수 있는지를 보여주는 좋은 예제가 될 수 있다.
온라인 판매점을 위한 프로그램을 작성한다는 가정을 해 보자. 판매하기 위한 다양한 물품 (item) 들이 있을 것이며, 각 물품들은 이름, ID 번호, 그리고 가격 정보를 가지게 될 것이다.
public class Item {
public string name; // public 변수는 일반적으로 권장되지 않지만,
public int idNumber; // 이 예제를 간단히 표현하기 위해
public decimal price; // 속성값 대신 public 변수를 사용한다.
// 간략한 예제를 위해 본문 부분은 생략한다
}
이제 이 Item
들을 List<Item>
내에 저장을 해 둔 상태에서, 프로그램 어딘가에서 이 Item
들을 ID 번호 기준으로 오름차순 정렬을 수행하고자 하는 경우를 생각해 보자. 우리가 직접 정렬 알고리즘을 작성하는 대신, List<T>
에서 이미 제공하고 있는 Sort()
메소드를 이용할 수 있을 것이다. 그러나, 현재 구현된 Item
클래스만으로는 List<T>
로 하여금 어떤 순서로 정렬을 수행하여야 할지 알려줄 방법이 존재하지 않는다. 바로 이러한 경우에 IComparable
인터페이스를 사용할 수 있다.
CompareTo
메소드를 정확히 구현 (implement) 하려면, CompareTo
의 파라미터가 현재 값보다 작은 경우 양수를, 동일할 경우 0
을, 큰 경우 음수를 반환하도록 하여야 한다.
Item apple = new Item();
apple.idNumber = 15;
Item banana = new Item();
banana.idNumber = 4;
Item cow = new Item();
cow.idNumber = 15;
Item diamond = new Item();
diamond.idNumber = 18;
Console.WriteLine(apple.CompareTo(banana)); // 11
Console.WriteLine(apple.CompareTo(cow)); // 0
Console.WriteLine(apple.CompareTo(diamond)); // -3
해당 인터페이스를 구현한 Item
클래스 예제가 아래 소개되어 있다:
public class Item : IComparable<Item> {
private string name;
private int idNumber;
private decimal price;
public int CompareTo(Item otherItem) {
return (this.idNumber - otherItem.idNumber);
}
// 간결한 예제를 위해 이외의 부분은 생략한다
}
겉으로 보기에, CompareTo
메소드가 하는 일은 두 항목의 ID 번호간의 차이를 반환하기만 할 뿐이다. 그러나 이 코드가 실제적으로 수행하는 역할은 무엇일까?
이제, List<Item>
객체에 대해 Sort()
메소드가 불리는 경우, 해당 List
는 정렬 순서대로 항목들을 배치하기 위해 자동적으로 Item
의 CompareTo
메소드를 호출하게 될 것이다. 더 나아가, 두개의 각기 다른 항목에 대한 상호 비교 기능을 이미 선언하였기에, 우리의 Item
은 List<T>
이외에도 두 객체간의 비교를 필요로하는 모든 객체들과 연동하여 작업을 수행할 수 있게 될 것이다.
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.
[출처] https://books.goalkicker.com/CSharpBook/
'번역 > C# Notes for Professionals' 카테고리의 다른 글
41.6: 인터페이스 사용 목적 (0) | 2022.04.23 |
---|---|
41.5: 다중 인터페이스 구현 (implement) 하기 (0) | 2022.04.23 |
41.3: 인터페이스 관련 기본 사항들 (0) | 2022.04.21 |
41.2: 명시적인 인터페이스 구현 (implementation) 방법 (0) | 2022.04.11 |
41.1: 인터페이스 구현 (implement) 하기 (0) | 2022.04.08 |