본문 바로가기

프로그램언어/C#

델리게이트와 이벤트

델리게이트

 델리게이트는 사전적의미로 대리인 이라는 뜻을 가지고 있다. 즉 누군가 대신해서 일을 처리해주는 것을 말한다. 델리게이트는 메소드를 참조하고 그 메소드가를 호출하여 처리하는 방식입니다. 즉 함수를 가리키는 변수를 의미합니다.

 

한정자 delegate 반환형식 델리게이트이름 ( 매개 변수 목록);

 

 예]

using System;
 
namespace ConsoleApp1 {
    delegate int MyDelegate(int a, int b);   // 델리게이트 선언
    class Program {
        public int plus(int a, int b) {
            return a + b;
        }
        public static int minus(int a, int b) {
            return a - b;
        }
        public static int multiply(int a, int b) {
            return a * b;
        }
        static void Main(string[] args) {
            Program cal = new Program();
            MyDelegate callback;
 
            callback = new MyDelegate(cal.plus);
            Console.WriteLine(callback(3,4));
 
            callback = new MyDelegate(minus);
            Console.WriteLine(callback(5, 3));
  
            MyDelegate dele1 = multiply;
            Console.WriteLine(dele1(10, 3));
 
            MyDelegate dele2 = delegate (int a, int b) {
                 return a / b;
            };
            Console.WriteLine(dele2(10, 3));
        }
    }
}
실행 결과]
7
2
30
3

델리게이트를 선언한 후에 함수를 할당해주어야 합니다. 할당된 함수는 델리게이트와 같은 형태로 이루어져야하고 반환 형태도 같아야 합니다.

 

정렬 예제]

using System;
 
namespace ConsoleApp1 {
    delegate int Compare(int a, int b);
    class Program {
        static int AscendCompare(int a, int b) {
            if (a > b) return 1;
            else if (a == b) return 0;
            else return -1;
        }
        static int DescendCompare(int a, int b) {
            if (a < b) return 1;
            else if (a == b) return 0;
            else return -1;
        }
        static void BubbleSort(int[] DataSet, Compare Comparer) {
            int i = 0, j = 0, temp = 0;
 
            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];
                        DataSet[j] = DataSet[j + 1];
                        DataSet[j + 1] = temp;
                    }
                }
            }
        }
        static void Main(string[] args) {
            int[] array = { 3, 7, 1, 8, 10 };
            Console.WriteLine("오름차순 정렬");
            BubbleSort(array, new Compare(AscendCompare));
 
            for (int i = 0; i < array.Length; i++)
                Console.Write("{0} ", array[i]);
            Console.WriteLine();
 
            Console.WriteLine("내림차순 정렬");
            BubbleSort(array, new Compare(DescendCompare));
 
            for (int i = 0; i < array.Length; i++)
                Console.Write("{0} ", array[i]);
        }
    }
}
실행결과]
오름차순 정렬
1 3 7 8 10
내림차순 정렬
10 8 7 3 1

 

일반화 델리게이트

델리게이트는 일반화 메소드도 참조할 수 있습니다. 이 경우에는 델리게이트도 일반화 메소드를 참조할 수 있도록 형식 매개 변수를 이용하여 선언되어야 합니다.

 

delegate int Compare(T a, T b);

 

정렬 예제]

using System;
 
namespace ConsoleApp1 {
    delegate int Compare<T>(T a, T b);
    class Program {
        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;
        }
        static void BubbleSort<T>(T[] DataSet, Compare<T> Comparer) {
            int i = 0, 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];
                        DataSet[j] = DataSet[j + 1];
                        DataSet[j + 1] = temp;
                    }
                }
            }
        }
        static void Main(string[] args) {
            int[] array = { 3, 7, 1, 8, 10 };
            Console.WriteLine("오름차순 정렬");
            BubbleSort<int>(array, new Compare<int>(AscendCompare));
 
            for (int i = 0; i < array.Length; i++)
                Console.Write("{0} ", array[i]);
            Console.WriteLine();
 
            Console.WriteLine("내림차순 정렬");
            BubbleSort<int>(array, new Compare<int>(DescendCompare));
 
            for (int i = 0; i < array.Length; i++)
                Console.Write("{0} ", array[i]);
        }
    }
}
실행결과]
오름차순 정렬
1 3 7 8 10
내림차순 정렬
10 8 7 3 1

 

델리게이트 체인

