안녕하세요 투니드입니다! 

오늘 배워볼 것은 델리게이트(Delegate)입니다!

 

정말 많이 쓰이고 정말 중요해서 포스팅을 조금 자세하게 해보도록 하겠습니다!

 

먼저 델리게이트란 뭘까요?

델리게이트는 "메서드를 가리키는 포인터" 역할을 하는 C#의 참조 타입입니다!
즉, 메서드를 변수처럼 저장하고 나중에 실행할 수 있도록 해주는 기능입니다!!
====== "델리게이트 = 특정 형식의 메서드를 저장하고 호출할 수 있는 변수" ======

 

1) 기본 델리게이트 선언과 사용

델리게이트를 사용하려면 1)선언 → 2)할당 → 3)실행 3단계가 필요합니다.

Delegate Ex)

 

위에 있는 MyDelegate는 void 반환형이며 string을 매개변수로 받는 메서드를 저장할 수 있음.

 

델리게이트 사용

Delegate Ex)

 

Example.class

더보기

class Example
{
    public delegate void MyDelegate(string message); // 반환값이 없고, string 매개변수를 받는 델리게이트 타입 선언

    static void PrintMessage(string message)
    {
        Debug.Log("Message: " + message);
    }

    static void Main()
    {
        MyDelegate myDelegate = PrintMessage; // 델리게이트에 메서드 할당
        myDelegate("Hello, Delegate!"); // 실행 -> "Message: Hello, Delegate!" 출력
    }
}

델리게이트는 PrintMessage 메서드를 참조하고 있다가, myDelegate("Hello, Delegate!") 호출 시 실행됨!

 

2) 델리게이트 응용 (델리게이트 체인 (Multicast Delegate))

델리게이트는 여러 개의 메서드를 저장하고 한 번에 실행할 수도 있습니다!

이걸 멀티캐스트(Multicast) 델리게이트라고 합니다!

Delegate Ex)
실행결과

+= 를 사용하면 델리게이트 체인처럼 여러 메서드를 등록할 수 있습니다!

(다만 매개변수의 형식이 일치해야합니다 위에 설명에서는 delegate에 string 하나만 받고있죠? 

MethodA와 MethodB역시 string 하나씩 받는 메서드들이라서 가능한겁니다!)

 

3) 유니티에서의 Delegate

Action, Func, UnityAction 차이점

C#과 Unity는 기본적인 델리게이트 패턴을 쉽게 사용할 수 있도록 Action, Func, UnityAction을 제공합니다!

 

3-1) Action (입력만 있고 반환값 없음)

Action Example
실행결과

 

 

Action<T>는 void를 반환하는 델리게이트.

Action<T1, T2>처럼 여러 개의 매개변수를 받을 수도 있음.

 

3-2) Func (입력 + 반환값 있음)

Func Example

 

실행결과

 

 

Func<T1, T2, TResult>는 입력을 받아 TResult를 반환하는 델리게이트.

마지막 타입(TResult)이 반환값.

 

 

3-3) UnityAction (Unity 전용, Action과 동일)

Unity는 이벤트 시스템을 더 쉽게 관리할 수 있도록 **UnityAction**을 제공합니다!
사실상 Action과 거의 동일하지만, UnityEvent와 연동할 때 주로 사용되고 있습니다!

UnityAction Example
실행결과

 

UnityEvent에 연결할 때 UnityAction을 사용하면 편리함

UnityEvent Example
실행결과

 

이런식으로 Invoke()로 실행시킬때, 내가 원하는 곳에서 실행을 시켜주면 편리하게 사용할 수 있겠죠??

 

4) Action, Func, UnityAction을 활용한 예제

 

플레이어가 점프하면 여러 반응이 실행되는 시스템

 

Player.cs

더보기

using UnityEngine;
using UnityEngine.Events;
using System;

public class Player : MonoBehaviour
{
    public event Action OnJump;      // 점프할 때 실행될 액션
    public UnityEvent OnJumpEvent;   // UnityEvent (에디터에서 설정 가능)

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Jump();
        }
    }

    void Jump()
    {
        Debug.Log("플레이어 점프!");
        OnJump?.Invoke();      // 🔥 Action 델리게이트 실행
        OnJumpEvent?.Invoke(); // 🔥 UnityEvent 실행
    }
}

JumpListener.cs

더보기

using UnityEngine;
using UnityEngine.Events;
using System;


public class JumpListener : MonoBehaviour
{
    public Player player;

    private void Start()
    {
        player.OnJump += PlaySound;  // Action 델리게이트 연결
        player.OnJumpEvent.AddListener(ShowEffect); // UnityEvent 연결
    }

    void PlaySound()
    {
        Debug.Log("🔊 점프 효과음 재생!");
    }

    void ShowEffect()
    {
        Debug.Log("✨ 점프 이펙트 발생!");
    }
}

두 스크립트 파일을 만들어두고

Player Inspector

 

이렇게 구독을 해주면

실행결과

 

점프하면 플레이어 점프!, 🔊 점프 효과음 재생!, ✨ 점프 이펙트 발생!이 모두 실행됨!
델리게이트 체인으로 여러 개의 반응을 쉽게 추가할 수 있음!

델리게이트를 잘 쓰면?

이벤트 기반 프로그래밍이 쉬워짐! (버튼 클릭, 점프 이벤트 등)

코드가 더 유연해짐! (메서드를 따로 추가할 필요 없이, 델리게이트로 쉽게 연결 가능)

Observer 패턴처럼 동작할 수 있음! (한 이벤트에 여러 반응을 추가 가능)

 

델리게이트의 응용이 제네릭과 함께 들어가면 델리게이트라는건 알겠는데 좀 어려울 때가 많습니다(저만 그런가요?ㅠㅠ)

 

확실하게 코딩을 편하게 만들어주는 델리게이트 시스템! 익숙해질때까지 화이팅입니다!

 

'C# 기초 배워보기' 카테고리의 다른 글

C# 다형성!(Polymorphism)  (0) 2025.03.10
C# 인터페이스(Interface)!  (0) 2025.03.05
클래스 2탄!  (0) 2024.08.19
클래스, 메소드!  (0) 2024.08.19
C# Generic(제네릭)!  (0) 2024.08.14

+ Recent posts