이벤트는 특정 작업이나 상태 변화가 발생했을 때, 다른 객체에게 알려주는 매커니즘이다. 이벤트는 delegate를 사용하여 정의된다. delegate란 대리자란 뜻으로 C의 함수 포인터같은 역할을 한다.
Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(3, 4)); // output: 7
delegate 공식 홈페이지 예제이다.
Func<int, int, int> 란 두 개의 int 입력을 받아 int 출력을 내놓겠다는 의미이다.
마치 변수에 할당하듯 sum에 delegate 연산자를 할당해서 메서드를 하나 만들어줄 수 있다.
이 녀석을 활용해서, 이벤트를 만들어줄 수 있다.
Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 4)); // output: 7
delagate 키워드를 빼고 람다식을 써서 더욱 간결하게 쓸 수 도있다.
public delegate void MyEventHandler(object sender, EventArgs e);
public class MyClass
{
public event MyEventHandler MyEvent;
public void TriggerEvent()
{
// 이벤트가 null이 아닌지 확인한 후 이벤트 호출
MyEvent?.Invoke(this, EventArgs.Empty);
}
}
델리게이트로 이벤트 핸들러를 만들어주고, 매개 변수로 이벤트를 발생한 객체의 참조와(object sender) 이벤트에 대한 추가 정보를 포함하는 이벤트 데이터를(EventArgs e) 넣어준다.
class에서 event 키워드로 선언한다. (event 키워드도 delegate를 사용해 이벤트를 처리한다고 한다.)
구체적으로 EventArgs가 무슨 역할을 하는지?
-> GUI일 때, 마우스나 키 이벤트를 넣어줄 수 있다.
그리고 Main() 에서 트리거시킨다.
public class Program
{
public static void Main()
{
MyClass myClass = new MyClass();
myClass.MyEvent += OnMyEvent;
myClass.MyEvent += OnMyEvent; // 이벤트 핸들러 추가
myClass.MyEvent -= OnMyEvent; // 이벤트 핸들러 제거
// 이벤트 트리거
myClass.TriggerEvent();
}
public static void OnMyEvent(object sender, EventArgs e)
{
Console.WriteLine("이벤트가 발생했습니다!");
}
}
myClass 객체를 하나 만들어서, += 연산자로 넣어주면 된다.
+=연산을 통해 이벤트를 넣어주면 MyEvent에 구독자가 생기고, 이벤트가 트리거 되면 MyEvent에 구독된 메서드들이 실행되는 구조이다.
이 개념을 활용해 예제를 하나 짜보았다.
아래는 Player의 Level이 5레벨이 되면 GetSkill 함수가 호출되는 이벤트의 예제이다.
using System.Net.Security;
namespace EventPractice
{
internal class Player
{
public event Action LevelReachedFive;
private int _level { get; set; }
public int Level
{
get => _level;
set // set 접근자가 호출되면서 이벤트 로직이 적용된다.
{
_level = value; // 외부에서 전달된 값을 _level에 저장
Console.WriteLine($"현재 레벨 : {_level}");
if (_level == 5)
LevelReachedFive?.Invoke(); // 이벤트 연결시 호출
}
}
public Player()
{
_level = 1;
}
public void GetSkill()
{
Console.WriteLine("새로운 스킬을 획득했습니다!");
}
}
internal class Program
{
static void Main(string[] args)
{
Player player = new Player();
// 메소드를 참조하였기 때문에 ()를 붙이지 않음. ()를 붙이면 즉시 호출하라는 의미임.
player.LevelReachedFive += player.GetSkill;
for (int i = 2; i <= 10; i++)
{
player.Level = i;
}
}
}
}
이를 실행하면

5레벨에 set로 _level의 값에 5가 들어가고, 그로 인해 이벤트가 호출되는 모습이다.
'C#' 카테고리의 다른 글
[C#] out과 ref (0) | 2025.03.13 |
---|---|
[C#] ANSI 이스케이프 코드(ANSI Escape Codes) (0) | 2025.02.11 |
[c#]콘솔 종료시 객체 저장 (1) | 2025.02.05 |
[C#] 리스트, 배열 개념 정리 (0) | 2025.01.27 |
[C#] Class 인스턴스 디폴트 값 (1) | 2025.01.24 |