드디어 이벤트 부분을 배워서 정리해 보도록 하겠습니다!
내가 알고 있던 이벤트 with LUA
LUA 에서는 1) 이벤트 타입을 만들고, 2) 그 이벤트를 Event Invoke 함수를 통해 호출시키고, 3) 이벤트를 감지하는 Event Handler 를 추가하여 이벤트를 발생시켰습니다.
이벤트의 장점
저는 이벤트를 정말 사랑했습니다. 한 번의 호출로 여러 함수를 호출할 수 있었거든요.
저는 코드를 작성할 때 가장 중요한 것이 현실과의 유사성이라고 생각하는데, 이벤트를 사용하면 마치 프로그램과 대화를 하는듯한 코딩이 가능했습니다. 다시말해 아래 그림처럼, 각 Manager Class 들이 내 얘기를 듣고 있는 것처럼 코딩할 수 있었습니다.
이벤트의 단점
하지만 이벤트가 좋다고 이벤트를 남발하면, 코드 속에서 길을 잃기 일쑤였습니다.
제가 사용했던 컴파일러에서는, 오류가 발생하면 진입점부터 코드를 트래킹해 주었습니다.
그런데, 이벤트를 사용하면, 그 이벤트를 감지한 시점부터를 트래킹해 주었기 때문에, 누가 왜 이 이벤트를 따로 찾아 주어야 했습니다.
그러다 보면 너무 많은 이벤트 호출으로 인해 방대한(?) 코드 속에서 미아가 되어 버리곤 했습니다.
그래도 한두번 호출할때는 이벤트만한게 없었습니다. 이벤트 만세!
근데 쓰다 보니까 이렇게 쓰는게 맞는지 헷갈립니다... 조금 더 공부하고 작성해야겠습니다.
(아래는 미완)
LUA에서 사용할 때에는, 이벤트 발생 시 호출할 함수에 핸들러를 추가하는 방식이었는데, C#에서는 핸들러에 함수를 추가하고 있다 ...
뭔가 어렵고 말도 안되는거같다 ... LUA 만세 ...
이렇게 쓰는거 맞나? 사용은 되는데 뭔가 과하게 복잡하다 ...
// 이벤트 선언
class PlayerEnterArg : EventArgs { }
// 이벤트를 발생시킬 클래스
class GameManager
{
public event EventHandler PlayerEnter; // 3) 등록된 핸들러 함수 실행
public void PlayerEnterGame()
{
PlayerEnter(this, new PlayerEnterArg()); // 2) 이벤트 호출
}
}
// 이벤트 발생시 호출할 함수
public static void PrintPlayerName(object sender, EventArgs e)
{
Console.WriteLine("새로운 유저 입장 : 홍길동"); // 3) 홍길동 출력
}
// 진입정
public static void Main(string[] args)
{
GameManager gameManager = new GameManager();
gameManager.PlayerEnter += PrintPlayerName; // 0) 이벤트 발생시 호출할 함수 등록
gameManager.PlayerEnterGame(); // 1) 이벤트 호출 함수 호출
}
class PlayerEnterArg : EventArgs
{
public string name;
public PlayerEnterArg(string name)
{
this.name = name;
}
}
class GameManager
{
public event EventHandler PlayerEnter; // 3) 등록된 핸들러 함수 실행
public void PlayerEnterGame(string name)
{
PlayerEnter(this, new PlayerEnterArg(name)); // 2) 이벤트 호출
}
}
public static void PrintPlayerName(object sender, EventArgs e)
{
PlayerEnterArg arg = (PlayerEnterArg)e;
Console.WriteLine(arg.name); // 3) 홍길동 출력
}
public static void Main(string[] args)
{
GameManager gameManager = new GameManager();
gameManager.PlayerEnter += PrintPlayerName; // 0) 이벤트 발생시 호출할 함수 등록
gameManager.PlayerEnterGame("홍길동"); // 1) 이벤트 호출 함수 호출
}
'Server > C# 비동기와의 전쟁' 카테고리의 다른 글
Task.Run vs await (0) | 2023.11.03 |
---|---|
내가 생각한 비동기 입력은 없었다 (1) | 2023.08.08 |
[추가필요] 스레드 간 리소스 공유 (0) | 2023.06.02 |
스레드 종료를 기다리는 법 (Join, EventWaitHandle) (0) | 2023.05.22 |