ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C#] Delegate에 대한 공부(2)
    C# 2022. 3. 22. 08:41
    728x90

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

    댓글

Designed by Tistory.