yoursyun

델리게이트 이해와 활용 본문

program/c#

델리게이트 이해와 활용

yoursyun 2019. 2. 1. 14:52

Delegate ( 대리자 )

 

1. callback method 의 구현시 이용 할 수 있다.

2. 메서드를 연속으로 실행 시켜야 할시 이용 할 수 있다. - Delegate chain

3. 메서드를 대신 실행한다. 정도의 의미로 이해하고, 다른 메서드를 파라메터로 넘기거나,

이벤트와 함께 사용하여, Delegate 가 할당연산자 ( = ) 으로 초기화 되는것을 막아 이용 할 수도 있다.

이벤트 = 델리게이트 로 이해 하는것도 나쁘지 않다.

 

1. callback method 의 구현시 이용 할 수 있다.

=================================================================

callback method 란 ?

A method, B method, C method ... 있을때,  A method 의 parameter로  B 나 C method 를 호출한다.

이때 A method 를 callback mehtod 라 부른다.

=================================================================

 

Delegate를 이용한 callback mehtod 이용 예제

 

Delegate int 델리게이트(int a, int b);

 

void 콜백(int a, int b, 델리게이트 d) { 결과 += d(a ,b) + "\r\n"; }

 

int PlusB(int a, int b) { return a + b; }
int MinusC(int a, int b) { return a - b; }

 

main()

{

     델리게이트 plus = new 델리게이트(PlusB);

     델리게이트 minus = new 델리게이트(MinusC);

 

      콜백(1, 2, plus);

      콜백(2, 1, minus);

}

 

2. 메서드를 연속으로 실행 시켜야 할시 이용 할 수 있다. - Delegate chain

=================================================================

+= 으로 연속 실행 메서드를 추가 할수 있다. 반대는 -=

=================================================================

Delegate void 델리게이트();

 

void func0 { Console.Write("1"); }

void func1 { Console.Write("2"); }

void func2 { Console.Write("3"); }

 

main()

{

     델리게이트 d = new 델리게이트(func0);

     d += d(func1);

     d += d(func2);

 

    d();

}

 

*********** 출력결과 ***********

123

*********** 출력결과 ***********


3. 이벤트를 이용한 할당연산자 문제 처리

=================================================================

2. 번이지만, 할당연산자로 초기화 되는 것을 막을수 있다.

=================================================================


class CLS_A

{

    public delegate void 델리게이트( string s );

    public event 델리게이트 OnReceived;


    public void run(){

       OnReceived("event ~");

    }

}


class main

{

    CLS_A a;


    main(){

       a = new CLS_A();

       a.OnReceived += a_onReceived;

       // a.OnReceived = a_ERROR; // 이와 같은 할당을 통해 초기화 되는 문제를 막을 수 있다.

    }


    // 버튼 클릭시 CLS_A 의 델리게이트(이벤트) 를 실행한다.

    void btnClick()

    {

       a.run();

    }


    void a_onReceived( string s ) {

       console.writeline( s );

    }

}

반응형