[C#] 델리게이트(Delegate)와 이벤트(Event)

델리게이트란?

  • 함수를 대신 호출한다.

이벤트란?

  • 특정 상황이 발생했을 때 알리고자 하는 용도로 여러 함수를 호출해야하는 경우에 사용한다.
  • 델리게이트를 기반으로 한다.

델리게이트와 이벤트의 공통점

  • 여러 함수를 호출할 수 있다.

델리게이트와 이벤트의 차이점

  • 델리게이트는 한 클래스에 있는 함수를 호출할 수 있고 이벤트는 여러 클래스에 있는 함수를 호출할 수 있다.

사용시 주의점

 


델리게이트 예시

Start()에서 chain을 호출했으니 게임을 시작하자마자 chain이 호출됨.

 

< Test1.cs >

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test1 : MonoBehaviour
{
    // 레벨업 할 때마다 power와 defence를 5씩 높여주고 싶음
    int power;
    int defence;

    public delegate void ChainFunction(int value);
    ChainFunction chain;

    void Start()
    {
        chain += SetPower;// chain에 함수 더하기
        chain += SetDefence;
        //chain = SetPower; 이라고 하면 chain에 SetPower만 적용된다.
        chain -= SetPower; // chain에 함수 빼기

        chain(5); // chain 호출시키기
    }

    void Update()
    {
        
    }

    public void SetPower(int value)
	{
        power += value;
	}

    public void SetDefence(int value)
	{
        defence += value;
	}

}

 

이벤트 예시

유니티에서 오브젝트1에 Test1 스크립트를 부착해주고 오브젝트2에 Test2 스크립트를 부착해준다면 게임이 끝날 시 OnDisable()의 OnStart(5)가 호출됨.

 

< Test1.cs >

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test1 : MonoBehaviour
{
    // 레벨업 할 때마다 5씩 높여주고 싶음
    int power;
    int defence;

    public delegate void ChainFunction(int value);
    public static event ChainFunction OnStart;

    void Start()
    {
        OnStart += SetPower;
        OnStart += SetDefence;
    }

    void Update()
    {
        
    }

    public void SetPower(int value)
	{
        power += value;
	}

    public void SetDefence(int value)
	{
        defence += value;
	}

    // MonoBehaviour 클래스 안에 있는 함수
    // 게임이 꺼지거나 오브젝트가 비활성화되면 호출되는 함수
    private void OnDisable()
	{
        OnStart(5);
	}
}

 

< Test2.cs >

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test2 : MonoBehaviour
{
    void Start()
    {
        Test1.OnStart += Abc; //static이어서 다른 스크립트에서 OnStart에 접근 가능!
    }

    void Update()
    {
        
    }

    public void Abc(int value)
	{
        print(value + "값이 증가했습니다");
	}
}

https://www.youtube.com/watch?v=m9_D0DQ4SGU&list=PLUZ5gNInsv_O7XRpaNQIC9D5uhMZmTYAf&index=12 

위 자료를 바탕으로 작성하였습니다.

'CS > C#' 카테고리의 다른 글

[C#] Thread  (2) 2025.08.13
[C#] readonly  (1) 2025.07.21
[C#] static, 싱글톤  (0) 2023.05.03
[C#] 상속과 가상함수, 추상함수  (0) 2022.07.31
[C#] 컬렉션(Collection)과 제네릭 컬렉션(Generic Collection)  (0) 2022.07.26