C# 복습하기 12) 대리자와 이벤트

 

대리자

 - delegate 키워드를 사용하여 선언

한정자 delegate 반환형식 대리자이름 ( 매개변수 );

 - 주의할 점은 대리자는 인스턴스가 아닌 형식(type)이라 인스턴스를 따로 만들어야 한다.

delegate int MyDelegate( int a, int b ); // 대리자
MyDelegate callback;

// 함수
int Plus(int a, int b) => a + b;

void SomeMethod()
{
    callback = new MyDelegate(Plus);
    Console.WriteLine(callback(3, 4);
}

 

일반화 대리자

 - 대리자 또한 일반화 메서드도 참조할 수 있다.

delegate int Compare<T>(T a, T b);

 

대리자 체인

 - 대리자는 += 연산자를 통해 여러 개를 동시 참조 가능하다.

 - 체인을 끊을 때는 -= 연산자를 사용한다.

delegate void MyDelegate(string str);

void Call(string str){ }
void Call2(string str){ }

void TestMethod()
{
    MyDelegate my = new MyDelegate(Call);
    my += new MyDelegate(Call2);
}

// 간소화된 형태
void TestMethod2()
{
    mydel del = new MyDelegate(MyMethod);
    del += MyMethod;
}

 

익명 메서드

 - delegate 키워드와 함께 사용하여 익명 메서드를 선언할 수 있다.

 - 대리자가 참조해야 될 메서드가 두 번 다시 사용할 일이 없다고 판단될 때 사용함.

대리자인스턴스 = delegate( 매개변수 )
                 {
                      //...
                 }
delegate int Calculate(int a, int b)

public static void Main()
{
    Calculate Calc;
    
    Calc = delegate(int a, int b)
           {
               return a + b;
           };
           
    Console.WriteLine(Calc(3, 4));
}

 

 

이벤트

 - 특정한 일이 생겼을 때 이를 알려주는 객체

delegate void EventHandler(string message); // 대리자 선언

class MyNotifier
{
    public event EventHandler SomethingHappend; // 선언했던 대리자를 이용하여 event 선언
    
    public void DoSome()
    {
        SomethingHappend("호출됨");
    }
}

class MainApp
{
    static public void MyHandler(string message) // 이벤트가 발생할때 처리할 메소드 작성
    {
        Console.WriteLine(message);
    }
    
    static void Main(string[] args)
    {
        MyNotifier notifier = new MyNotifier();
        notifier.SomethingHappend += new EventHandler( MyHandler ); // 핸들러 등록
        
        nodifier.DoSome();
        // DoSome()을 호출하여 SomethingHappend 이벤트가 호출되고, 해당 이벤트에 등록되어있는
        // MyHandler메소드가 호출된다.
    }
}

 

대리자 vs 이벤트

 - 그냥 일반 delegate 쓰면 될 텐데 왜 이벤트가 필요한 것인가? 

이벤트는 외부에서 직접 사용할 수 없다!
(public으로 선언되어있어도 클래스 외부에서는 호출이 불가능하다)

 - 대리자는 콜백 용도 / 이벤트는 객체의 상태변화나 사건의 발생을 알리는 용도로 사용하자.

 

 

 

 

 

댓글

Designed by JB FACTORY