이번주 팀 프로젝트를 하면서 퀘스트를 추가하는 일이 있었다. 먼저 생각한 퀘스트를 추가하는 방식은 다음과 같다.
함수가 호출이 될 때, 함수 안에서 QuestManager의 메서드를 호출하여 검사한다.
하지만 이 방식은, 단점이 너무나도 많이 존재하는데..
1. 우선 퀘스트가 늘어날 때 마다, 각자의 메서드에 가서 추가적인 처리를 해 주어야 한다.
2. 퀘스트가 없어도 실행이 되는 구조라서, 오버헤드가 많이 발생할 것이다.
자, 그러면 해결할 수 있는 다른 방식에 대해 질문을 한 결과 다음과 같은 해결방법 두가지가 생겼다.
Delegate와 Event를 활용하여 호출이 되야 하는 곳에 Event를 넣어주고, 이 이벤트가 발생 시 호출해야 할 메서드를 Event에 등록 해 주는 것이다. 자 그러면 Event에 대해서 다시 한번 집어보자.
#class EventTest
public delegate void TestDeligate(int ID);
public event TestDeligate onEventInvoked;
public void actStuff(int id)
{
onEventInvoked?.Invoke(id);
}
...
#class EventRecieve
public void getStuff(int id)
{
Console.Writeline(id);
}
...
#Main
EventTest.onEventInvoked += EventRecieve.getStuff;
EventTest.actStuff(1);
한줄씩 차례로 보도록 하자.
EventTest클래스 내부에서 event를 정의 해 주었다. 이는 델리게이트의 일부로, += 과 -=을 사용 할 수 있지만, =을 사용해 줄수는 없다.
actStuff 매소드 내부를 보면 onEventInvoked?.Invoke(id)라고 적혀있다. 만약 해당 클래스 내부에 onEventInvoked가 정의되지 않은 경우를 제외하고, 해당 actStuff를 실행시 이벤트에 연결되어있는 모든 메소드를 실행하겠다는 것이다.
Main에서는 EventTest에 있는 이벤트에 EventRecieve에 있는 getStuff을 연결 해 주었다. 그 후 EventTest.actStuff(1)을 실행하면 다음과 같이 진행된다고 보면 된다.
EventTest.actStuff 메소드 실행
-> onEventInvoked가 비어있지 않기 때문에, onEventInvoked에 연결된 메서드들을 실행
-> onEventInvoked에 연결되어있는 EventRecieve의 getStuff을 실행하여 id인 1을 출력
이를 이용하여, Event에 이 이벤트가 실행될 메소드와 이벤트에 에 영향을 받아야 할 메소드들을 더해주고, 이를 이용하여 알아서 다른 곳으로 이벤트를 전해 줄 수 있다.
이는 문제 2번을 해결 해 주지만, 여전히 이벤트를 전달할 메소드에 모두 이벤트를 일일이 넣어줘야 한다는 성질이 존재한다. (그래도 전에 생각한 방식보다는 가독성면에서 훨씬 좋다.)
내일 공부하면서 확인 할 내용이지만, 오늘 간단하게 알아낸 내용들을 정리한다.
Event를 전해주는 Publisher과 Event를 받는 Subscriber의 가운데 이 정보들을 전달 해 줄 EventBusPattern이 Publisher과 Subscriber을 관리해준다는 내용으로, Publisher가 이벤트를 호출하면 이 이벤트를 받는 SubScriber한테 전달해 주는 역활을 하는 무언가라고 한다.
일단 이건 내일 퀘스트 작업 해보면서 사용하고 느껴봐야 할 듯 하다.