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