Event에서 간단하게 정리하려고 한다.
알아보자
무엇이냐???
Event는 C#이 지원하는 하나의 기능으로
특정한 일(event)이 있어났음을 외부의 이벤트 가입자(subscriber)들에게 알려주는 기능을 한다.
즉, 외부와의 커플링, Coupling을 줄이기 위한 도구 중 하나이다.
왜쓰냐??
위에서 말했다시피 Coupling을 줄여줌은 물론
Event가 발생했을 때만 Subscriber된 함수가 실행됨으로
Update로 항상 지켜보지 않아도 된다는 장점이 있다.
-> 하지만 해당 Event를 발생시키는 것은 Update로 봐야한다는 단점도 존재한다.
결국 Event의 Event도 어차피 누군가는 감지를 해야 발행할 수 있으니까..?
어떻게 사용하는 지를 보면서 더 감을 잡도록 하자.
어떻게 쓰냐???
이벤트에 가입하는 외부 가입자 측에서는 이벤트가 발생했을 때 어떤 명령들을 실행할 지를 지정해 주는데
이를 이벤트 핸들러라 한다.
이벤트에 가입하기 위해서는 += 연산자를 사용하여 이벤트핸들러를 이벤트에 추가한다.
반대로 이벤트핸들러를 삭제하기 위해서는 -= 연산자를 사용한다.
**일반적으로 delegate를 써서 Event 함수의 등록,제거를 진행한다.
하나의 이벤트에는 여러 개의 이벤트핸들러들을 추가할 수 있으며
이벤트가 발생되면 추가된 이벤트핸들러들을 모두 차례로 호출한다.
코드로 예를 들어보자면
// 클래스 내의 이벤트 정의
class MyButton
{
public string Text;
public event EventHandler Click; //Click이라는 Event를 만듦
public void MouseButtonDown()
{
//Click이라는 Event가 발생했다면..?
if (this.Click != null)
{
Click(this, EventArgs.Empty); //해당 Click에 있는 핸들러들을 해당 인수를 넣어 호출
}
}
}
// 이벤트 사용
public void Run()
{
MyButton btn = new MyButton(); // Btn이라는 해당 클래스 객체 생성
// btn_Click 핸들러에 함수 추가(Event 발생 시 실행시킬 함수)
btn.Click += new EventHandler(btn_Click);
btn.Text = "Run";
//....
}
void btn_Click(object sender, EventArgs e)
{
MessageBox.Show("Button 클릭");
}
요약
1. Event는 클래스 간의 Coupling을 줄여줌
-> Event 발행자는 어떤 함수가 실행될지 모름
-> Event 수신자는 어떤 Event가 발생했는지 모름
2. Event는 항상 지켜보지 않아도 된다.
-> Event가 발생될 때만 실행되므로 Update로 어떤 변수를 지켜보거나 상태를 지켜보고있지 않아도 된다.
3. Delegate로 Event를 등록하면 관리를 잘해주어야 한다.
-> 원치 않은 실행을 막기 위해서는 실행 후 EventHandler에서 제거를 필요로 한다.
++4. Event의 상위 호환을 쓰고 싶다면 Reactive Programming을 써보자
-> Unity에서는 UniRx를 지원한다.
참고
https://www.csharpstudy.com/CSharp/CSharp-event.aspx
'Game Development, 게임개발 > 개발' 카테고리의 다른 글
Task, Task<TResult> 클래스 , 비동기 프로그래밍 [Unity] (0) | 2022.02.14 |
---|---|
UniRx, Reactive Extension for Unity - 개념 2 (0) | 2022.01.14 |
UniRx, Reactive Extension for Unity - 개념 (1) | 2022.01.07 |
Camera, 카메라에 대한 것들 [Unity] (0) | 2021.09.05 |
게임 일시정지하기, 퍼즈, pause 만들기 [Unity] (0) | 2021.06.10 |