-
[C#] Delegate에 대한 공부(2)C# 2022. 3. 22. 08:41728x90
저번시간에는 Delegate의 간단한 정의와 사용법에 대해 알아봤습니다.
그럼이제 Delegate활용 중 하나인 일반화와 Delegate의 활용법에 대해 알아봤습니다.
많이 길어졌네요. Delegate를 공부 중에 일반화를 몰라 먼저 공부해보다보니...
괄호 < 와 > 사이에 형식 매개변수를 넣어주면 됩니다.
간단한 예시입니다. Array를 통해 오름차순, 내림차순으로 Sorting하는 코드입니다.
Sorting방법은 버블소트입니다.
delegate int Comparer<T>(T a, T b);
먼저 사용할 delegate를 선언해 줍니다.
int를 사용하는 이유는 추후에 설명드리겠습니다.
static int AscendCompare<T>(T a, T b) where T:IComparable<T> { return a.CompareTo(b); } static int DescendCompare<T>(T a, T b) where T:IComparable<T> { return a.CompareTo(b) * -1; }
다음은 오름차순, 내림차순으로 정렬을 해줄 코드입니다.
보시기에는 간단할 수 있지만 몇 가지 의문이 있습니다.
Icomparable과 a.CompareTo(b)는 무엇일까?
설명해주는 바로는 Icomparable을 상속해 CompareTo 메소드를 구현한 것입니다.
System.Int32(int), System.Double(double) 등과 같은 수치형식과 더불어 System.String(string)고 같은 문자형식도 비교합니다.
매개변수가 자기자신보다 크다면 -1, 같다면 0, 작다면 +1을 리턴합니다.
그러면 delegate선언시 왜 반환 데이터 형식이 int인지도 설명이 될거라 생각합니다. :D
다음은 Bubble Sort가 진행되는 부분입니다.
static void BubbleSort<T>(T[] DataSet, Comparer<T> Comparer) { int i = 0; int j = 0; T temp; for(i=0;i<DataSet.Length-1;i++) { for(j=0;j<DataSet.Length-(i+1);j++) { if(Comparer(DataSet[j],DataSet[j+1])>0) { temp = DataSet[j + 1]; DataSet[j + 1] = DataSet[i]; DataSet[j] = temp; } } } }
기본적 버블소트와 구성은 같습니다만 다른점은 중첩 반복문 안에 Comparaer함수를 통한 비교에 있습니다.
해당 비교문을 볼까요?
if(Comparaer(DataSet[j],DataSet[j+1])>0)의 만족에 따라 오름차순 내림차순으로 정렬됩니다.
위의 코드에 보면 내림차순인 Descend의 리턴에는 *-1을 곱한뒤 리턴해 주는걸 볼 수 있습니다.
그렇기에 비교구문이 추가돼 있는걸 확인 할 수 있습니다.
다음은 Main입니다.
메인은 함수 호출등의 간단한 부분이 있습니다.
int[] array = { 3, 7, 4, 2, 10 }; Console.WriteLine("Sorting Ascending"); BubbleSort<int>(array, new Comparer<int>(AscendCompare)); for(int i=0;i<array.Length;i++) { Console.WriteLine("{0} ", array[i]); } string[] array2 = { "abc", "def", "ghi", "jkl", "mno" }; Console.WriteLine("\nSorting descending..."); BubbleSort<string>(array2, new Comparer<string>(DescendCompare)); for(int i=0;i<array2.Length;i++) { Console.WriteLine("{0} ", array2[i]); } Console.WriteLine();
int[]에 대해서는 오름차순으로 정렬하고, string[]에 대해서는 내림차순으로 정렬합니다.
결과입니다.
결과입니다.
Delegate가 꽤길어지네요. 다음은 Delegate Chain에 대해 공부할예정입니다.
공부내용은 '뇌를자극하는 C# 5.0 프로그래밍'이란 책을 참조하며 공부하고있습니다.
감사합니다. :D
'C#' 카테고리의 다른 글
[C#] double형 시간변환 관련 (0) 2022.06.22 [C#] Delegate에 대한 공부(3) Delegate Chain (0) 2022.04.01 [C#] 일반화(3) (0) 2022.03.02 [C#] 일반화(2) (0) 2022.01.25 [C#] 일반화(1) (0) 2022.01.14