이벤트(Event)란 프로그램에 감지되고 처리될 수 있는 동작이나 사건을 의미합니다. 쉽게 말하면 값이나 참조가 변경됨에 따라 실행되는 함수들을 의미합니다. 보통 게임에서 많이 사용하며, 다른 값들과 상호작용이 되기 때문에, 상당히 유용합니다.
이벤트 드리븐(Event Driven)이란 프로그램이 비동기적인 이벤트에 반응하여 동작을 변경하는 프로그래밍 패러다임입니다.
그럼 이벤트 함수들을 어디서 다뤄야 할까요?
값이 바뀌자마자 실행이 되야 하므로 처음 생각할 수 있는 것은 Update함수에서 다루는 것입니다. 하지만 Update() 함수는 매 프레임마다 실행되기 때문에, 상당히 무거운 함수입니다. 거기에 이벤트 함수의 조건을 넣고 실행시킨다면, 값이 변하지 않아도 매 프레임마다 이벤트 함수 조건을 검사할 것입니다. 따라서 추천드리지 않는 방법입니다.
값 수정 시점에 발생해야 할 이벤트를 체크하고, 조건이 만족하면 이벤트를 발생시킬 수 있습니다. Update() 함수와는 다르게 매 프레임마다 체크하지 않기 때문에, 성능 향상과 청결한 코드 두 개를 모두 잡을 수 있습니다. 하지만 만약 이 프로퍼티를 이용하는 많은 오브젝트들이 있다면 문제가 생길 수도 있습니다. 조건에 충족해 함수를 실행해도 어떤 오브젝트가 조건에 충족했는지에 대한 정보가 없습니다.
위의 문제 때문에 각 오브젝트가 모든 종류의 이벤트에 대해 선택적으로 수신하도록 하게 해야 할 필요성이 생겼습니다.
iListener 인터페이스 만들기 : 이벤트가 발생했다면, 해당 이벤트를 수신할 수 있는 오브젝트로 우선 만들어줘야 합니다.
EventManager 만들기 : 여러 레벨(Scene)에 유지되고, 전역적으로 접근이 가능한 클래스(Singleton구현)로 Listener와 Poster를 연결하는 역할을 수행합니다. 아래 두개의 역할로 나뉩니다.
각각의 오브젝트가 따로 이벤트 매니저의 함수들을 받을 수 있기 때문에, 더 이상 정보가 겹칠 일이 없습니다. 따라서 상당히 효율적인 방법입니다.
앞서 인터페이스를 사용하지 않고, 델리게이트를 이용하는 방법도 있습니다. EventManager로만 관리하고, Delegate의 특성이 메소드로 관리를 하면 코드도 간결하고 좀 더 편해집니다. 프로그램 동작에는 인터페이스와 효율차이가 나지는 않습니다.