-
IComparable 인터페이스를 이용한 객체의 정렬C# 예제 공부일기 2020. 7. 21. 19:06
C#의 컬렉션은 대부분 Sort메소드를 제공하는데 IComparable 인터페이스를 구현해야 정상적으로 동작한다. IComparable 인터페이스는 자신과 비교할 매개변수를 비교하여 결과를 반환하는 CompareTo메소드를 만들도록 약속하고 있다. 매개변수 형식이 object 형식으로 되어 있으므로 프로그램의 목적에 맞게 캐스팅하여 처리해야 한다.
interface IComparable { int ComapreTo(object obc); }
C#의 System에 정의되어 있는 int, double, string 등의 기본 형식들은 IComparable 인터페이스를 기반으로 정의되어 있어서 이들 기본 형식을 보관한 컬렉션은 Sort메소드를 이용하여 정렬할 수 있다. 우리가 사용하는 클래스에 IComparable 인터페이스를 상속해서 그 안에 CompareTo(object obj) 만 재정의하고 나머지는 평범한 클래스와 똑같이 사용하면 Sort메소드를 이용하여 정렬 가능.
미술가들을 태어난 년도를 기준으로 정렬하는 방법
static void Main(string[] args) { Artists[] famuceArtists = { new Artists("레오나르도 다빈치","이탈리아",1452,1519), new Artists("빈센트 반 고흐","네델란드",1853, 1890), new Artists("클로드 모네","프랑스",1840,1926), new Artists("파블로 피카소","스페인",1881,1973), new Artists("베르메르","네델란드",521,1675), new Artists("르노아르","프랑스",1841,1919) }; //객체 생성 //객체를 자료형으로 가지는 리스트 생성 List<Artists> artistic19C = new List<Artists>(); foreach (var artist in famuceArtists) { if (artist.Birth > 1800 && artist.Birth <= 1900) artistic19C.Add(artist); } //출생년도가 1800~1900 만 리스트에 추가 //IComoparer를 사용하여 정렬 artistic19C.Sort(); //밑에 보면 Comparetto 메소드가 재정의 되어있다. Console.WriteLine("19세기 미술가를 탄생 순 정렬 : IComparer"); foreach (var a in artistic19C) { Console.WriteLine( a.ToString()); } } class Artists : IComparable { //프로퍼티로 get set public string Name { get; set; } public string Country { get; set; } public int Birth { get; set; } public int Die { get; set; } public Artists (string name, string country, int birth, int die) { //클래스 변수 초기화 Name = name; Country = country; Birth = birth; Die = die; } public int CompareTo(object obj) //CompareTo 메소드 재정의 { Artists a = (Artists)obj; return this.Birth.CompareTo(a.Birth); //나이를 기준으로 정렬 } public override string ToString() //ToString 메소드 오버라이딩 { return string.Format(" {0}, {1}, {2} , {3}", Name, Country, Birth, Die); } }
먼저 객체 배열인 famuceArtists에 각각 Artists를 클래스로 객체를 생성한다. 각각의 객체를 Artists를 자료형으로 가지는 리스트를 생성해서 Birth가 1800~1900인 객체만 리스트에 추가한다. 추가한 후 리스트를 Sort로 정렬하는데 이때 밑에서 정의한 CompareTo 메소드를 가지고 정렬한다. 현재 객체의 Birth와 메소드의 매개변수로 들어온 객체의 Birth를 비교해서 정렬한다. 만약 내림차순으로 정렬한다면 a.Birth.CompareTo(this.Birth)로 적으면 된다.
앞으로 리스트를 쓸일이 있으면 생성한 클래스에 IComaparable을 상속한 다음 CompareTo메소드를 재정의해서 사용하면 될 것 같다.
'C# 예제 공부일기' 카테고리의 다른 글
Stack<T> 와 Polish 계산기 (0) 2020.07.21 Queue<T> 컬렉션의 사용 방법 (0) 2020.07.21 두 개의 배열을 쌍으로 정렬 (0) 2020.07.20 배열을 내림차순으로 정렬하는 방법 (0) 2020.07.20 List<T>와 배열의 정렬 (0) 2020.07.20