C#2010. 3. 23. 13:27

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 Main(string[] args)

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 Main(string[] args)

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 Main(string[] args)

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/)

Posted by 쿵캉켕