본문 바로가기

C# 일기

19. 이벤트(Event)

이벤트는 어떠한 사건이 발생함, 혹은 사건 자체를 일컫는 말이다.

 

프로그래밍에서 어떠한 사건이 발생하거나, 사건 자체에 해당하는 것은 무엇이 있을까?

 

우리가 객체지향을 하면서, 객체들이 여러가지 상호작용을 통해서 상태가 변화하는 등의 변화가 있을 것이다.

 

우리는 변화가 바뀌는 것 혹은 변화 그 자체를 이벤트라고 생각할 수 있겠다.

 

슈퍼마리오 게임을 예로 들자면, 마리오가 길을 가다가 코인을 획득했다고 가정해보자.

 

이 때, 코인을 획득했을 때 여러 객체들 사이에서 상호작용이 일어난다.

 

예를 들면, 코인의 갯수를 알려주는 UI는 보유 코인 갯수를 갱신할 것이고,

 

음향효과를 담당하는 객체에서는 코인 획득 시, 짤랑 하고 코인을 획득하는 효과를 출력할 것이며,

 

코인의 이펙트를 담당하는 객체에서는 코인이 빙글빙글 돌면서 점차 사라지는 이펙트를 출력할 것이다.

 

이렇듯, 어떠한 객체의 상태변화를 다른 객체에 전달하여, 해당 객체의 상태변화를 기반으로 다른 객체가 상호작용할 수 있도록 제어하는 것이 이벤트이다.

 

이벤트는 대리자와 굉장히 유사하다. 선언할 때도, 사용할때도 구조적으로 많이 닮아있지만, 유의미한 차이가 있는데, 이에 대해서는 대리자와 이벤트의 차이를 설명할 때 더 자세히 다루도록 하겠다.

 

먼저, 이벤트의 선언과 사용 방법이다. 예시로 들었던 슈퍼마리오의 코인 획득과 연관지어 예제를 만들어보겠다.

 

using System;

namespace Favor
{
   class Mario
   {
      public event void onGetCoin();
      public void GetCoin()
      {
          Console.WriteLine("코인 획득!");
          onGetCoin();
      }
   }
   class VFX
   {
      public void CoinFX() {Console.WriteLine("반짝반짝");}
   }
   class SFX
   {
      public void CoinSound() {Console.WriteLine("짤랑");}
   }
   class UI
   {
      public void CoinUp() {Console.WriteLine("코인 갯수 +1");}
   }
   
   internal class Program
   {
      static void Main(string[] args)
      {
         Mario m = new Mario();
         VFX vfx = new vfx();
         SFX sfx = new sfx();
         UI ui = new UI();
         
         m.onGetCoin += ui.CoinUp;
         m.onGetCoin += vfx.CoinFX;
         m.onGetCoin += sfx.CoinSound;
         
         m.GetCoin();
         
         // 출력값 : 코인 획득! 코인 갯수 +1 반짝반짝 짤랑  
        
      }
   }
}

 

우선, 클래스 내부에 이벤트를 선언한다.

 

이벤트 선언 방식은 대리자와 동일하지만, delegate대신 event라는 키워드를 사용한다.

 

그 후, 클래스 내부에 이벤트를 설정하는 메서드를 만든다. 이 때, 이벤트를 다루는 메서드를 EventHandler라고 부르기도 한다.

(여기서 이벤트 핸들러는 GetCoin이라고 할 수 있다. )

 

 

그 다음, 해당 객체를 인스턴스하고, 객체의 이벤트와 상호작용할 다른 객체들도 인스턴스해준다.

(여기서는 마리오의 코인 획득과 상호작용할 객체들로 VFX, SFX, UI 객체를 인스턴스했다.)

 

 

그리고, 객체의 이벤트에 해당 이벤트와 상호작용할 객체들의 메서드를 등록한다.

(여기서는 이벤트 m.onGetCoin과 상호작용할  vfx.CoinFX, ui.CoinUp, sfx.CoinSound가 이에 해당한다.) 

 

 

이렇게 연결해주었다면, 이벤트를 발생시켰을 때, 등록되어있는 메서드들이 호출된다. 물론, 이 역시 대리자 때와 마찬가지로 등록한 순서대로 호출된다.

 

 

 

(추가로, 대리자 때 다루지 않았던 것이 있는데, +=으로 메서드를 등록했던 것과 같이, -=연산자를 통해 등록되어있는 메서드들을 빼줄 수도 있다.)

 

 

 

 

 

'C# 일기' 카테고리의 다른 글

20. 람다식(Lambda Expression)  (0) 2024.03.11
19 - 1. 이벤트 VS 대리자  (0) 2024.03.11
18. 대리자 (Delegate)  (0) 2024.03.11
17. 예외처리(Exception Handling)  (0) 2024.03.11
16. 일반화 (Generic <T>)  (0) 2024.03.08