반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

욱꾸미의 주꾸미 발

[C#] Delegate에 대한 공부(2) 본문

C#

[C#] Delegate에 대한 공부(2)

욱꾸미 2022. 3. 22. 08:41
반응형

저번시간에는 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