델리게이트 체인이란 하나의 델리게이트가 여러 개의 메소드를 동시에 참조하는 것으로 +는 메소드를 체인처럼 연결하고 는 메소드로 연결된 체인을 해제합니다.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp1 {
    delegate void MyDelegate(int a, int b);
    class Program {
        public void Plus(int a, int b) {
            Console.WriteLine("{0} + {1} = {2}", a, b, a + b);
        }
        public void Minus(int a, int b) {
            Console.WriteLine("{0} - {1} = {2}", a, b, a - b);
        }
        public void Division(int a, int b) {
            Console.WriteLine("{0} / {1} = {2}", a, b, a / b);
        }
        public void Multiplication(int a, int b) {
            Console.WriteLine("{0} * {1} = {2}", a, b, a * b);
        }
  
        static void Main(string[] args) {
            Program test = new Program();
            MyDelegate t1 = test.Plus;
            MyDelegate t2 = test.Minus;
            MyDelegate t3 = test.Multiplication;
            MyDelegate t4 = test.Division;
            MyDelegate res = t1 + t2 + t3 + t4;
            Console.WriteLine("연결 설정");
            res(100, 50);
            Console.WriteLine("연결 해제");
            res -= t2;
            res(150, 30);
        }
    }
}
연결 설정
100 + 50 = 150
100 - 50 = 50
100 * 50 = 5000
100 / 50 = 2
연결 해제
150 + 30 = 180
150 * 30 = 4500
150 / 30 = 5

 

익명 메소드

익명 메소드란 이름이 없는 메소드를 말합니다.

 

정렬예제]

using System;
 
namespace ConsoleApp1 {
    delegate int Compare(int a, int b);
    class Program {
        static void BubbleSort(int[] DataSet, Compare Comparer) {
            int i = 0, j = 0, temp = 0;
 
            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];
                        DataSet[j] = DataSet[j + 1];
                        DataSet[j + 1] = temp;
                    }
                }
            }
        }
        static void Main(string[] args) {
            int[] array = { 3, 7, 1, 8, 10 };
            Console.WriteLine("오름차순 정렬");
            BubbleSort(array, delegate (int a, int b)
            {
                if (a > b)
                    return 1;
                else if (a == b)
                    return 0;
                else
                    return -1;
            });
 
            for (int i = 0; i < array.Length; i++)
                Console.Write("{0} ", array[i]);
            Console.WriteLine();
 
            Console.WriteLine("내림차순 정렬");
            BubbleSort(array, delegate (int a, int b)
            {
                if (a < b)
                    return 1;
                else if (a == b)
                    return 0;
                else
                    return -1;
            });
 
            for (int i = 0; i < array.Length; i++)
                Console.Write("{0} ", array[i]);
        }
    }
}
실행결과]
오름차순 정렬
1 3 7 8 10
내림차순 정렬
10 8 7 3 1

 

이벤트

이벤트는 특정한 객체(버튼, 텍스트박스, 레이블, 이미지등 ...)에 일어나는 사건을 알려주는 것입니다. 예로 버튼을 클릭하면 사용자에게 이벤트가 발생 되었다고 알려주는 것입니다. 이벤트도 델리게이트를 통해 처리할 수 있다.

 

한정자 event delegate 이름:

예제]

using System;
 
namespace ConsoleApp1 {
    delegate void EventHandler(string msg);
 
    class MyNotifier {
        public event EventHandler SomethingHappened;
        public void DoSomething(int number) {
            int temp = number % 10;
            if(temp != 0 && temp % 3 == 0) {
                SomethingHappened(String.Format("{0} : ", number));
            }
        }
    }
    class Program {
        static public void MyHandler(string msg) {
            Console.WriteLine(msg);
        }
        static void Main(string[] args) {
            MyNotifier notifier = new MyNotifier();
            notifier.SomethingHappened += new EventHandler(MyHandler);
 
            for (int i = 1; i < 20; i++)
                notifier.DoSomething(i);
        }
    }
}
실행결과]
3 :
6 :
9 :
13 :
16 :
19 :

 

'프로그램언어 > C#' 카테고리의 다른 글

LINQ(Language-Integrated Query)  (0) 2021.06.24
람다식  (0) 2021.06.23
문제풀기1  (0) 2021.06.07
selenium-webdriver  (0) 2020.05.28
크롬에서 자바스크립트 디버깅  (0) 2020.04.02