1. delegate(델리게이트)
#. 내용
- 프로그램에서 어떤 기능을 대신 수행해 주는 대리자 역할을 하게됩니다.
- 델리케이트는 일종의 메소드 포인터로 메소드를 효율적으로 사용하기 위한 캡슐화를 위해 주로 사용 합니다.
- event를 구현하기 위해 선언 합니다.
#. 메소드 대리자 델리게이트
- 델리게이트는 class와 같은 위치에서 선언해 줍니다.
- 델리게이트를 인스턴스화 시킬 때 반드시 메소드를 참조시켜야 합니다.
- 선언 형식은 선언할 메소드(함수)와 동일란 형식으로 선언되어야 합니다. 즉, 위임 메소드는 대리자와 형식이 일치해야 합니다.
- 예제
001: using System;
002: //델리게이트 선언
003: delegate void dele1();
004: delegate int dele2(int a,int b);
005: class MainClass
006: {
007: static void
008: {
009: //Math클래스 선언및 인스턴스화
010: MathClass MathClass=new MathClass();
011: //델리게이트 선언및 인스턴스화
012: dele1 Sum1=new dele1(MathClass.Intro);
013: dele2 Sum2=new dele2(MathClass.Sum);
014: //델리게이트에 위임된 메서드 실행
015: Sum1();
016: Console.WriteLine("Result : {0}",Sum2(-10,90));
017: }
018: }
019: class MathClass
020: {
021: public void Intro()
022: {
023: Console.WriteLine("계산을 시작합니다.");
024: }
025: public int Sum(int a, int b)
026: {
027: return a+b;
028: }
029: }
- 결과
계산을 시작합니다.
Result : 80
#. 델리게이트의 연산
- 델리게이트는 Combine과 Remove라는 두개의 연산 메소드를 지원합니다. 이것으로 인해 델리게이트는 여러 메소드의 참조가 가능합니다.
-> Combine: 기존 위임에 또 위임을 추가합니다.[=+]
-> Remove: 기존의 위임중에 특정 위임을 제거합니다.[=-]
- 아래 예제의 15줄에서 +=로 메소드를 추가한 Math는 Plus(10), Minus(10), Multiply(10) 이렇게 3개의 메소드를 차례대로 호출하는 것과 같은 의미를 갖게 됩니다.
- 아래 예제의 22줄에서처럼 -=로 메소드를 삭제하면 Math는 Plus(10), Multiply(10)만을 위임받게 됩니다.
- 예제
001: using System;
002: delegate void deleMath(int Value); //델리게이트 선언
003: class MainClass
004: {
005: static void
006: {
007: //Math클래스 선언및 인스턴스화
008: MathClass MathClass=new MathClass();
009:
010: //델리게이트 선언및 인스턴스화(덧셈)
011: deleMath Math=new deleMath(MathClass.Plus);
012:
013: //위임연산(뺄셈,곱셈추가)
014: Math+=new deleMath(MathClass.Minus);
015: Math+=new deleMath(MathClass.Multiply);
016: //결과1
017: MathClass.Number=10;
018: Math(10);
019: Console.WriteLine("Result:{0}",MathClass.Number);
020:
021: //위임연산(뺄셈제거)
022: Math-=new deleMath(MathClass.Minus);
023: //결과2
024: MathClass.Number=10;
025: Math(10);
026: Console.WriteLine("Result:{0}",MathClass.Number);
027:
028: //위임연산(곱셈제거)
029: Math-=new deleMath(MathClass.Multiply);
030: //결과3
031: MathClass.Number=10;
032: Math(10);
033: Console.WriteLine("Result:{0}",MathClass.Number);
034:
035: }
036: }
037: class MathClass
038: {
039: public int Number;
040: public void Plus(int Value)//더하기
041: {
042: Number+=Value;
043: }
044: public void Minus(int Value)//빼기
045: {
046: Number-=Value;
047: }
048: public void Multiply(int Value)//곱하기
049: {
050: Number*=Value;
051: }
052: }
- 결과
Result:100
Result:200
Result:20
2. event(이벤트)
#. 내용
- 프로그램 상에서 행해지게 되는 일련의 행위들을 가리킵니다.
- 마우스를 클릭하는것, 키보드를 입력하는것, 윈도우 창을 움직이는 것 이런 것들이 모두 이벤트 입니다.
- 각 이벤트에가 발생할 경우 어떻게 처리하겠다는 코드를 작성할 수 있습니다.
- 델리게이트를 통해 구현됩니다.
#. 구현
- event 선언된델리게이트명 이벤트명;
#. 예제
001: using System;
002: //델리게이트 선언
003: delegate void eventDelegate();
004: class EventTest
005: {
006: // Event1 이라는 우리만의 새로운 이벤트를 선언해 주고,
007: // 이 이벤트의 처리는 eventDelegate 타입의 delegate들이
008: // 하게 된다는 것을 알립니다.
009: public event eventDelegate ckEvent;
010: // 어떤 버튼을 누를 때, 이 메서드가 호출된다고 가정 합시다.
011: public void btnClick()
012: {
013: ckEvent();
014: }
015: }
016: class MainClass
017: {
018: static void Click()
019: {
020: Console.WriteLine("클릭 되었습니다.");
021: }
022: static void
023: {
024: //클래스 선언및 인스턴스화
025: EventTest eTest = new EventTest();
026:
027: // 미리 정의한 이벤트 즉,ckEvent가 발생한 경우
028: // eTest 라는 인스턴스에서 이 이벤트를 처리할 메서드
029: // (핸들러, Delegate)를 지정합니다.
030: eTest.ckEvent += new eventDelegate(MainClass.Click);
031:
032: // 어떤 버튼이 눌려서 클릭 이벤트가 발생되었다고 가정합니다.
033: eTest.btnClick();
034: }
035: }
#. 결과
계산을 시작합니다.
Result : 80
출처: 훈스닷넷(http://www.hoons.kr/)