1. event 개념
이벤트(event)의 용어 정의는 "사건"을 의미합니다.
프로그래밍에서 event도 비슷한 개념으로 "어떠한 조건을 만족하는 사건"이 발생했을 때,
자동으로 실행을 할 수 있도록 하는 것 입니다.
event의 선언 형식은 아래와 같습니다.
//한정자 event 사용하려는delegate명 event명;
public event TenEventHandler TenEvent;
event를 사용하려면 delegate(대리자)를 먼저 이해해야 합니다.
delegate에 대한 설명은 별도 포스팅 되어 있으니 참고 부탁드립니다.
[Developer/C#, 닷넷] - C# delegate 개념과 사용 이유
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;
}
}
}
'Developer > C#, 닷넷' 카테고리의 다른 글
C# Docker System.IO.FileNotFoundException: Could not find file (0) | 2022.08.18 |
---|---|
C# Docker Environment.GetEnvironmentVariable (환경변수) 사용 (0) | 2022.08.18 |
C# delegate 개념과 사용 이유 (0) | 2022.08.13 |
C# 객체(Object), 클래스(Class), 인스턴스(Instance) 차이 비교 (0) | 2022.08.12 |
C# JSON 활용하기(직렬화, 역직렬화) (1) | 2022.08.11 |
댓글