델리게이트(delegate), 이벤트(event)

hipop1109·2025년 6월 2일

유니티 버전을 까는 중 팀 프로젝트에 써야 하는 상황이 생겨 공부하는 김에 써보는 이벤트와 delegate 활용 방법

대리자(델리게이트, Delegate)
대리자를 사용해 콜백 메서드를 정의할 수 있다
대리자는 메소드를 대신해 호출하는 역할을 함
대리자를 통해 메소드를 매개변수로 전달할 수 있음

좀 쉽게 풀자면
델리게이트는 함수를 담는 그릇이라고 보면 될듯 하다
이 함수들을 함수 형식으로 받는 것이 아니라 변수 형식으로 받아서 델리게이트에 저장해두고
이 델리게이트를 실행하면 저장해둔 변수 형식의 함수들이 차례대로 실행되는 구조

delegate void TestDelegate();
TestDelegete testDel;

void start()
{
  	testDel += PrintName;
    testDel += PrintScore;
}

private void PrintName(){
}
private void PrintScore(){
}

간단하게 짜본 코드인데, 이런 식으로 코드를 += 식을 활용할 수 있는 변수화시키는게 핵심인듯

이벤트란?
개체에서 작업 실행을 알리기 위해 보내는 메세지
이벤트는 외부 이벤트 가입자(subscriber)에게 특정한 일을 알려준다
이벤트는 event라는 키워드 사용, 클래스 내 필드처럼 정의됨

이벤트에 가입하는 외부 가입자는 이벤트가 발생할 때 어떤 명령들을 실행할지 지정해준다, 이를 이벤트 핸들러(event handler)라고 함

이벤트는 += 연산자 사용해 이벤트 핸들러를 이벤트에 추가 / -= 연산자 사용해 이벤트 핸들러에서 삭제
하나의 이벤트에는 여러 개 이벤트 핸들러 추가 가능
이벤트 발생되면 추가된 이벤트 핸들러들을 모두 순차적으로 호출한다

using UnityEngine; 
using System; // ① using 지시문 

class ButtonEvent 
{ 
    public event EventHandler Click; // ② 이벤트 정의 

    public void MouseButtonDown() 
    { 
        if (this.Click != null) 
        { 
            Click(this, EventArgs.Empty); // 이벤트 핸들러들을 호출 
        } 
    } 
} 

public class EventExample : MonoBehaviour 
{ 
    void Start() 
    { 
        ButtonEvent buttonEvent = new ButtonEvent(); 
        buttonEvent.Click += new EventHandler(ButtonClick);  // ③ 이벤트 연결    

        buttonEvent.MouseButtonDown(); // 출력 : 버튼 클릭 
        buttonEvent.MouseButtonDown(); // 출력 : 버튼 클릭 
        buttonEvent.MouseButtonDown(); // 출력 : 버튼 클릭 
    } 

    void ButtonClick(object sender, EventArgs e)  // ④ 실행 메서드 : 이벤트 발생 
    { 
        Debug.Log("버튼 클릭"); 
    } 
}

어디선가 뽑아온 예제 코드인데 분석을 해보자면
public event EventHandler Click;
부분에서 먼저 이벤트를 정의한다
public void MouseButtonDown()
{
if (this.Click != null)
{
Click(this, EventArgs.Empty); // 이벤트 핸들러들을 호출
}
}
그리고 함수를 통해 클릭이라는 이벤트 핸들러를 호출할 수 있다

buttonEvent.Click += new EventHandler(ButtonClick);
그 후 이벤트를 연결해준 다음

void ButtonClick(object sender, EventArgs e) // ④ 실행 메서드 : 이벤트 발생
{
Debug.Log("버튼 클릭");
}
실행 메소드를 정의해 이벤트를 발생시킨다

결론적으로 저 함수의 발동 방식은
1. 함수를 이벤트의 특정 이벤트 핸들러에 연결한다
2. 그 이벤트 핸들러를 실행시키는 함수를 발동한다
3. 그 이벤트 핸들러를 발생시키면 자동적으로 함수도 같이 발동한다

add나 remove도 할 수 있는데, 이건 아마 특정 상황에선 버튼을 눌러도 이벤트가 가지 않게 하거나 특정 상황에선 추가 기능을 할 수 있게 지원하지 않을까 싶다

결론적으로 델리게이트를 활용한 게 이벤트와 이벤트 핸들러 구조이고
이를 활용해 버튼을 눌렀을 때 특정 기능이 바로 동작할 수 있는 기능들을 구현할 수 있을 듯 하다

profile
쑥쑥 개발자

0개의 댓글