본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티unity로 게임 만들기

유니티41_C#_26_Event 이벤트

Event 이벤트

 

이전 글에서 델리게이트에 대해 알아보았다.

델리게이트는 콜백 기능과 결합하여 화려한 기술을 구사할 수 있다.

 

이번에는 델리게이트를 이용한 콜백을 더욱 세련되게 구사하는 Event(이벤트)에 대해 알아본다.

Event(이벤트)는 앱이나 게임 등에서 흔히 접할 수 있는 기능이다.

그러므로 오늘날 프로그래밍은 이벤트가 주도한다고 할 수 있다.

즉, Event Driven Programming (이벤트 주도 프로그래밍)의 시대라 할 수 있다.

 

콜백 기능을 떠올려 보면 '주고 받는' 또는 '받고 되돌려 주는' 과정에는 '주는 쪽'과 '받는 쪽'이 있다.

마찬가지로 이벤트 역시 이벤트를 '발생 시키는'쪽과 그 이벤트에 '반응하는 쪽'이 있다.

 

이벤트를 발생시키는 쪽이 하나라면 반응하는 쪽은 하나 이상이 될 수 있다.

그런 면에서 발생시키는 쪽은 Event Publisher(이벤트 게재자) 또는 Giver(기부자)라고 부를 수 있고,

반응하는 쪽은 Subscribers(구독자들) 또는 Catchers(잡는 사람들)라고 할 수 있다.

 

Publisher가 이벤트를 발생시키는 것에 반응하기 위해서는 Subscribers는 그 이벤트에 등록해야 그것에 대한 반응을 처리할 수 있다. Subscriber가 이벤트에 대한 반응으로 무엇을 처리하는 과정을 흔히 Event Handler(이벤트 처리자)라고 부른다.

*handle : 다루다, 처리하다

 

이런 기능은 유튜브 등에서 알림 기능에 등록해 놓으면 새 영상이 나왔을 때 알림 메세지가 뜨는 것과 같이 작동한다.

 

 

Event 선언

아래와 같이 이벤트를 발생시키는 EventGiver클래스와

이벤트를 캐치해서(잡아서) 처리하는 EventCatchers 클래스가 있다고 하자.

 

 

EventGiver클래스에서 event(이벤트)를 사용하려면 먼저 10번 줄과 같이 delegate를 선언한다.

그리고 주는 쪽 클래스 안에서 델리게이트 타입의 변수(testEvent)를 만들고 그 앞에 event 키워드를 붙인다.

즉, event 키워드가 붙은 델리게이트 변수를 만들면 된다.

 

접근제한자 public 은 이벤트에 +=, -= 연산자를 사용하여 메서드를 추가하거나 삭제할 수 있게 한다.

단, 메서드 삭제는 이벤트가 생성된 클래스에서만 가능하다.

 

이벤트 예를 만들어 보자.

 

 

새 스크립트 EventExample.cs를 만들고 위와 같이 코드를 작성한다.

주는 클래스와 받는 클래스를 만들고 이벤트를 선언했다.

 

16번 줄에 이벤트를 실행할 때 사용할 RunEvent( ) 메서드를 만든다.

24번 줄에 EventCatchers클래스의 생성자를 만든다.

EventCatchers 클래스의 객체가 만들어질 때 이 기본 생성자로 초기화한다.

 

26번 줄에 생성자의 내용은 EventGiver.testEvent에 접근해서 등록하는 것이다.

이렇게 등록해야 이벤트가 발생했을 때 EventCatchers가 반응, 즉 Event Handler(이벤트 처리)를 할 수 있다.

그런데 event는 public과 같은 접근자에 상관없이 선언한 클래스 외부에서 호출할 수 없다.

 

그래서 여기서는 이벤트를 static으로 선언한다.

14번 줄에서 이벤트 선언에 static을 붙인 이유는 이벤트를 static(스태틱; 고정된)으로 만들어서 EventGiver의 인스턴스(객체)와 상관없는 이벤트를 만들기 위함이다.

 

이전 글에서 static키워드는 객체를 생성하지 않고도 멤버에 접근할 수 있게 한다고 했다.

그리고 static멤버에 접근하려면 직접 클래스를 통해서 접근할 수 있다고 했다.

그러므로 testEvent는 EventCatchers클래스에서 EventGiver.testEvent로 접근할 수 있는 것이다.

 

32번 줄에 이벤트가 발생했을 때 반응에 사용할 메서드를 만들자. 여기서는 EventHandle (이벤트를 처리하다)라고 이름을 지었다.

 

29번 줄에 EventHandle 메서드를 이벤트 (testEvent)에 추가한다.

 

18~21번 줄에 이벤트를 실행하는 RunEvent메서드 내용을 작성한다.

이벤트를 호출하려면 testEvent( ) 처럼 작성하면 되지만 event는 발생한 이벤트를 받는 클래스가 없으면 호출될 때 NullReferenceException 예외를 발생시킨다.

이런 예외가 발생하는 것을 미리 막기 위해 if조건문의 조건에 (이벤트는 null(없음)이 아니다(!=)) 라는 조건이 참(true)일 때만 즉, 등록해서 참조하는 메서드가 있다(없지 않다)면 이벤트를 호출하도록 한 것이다.

 

위와 같이 event의 전체 과정을 만들 수 있다.

이제 유니티에서 RunEvent함수를 호출해서 이벤트를 발생시켜 보자.

 

 

 

델리게이트를 기반으로 하는 이벤트 기능이 유용한 점은 이벤트 받는 쪽이 여러 곳일 수 있다는 것이다.

그리고 이벤트에 대한 반응(처리)도 각자 다른 방식이 될 수 있다.

 

끝.

Wraven...