일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 시
- WPF
- eventhandler
- 디자인 패턴
- NUnit
- Json.NET
- 경기도 버스
- 경기도 버스정보시스템
- Cell Border Style
- 공공 데이터 포털
- c#
- solid
- DrawEllipse
- MVC
- 객체지향
- 버스 API
- JSON
- TDD
- C# MDB
- Winform
- delegate
- MDB Connect
- GDI+
- C# 파일 암/복호화
- Excel Cell Format
- DrawRectangle
- eventargs
- sqlite3
- MDB Select
- C# MDB Handle
- Today
- Total
White Whale Studio
Delegate / 대리자 본문
Delegate는 대리, 위임이라는 뜻을 가집니다. 언뜻 뜻과는 잘 부합시키기가 어렵네요.
Delegate와 관련하여 제가 정리한 항목들을 우선 나열해보겠습니다.
1. Delegate는 메서드를 매개인자(Parameter)로 전달할 수 있다.
2. Delegate 자체를 매개인자로 전달할 수 있다.
3. 복수의 메서드를 등록하여 사용가능하다. (등록은 +=, 해제는 -=)
4. Event는 특수한 형태의 delegate 이다.
4.1 Delegate와 Event의 차이점은 delegate는 클래스 외부에서 호출가능하나 event는 불가
4.2 Event는 메서드 할당 연산자(=) 사용불가 오직 등록은 +=, 해제는 -= 로만 가능
Delegate의 정의에서 중요한 것은 Parameter와 Return Type 입니다.
어떤 메서드가 정의된 Delegate와 동일한 메서드 형식(Parameter, Return Type)을 가진다면 해당 메서드는 이 정의된 Delegate에서 사용될 수 있습니다.
각 항목별로 살펴보겠습니다.
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 | public class DelegateClass { public delegate int CalcFunctionDelegate(int i); public int AddMethod(int i) { return i + 1; } public int SubMethod(int i) { return i - 1; } public void DoSomething(CalcFunctionDelegate cf_delegate) { Console.WriteLine(cf_delegate(1)); // == AddMethod(1) 또는 SubMethod(1); } CalcFunctionDelegate cfd; public void CallMethod() { cfd = new CalcFunctionDelegate(AddMethod); DoSomething(cfd); // cfd = AddMethod cfd = new CalcFunctionDelegate(SubMethod); DoSomething(cfd); // cfd = SubMethod } } | cs |
위의 소스에서는 1, 2번 항목을 확인할 수 있습니다.
우선 Integer 타입의 매개변수를 받는 형태의 CalcFunctionDelegate를 선언했습니다.
이와 동일한 메서드 형식을 가지는 일반 메서드인 AddMethod, SubMethod를 선언했습니다.
또 2번 항목을 확인할 수 있는 부분을 보면 CalcFunctionDelegate를 매개변수로 가지는 메서드 DoSomething을 선언합니다.
DoSomething 메서드는 매개인자로 받은 메서드를 실행해줍니다.
2. Delegate 자체를 매개인자로 전달할 수 있다.(피호출자에게 전달 혹은 호출자에게 리턴값으로 전달)
1번항목은 CallMethod() 메서드에서 확인하실수있습니다.
CalcFunctionDelegate의 인스턴스인 cfd를 초기화할 때 매개인자로 AddMethod와 SubMethod를 넘깁니다.
1. Delegate는 메서드를 매개인자(Parameter)로 전달할 수 있다.
전달된 Delegate로부터 메서드를 호출하는 방법은 다르게도 가능합니다.
CalcFunctionDelegate cfd;
cfd.Invoke(1);
위와 같이 Invoke() 메서드를 호출하여 사용하며 파라미터가 필요한 경우 Invoke(parameter a, parameter b); 와 같은 방식으로 호출합니다.
또는 cfd(1); ← 이와 같이 직접 함수처럼 사용하는 방법도 가능합니다.
다음은 3번 항목을 살펴보겠습니다.
3. 복수의 메서드를 등록하여 사용가능하다. (등록은 +=, 해제는 -=)
MulticastDelegate 클래스에서 관리를 하게 되며 추가된 메서드들의 리스트(InvocationList)를 관리합니다.
할당 후에 delegate가 실행되면 InvocationList에서 메서드를 순서대로 가져와서 실행합니다.
아래의 코드를 통해 살펴보겠습니다.
단순 출력을 수행하는 메서드들을 선언했습니다.
또한 이 메서드들을 추가할 printdelegate를 선언하고 인스턴스를 만들었습니다.
14번 라인에 있는 MultiMethod를 보면 printdelegate인 pd에 printA와 printB 메서드를 += 연산자로 추가하는 것을
보실수 있습니다.
후에 delegate를 invoke 하게되면 등록한 순서대로 printA, printB 가 실행됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public delegate void PrintDelegate(); PrintDelegate pd; public void printA() { Console.WriteLine("A"); } public void printB() { Console.WriteLine("B"); } // 외부에서 호출할 메서드 public void MultiMethod() { pd += new PrintDelegate(printA); pd += new PrintDelegate(printB); pd.Invoke(); } | cs |
1~3번항목까지 Delegate에 관한 내용을 살펴보았습니다.
마지막 항목인 Event는 내용이 많고 복잡한 관계로 개별 포스팅으로 진행하겠습니다.
'IT Engineering > C#.net' 카테고리의 다른 글
[GDI] C# GDI 탐구 - 시작 (0) | 2016.07.12 |
---|---|
Delegate & Event / 델리게이트와 이벤트 (0) | 2016.06.23 |
EventArgs (0) | 2016.06.23 |
StyleCop - Coding Guide / 스타일콥 코드 분석기 for C# (0) | 2016.06.22 |
[MVC Pattern] Winform 예제 (1) | 2016.06.21 |