Developer/C#, 닷넷

C# event 사용(delegate)

우주로그 2022. 8. 16.

1. event 개념

이벤트(event)의 용어 정의는 "사건"을 의미합니다.

프로그래밍에서 event도 비슷한 개념으로 "어떠한 조건을 만족하는 사건"이 발생했을 때,

자동으로 실행을 할 수 있도록 하는 것 입니다.

 

event의 선언 형식은 아래와 같습니다.

//한정자 event 사용하려는delegate명 event명;
public event TenEventHandler TenEvent;

event를 사용하려면 delegate(대리자)를 먼저 이해해야 합니다.

delegate에 대한 설명은 별도 포스팅 되어 있으니 참고 부탁드립니다.

 

[Developer/C#, 닷넷] - C# delegate 개념과 사용 이유

 

C# delegate 개념과 사용 이유

1. delegate 개요 처음 C# delegate를 접했을 때 왜 사용해야 하는지 이해하기가 힘들었습니다. 그래서 왜 사용해야 하는지에 대해 자세히 설명하겠습니다. C#에는 대리자(delegate)라는 개념이 존재합니

woojoolog.tistory.com

 

 

2. event 활용

먼저 0~50까지 for 문을 돌며 10으로 나눠지면 이벤트를 발생하는 샘플 코드를 먼저 보겠습니다.

using System;

namespace EventTest
{
    // 이벤트 핸들러 delegate 생성
    public delegate void TenEventHandler(string message);

    // 이벤트 게시자 생성
    public class Publisher
    {
        // 이벤트 선언
        public event TenEventHandler TenEvent;

        public void DivideTen(int number)
        {
            //이벤트 게시자 존재 확인
            if (TenEvent != null)
            {
                if (number % 10 == 0)
                {
                    // 10으로 나눠지는 숫자의 경우 이벤트 발생
                    TenEvent($"10으로 나누워지는 수 :  {number}"); 
                }
                else
                {
                    Console.WriteLine(number);
                }
            }
        }
    }
    //구독자 클래스 선언
    public class Subscriber
    {
        //이벤트 발생시 호출되는 메서드
        static public void TenHendler(string message)
        {
            Console.WriteLine($"찾음 : {message}");
        }
        static void Main(string[] args)
        {
            Publisher dividePublisher = new Publisher();
            dividePublisher.TenEvent += new TenEventHandler(TenHendler);

            // 0~50까지 1씩 증가하며 DivideTen 메서드 호출
            for (int i = 0; i <= 50; i++)
            {
                dividePublisher.DivideTen(i);
            }
        }
    }
}

 

    // 이벤트 핸들러 delegate 생성
    public delegate void TenEventHandler(string message);

event에서 사용할 delegate를 생성합니다.

보통 event에서 사용하는 delegate의 경우, 네이밍 할 때 ~~EventHandler로 명명합니다.

 

public event TenEventHandler TenEvent;

event를 선언합니다.

event 선언은 위와 같이 값을 전달해는 Class에서 선언을 합니다.

 

 public void DivideTen(int number)
        {
            //이벤트 게시자 존재 확인
            if (TenEvent != null)
            {
                if (number % 10 == 0)
                {
                    // 10으로 나눠지는 숫자의 경우 이벤트 발생
                    TenEvent($"10으로 나누워지는 수 :  {number}"); 
                }
                else
                {
                    Console.WriteLine(number);
                }
            }
        }

메서드 호출 매개변수가 10으로 나눠지는 경우 TenEvent가 호출 되도록 했으며,

아닌 경우는 단순히 매개변수를 그대로 출력하도록 했습니다.

 

 

static public void TenHendler(string message)
{
     Console.WriteLine($"찾음 : {message}");
}

event가 발생했을 때 실행될 메서드를 등록합니다.

delegate와 동일한 형태, 동일한 매개변수를 가지고 있어야 합니다.

 

 

Publisher dividePublisher = new Publisher();
dividePublisher.TenEvent += new TenEventHandler(TenHendler);

Publisher 인스턴스 생성 후, TenEvent에 핸들러를 등록합니다.

 

 for (int i = 0; i <= 50; i++)
        dividePublisher.DivideTen(i);
}

0~50까지 DevideTen 메서드를 호출합니다.

 

이제 결과를 볼까요.

10단위에서 정상적으로 event가 호출 된 것을 볼 수 있습니다.

 

3. EventHandler 사용

delegate를 새로 생성하지 않고, system 어셈블리에 정의된 EventHandler를 사용할 수도 있습니다.

일단 이건 소스만 참고해주세요.

using System;

namespace EventTest
{
    // 이벤트 게시자 생성
    public class Publisher
    {
        // 이벤트 선언
        public event EventHandler<TenEventHandlerArgs> TenEvent;

        public void DivideTen(int number)
        {
            //이벤트 게시자 존재 확인
            if (TenEvent != null)
            {
                if (number % 10 == 0)
                {
                    // 10으로 나눠지는 숫자의 경우 이벤트 발생
                    TenEvent(this, new TenEventHandlerArgs($"10으로 나누워지는 수 :  {number}"));
                }
                else
                {
                    Console.WriteLine(number);
                }
            }
        }
    }
    //구독자 클래스 선언
    public class Subscriber
    {
        //이벤트 발생시 호출되는 메서드
        static public void TenHendler(object sender, TenEventHandlerArgs e)
        {
            Console.WriteLine($"찾음 : {e.Text}");
        }

       
        static void Main(string[] args)
        {
            Publisher dividePublisher = new Publisher();
            dividePublisher.TenEvent += TenHendler;

            // 0~50까지 1씩 증가하며 DivideTen 메서드 호출
            for (int i = 0; i <= 50; i++)
            {
                dividePublisher.DivideTen(i);
            }
        }
    }

    public class TenEventHandlerArgs
    {
        public string Text { get; set; }

        public TenEventHandlerArgs(string text)
        {
            Text = text;
        }
    }
}

 

 

 

댓글