C# - Event

2024. 4. 30. 22:58C#/C# 학습정리

이벤트는 우리가 평소에 알고있듯 무슨 일이 생기거나 할 때 이벤트라고 부른다. C#에서도 마찬가지로 무슨 일이 발생 할 때 이벤트가 발생한다고 하는데 이 때 이벤트는 클래스내에서 발생한 특정한 일(Event)가 일어났음을 외부에 있는 이벤트핸들러에게 알려 처리하는 것을 말한다.

 

목차

    1. Event
    2. Event 사용법


    Event

    이벤트는 객체에서 작업 실행을 알리는 위해 보내는 메세지이다. 이벤트를 발생시키는 객체를 이벤트 전송자라고 하며 이벤트 전송자는 어떤 객체 또는 메서드가 발생되는 이벤트를 처리할지 모른다. 이벤트는 보통 전송자의 필드이다.

    이벤트의 알림을 받고 알림을 받은 외부 가입자들은 해당 이벤트가 발생했을때 어떤 명령을 처리할지 정하는데 이것을 Event Handler라고 한다. 가입자들은 이벤트핸들러에 += 연산자를 통해 가입을 해야한다.

    internal class Monster
    {
        public event EventHandler MonsterDied;
        ...
    }

     

    해당 코드처럼 Monster클래스에서 MonsterDied 이벤트핸들러를 생성했다. 해당 이벤트핸들러의 정의를 타고 들어가게된다면.

    이미지 처럼 sender와 e 두개의 인자를 명시적으로 받도록 하고 있습니다. 

    • sender => Obeject 이벤트 호출자
    • arg => EventArgs 이벤트 데이터가 포함되지 않은 개체

     

    Event 사용법

    internal class Monster
    {
    	...
        public event EventHandler MonsterDied;
        public void Die()
        {
            OnMonsterDied();
        }
    
        public virtual void OnMonsterDied()
        {
            MonsterDied?.Invoke(this, EventArgs.Empty);
        }
        ...
    }

    몬스터 클래스에서 Monster가 죽으면 Die()메서드를 실행해 Invoke를 한다.

    Invoke메서드는 이벤트를 호출한다. this객체를 이벤트 발생자로 지정하고, EventArgs.Empty를 전달해 추가적인 정보가 없음을 알린다.

    internal class MonsterKillQuest : Quest
    {
        override public void HandleMonsterDied(object? sender, EventArgs e)
        {
            var monster = sender as Monster;
            if(monster != null)
            {
                if(monster.Name == "Slime")
                    SlimeKilledCount++;
            }
        }
    }

    몬스터 킬 퀘스트 클래스에서 HandleMonsterDied메서드를 구현해 매개변수를 sender와 e를 받아 이벤트 핸들러를 구현해 줍니다.

    이벤트를 발생 시킨 객체가 monster임을 확인하기 위해서 var monster = sender as Monster;를 작성하고

    해당 몬스터가 'null'이 아니라면 몬스터네임에따라서 퀘스트에 필요한 SlimeKilledCount를 증가시키는 코드이다.

    Monster monster = new Monster("Slime", 1, 1, 1);
    
    
    QuestManager.Instance.InitQuest();
    QuestManager.Instance.EnterQuest();
    
    for (int i = 0; i < QuestManager.Instance.quests.Count; i++)
    {
        monster.MonsterDied += QuestManager.Instance.quests[i].HandleMonsterDied;
    }
    
    
    
    monster.Die();
    monster.Die();
    monster.Die();
    monster.Die();
    monster.Die();
    QuestManager.Instance.EnterQuest();
    • "Slime"이름을 가진 몬스터 객체를 만든다.
    • MonsterDied이벤트 핸들러에 모든 퀘스트 이벤트핸들러를 등록해준다.
    • monster.Die()를 총 5번실행해 퀘스트 클리어에 필요한 슬라임의 5번잡기 이벤트를 발생시킨다.
    • 해당 이벤트핸들러에 등록된 handleMonsterDied가 실행되어 올바르게 작동한다.

     


     

     

    'C# > C# 학습정리' 카테고리의 다른 글

    C# - Queue  (0) 2024.05.02
    C# - Stack  (0) 2024.04.29
    C# StreamReader ,StreamWriter, 파일 읽기, 쓰기  (0) 2024.04.26
    C# 상속과 다형성  (0) 2024.04.24
    C# Ref 와 Out 키워드  (0) 2024.04.23