Delegate와 Event(2023-09-26 TIL)

SeongH·2023년 9월 26일
0
post-thumbnail

1.델리게이트(Delegate)

델리게이트라는 단어가 가진 뜻은 '대리자', 일을 대신 해주는 녀석을 의미한다.

<델리게이트의 선언 형식>

delegate 반환형 델리게이트명(매개변수..);

델리게이트는 메서드의 참조를 포함한다. 즉, 메서드를 매개변수로 넘길 수 가 있다. 이때 매개변수의 데이터 형식과 반환형은 참조할 메서드의 매개변수의 데이터 형식과 반환형에 맞추어야 한다.
(참조하는 메서드가 달라진다면 델리게이트 역시 달라진다)

<델리게이트 사용 예제>


<예제1>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication39
{
    delegate int PDelegate(int a, int b);

    class Program
    {
        static int Plus(int a, int b)
        {
            return a + b;
        }

        static void Main(string[] args)
        {
            PDelegate pd1 = Plus;
            PDelegate pd2 = delegate(int a, int b)
            {
                return a / b;
            };

            Console.WriteLine(pd1(5, 10));
            Console.WriteLine(pd2(10, 5));
        }
    }
}

결과값

15
20


<예제2>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication39
{
    delegate void PDelegate(int a, int b);

    class Program
    {
        static void Plus(int a, int b)
        {
            Console.WriteLine("{0} + {1} = {2}", a, b, a + b);
        }

        static void Minus(int a, int b)
        {
            Console.WriteLine("{0} - {1} = {2}", a, b, a - b);
        }

        static void Division(int a, int b)
        {
            Console.WriteLine("{0} / {1} = {2}", a, b, a / b);
        }

        static void Multiplication(int a, int b)
        {
            Console.WriteLine("{0} * {1} = {2}", a, b, a * b);
        }

        static void Main(string[] args)
        {
            PDelegate pd = (PDelegate)Delegate.Combine(new PDelegate(Plus),
                new PDelegate(Minus), new PDelegate(Division), new PDelegate(Multiplication));

            pd(20, 10);
        }
    }
}

결과값

20 + 10 = 30
20 - 10 = 10
20 / 10 = 2
20 * 10 = 200

위의 코드와 같이 델리게이트를 사용한다면 하나의 델리게이트로 여러개의 메소드를 한번에 호출 할 수 있다.



2.이벤트(Event)

프로그래밍에서 이벤트의 의미는 특정 사건이 벌어지면 알리는 메시지 라고 할 수 있다. 예를 들어 사용자가 버튼을 클릭하거나 키보드를 누를때 사용자에게 객체를 알리는 것을 이벤트 발생이라고 한다. 이벤트는 delegate를 event 한정자로 수식해서 만든다.

<이벤트의 선언형식>

한정자 event 델리게이트 이름;


<이벤트의 사용예시>

delegate void EventHandler(string message);

class Notifier
{
    public event EventHandler EventHappened;

    public void DoSomething(int number)
    {
        if (number == 5)   // 숫자가 5일때 이벤트가 발생
        {
            EventHappened("이벤트 발생 : " + number.ToString());
        }
    }
}

static void MyHandler(string message)
{
    Console.WriteLine(message);
}

static void Main(string[] args)
{
    Notifier notifier = new Notifier();
    notifier.EventHappened += MyHandler;  // 발생시킬 이벤트를 등록

    for (int i = 0; i < 10; i++)
    {
        notifier.DoSomething(i);
    }

3. Event와 Delegate의 차이점

  • 이벤트는 델리게이트에 이벤트를 수식해서 선언한 것이다.
  • 이벤트는 인터페이스 내부에 선언 할 수 있지만, 델리게이트는 선언할 수 없다.
  • 이벤트는 public으로 선언이 되어있어도 자신이 선언되어 있는 클래스 외부에서 호출 할 수 없다.
  • 델리게이트는 호출하는 부분이 있어야한다(이벤트는 없다)
  • 델리게이트는 저장해놓고 직접호출하고 이벤트는 저장해놓고 이벤트가 발생하면 호출한다.
  • Delegate -> 콜백에서 사용
    Event -> 객체의 상태변화, 사건의 발생을 알리는 용도
profile
개발자 꿈나무

0개의 댓글