728x90
반응형
이벤트는 언제 발생할지 예측할 수 없는 특정 상황이 일어날 때, 개체 또는 클래스에게 알림을 제공해서 원하는 동작이 일어나도록 하는 멤버이다. 흔히 웹에서 버튼을 누르거나 엔터 키를 누를 때 무엇인가 일어나는 것은 이벤트 기반 프로그래밍을 통해 이루어지는 것이다. C#에서 대리자(delegate)와 어떻게 이어지는지를 중점으로 간단히 다루고, 이벤트의 구체적인 사용은 이후 유니티를 통한 프로그램 개발에서 다룰 듯하다.
이벤트(Event)
이벤트와 이벤트 핸들러를 바탕으로 이벤트 기반 프로그래밍을 할 수 있다.
- 이벤트 : 키 입력이나 클릭과 같은 동작(트리거)
- 이벤트 핸들러(event handler) : 특정 이벤트와 연결하고자 만든 메서드
- 특정한 이벤트가 오면, 대리자 형식으로 이벤트를 수행하도록 한다.
기본적으로 이벤트는 대리자의 방식으로 사용자 입력과 같은 이벤트가 발생하면, 이벤트 핸들러가 가리키고 있는 이벤트 관련 메소드들을 실행시키는 구조로 이루어져 있다. 이를 통해 언제 발생할 지 모르는 이벤트를 예측할 필요 없이, 프로그램이 자동으로 인식해 이벤트를 수행하는 것이 가능하다. 사실 설명만 들으면 다소 이해하기 어려울 수 있는데, 관련 코드를 보며 이해해보자.
using System;
//이벤트 보내는 퍼블리셔(publisher)
public class KeyEvent
{
//이벤트 대리자(delegate) 생성
public delegate void KeyEventHandler(int intInput);
//이벤트 선언
public event KeyEventHandler? Click;
//이벤트 발생 메서드
public void OnKeyDown(int intInput)
{
//이벤트가 null이 아닌 경우, 존재하는 경우
if (Click != null)
{
//대리자 형식의 이벤트 수행
Click(intInput);
}
}
}
//이벤트를 받는 유저(subscriber)
class User
{
static void Main()
{
KeyEvent key = new KeyEvent();
//메서드 등록
key.Click += K1;
key.Click += K2;
//사용자 입력에 따라 이벤트 발생(발생 메서드 활용)
Console.Write("0~5 사이의 숫자를 입력해주세요: ");
if (int.TryParse(Console.ReadLine(), out int intInput) && intInput >= 0 && intInput <=5) key.OnKeyDown(intInput);
else Console.WriteLine("What?");
}
//이벤트 발생 시 호출되는 메서드
static void K1 (int a) => Console.WriteLine($"You Pressed Valid Value : {a}");
static void K2 (int a) => Console.WriteLine("Well Done");
}
//출력 : 올바르게 입력한 경우 : You Pressed Valid Value!
// 잘못 입력한 경우 : What?
위의 예제에서는 대리자를 직접 생성해서 이벤트와 연결해주었다. 편의성을 위해 자주 쓰는 이벤트 핸들러에 대해 닷넷에서 제공하는 이벤트 핸들러 관련 대리자 EventHandler<TEventArgs>가 존재한다. 이것도 다루려고 했지만, 아직 헷갈리는 부분이 있는 것 같아 이후 유니티에서 C# 스크립트를 만들때 직접 실습하며 정리해 추가로 올리겠다.
728x90
반응형
'C#' 카테고리의 다른 글
[C#] 속성(Property)과 접근자(get, set, init), 읽기/쓰기 전용 속성 (0) | 2024.04.30 |
---|---|
[C#] 생성자(Constructor)와 소멸자(Destructor) (0) | 2024.04.29 |
[C#] 스레드(Thread)와 동기화(lock), 병렬 처리 API(TPL) (0) | 2024.04.29 |
[C#] 람다 식(=>), 입력 매개 변수와 자연 형식 (0) | 2024.04.29 |
[C#] Action, Func, Predicate 제네릭 대리자(델리게이트; Delegate)와 매개변수에 메서드 전달 (0) | 2024.04.26 |
[C#] 대리자(Delegate; 델리게이트)와 무명 메서드(+람다식 기초) (1) | 2024.04.26 |
[C#] 참조 매개 변수, ref와 out의 차이점 (0) | 2024.04.25 |
[C#] 값 형식과 참조 형식, 박싱과 언박싱(힙 메모리), is 연산자와 as 연산자 (0) | 2024.04.25 |