안녕하세요 투니드입니다!
오늘 배워볼 것은 델리게이트(Delegate)입니다!
정말 많이 쓰이고 정말 중요해서 포스팅을 조금 자세하게 해보도록 하겠습니다!
먼저 델리게이트란 뭘까요?
델리게이트는 "메서드를 가리키는 포인터" 역할을 하는 C#의 참조 타입입니다!
즉, 메서드를 변수처럼 저장하고 나중에 실행할 수 있도록 해주는 기능입니다!!
====== "델리게이트 = 특정 형식의 메서드를 저장하고 호출할 수 있는 변수" ======
1) 기본 델리게이트 선언과 사용
델리게이트를 사용하려면 1)선언 → 2)할당 → 3)실행 3단계가 필요합니다.
위에 있는 MyDelegate는 void 반환형이며 string을 매개변수로 받는 메서드를 저장할 수 있음.
델리게이트 사용
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에 string 하나만 받고있죠?
MethodA와 MethodB역시 string 하나씩 받는 메서드들이라서 가능한겁니다!)
3) 유니티에서의 Delegate
Action, Func, UnityAction 차이점
C#과 Unity는 기본적인 델리게이트 패턴을 쉽게 사용할 수 있도록 Action, Func, UnityAction을 제공합니다!
3-1) Action (입력만 있고 반환값 없음)
Action<T>는 void를 반환하는 델리게이트.
Action<T1, T2>처럼 여러 개의 매개변수를 받을 수도 있음.
3-2) Func (입력 + 반환값 있음)
Func<T1, T2, TResult>는 입력을 받아 TResult를 반환하는 델리게이트.
마지막 타입(TResult)이 반환값.
3-3) UnityAction (Unity 전용, Action과 동일)
Unity는 이벤트 시스템을 더 쉽게 관리할 수 있도록 **UnityAction**을 제공합니다!
사실상 Action과 거의 동일하지만, UnityEvent와 연동할 때 주로 사용되고 있습니다!
UnityEvent에 연결할 때 UnityAction을 사용하면 편리함
이런식으로 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("✨ 점프 이펙트 발생!");
}
}
두 스크립트 파일을 만들어두고
이렇게 구독을 해주면
점프하면 플레이어 점프!, 🔊 점프 효과음 재생!, ✨ 점프 이펙트 발생!이 모두 실행됨!
델리게이트 체인으로 여러 개의 반응을 쉽게 추가할 수 있음!
델리게이트를 잘 쓰면?
이벤트 기반 프로그래밍이 쉬워짐! (버튼 클릭, 점프 이벤트 등)
코드가 더 유연해짐! (메서드를 따로 추가할 필요 없이, 델리게이트로 쉽게 연결 가능)
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 |