본문 바로가기

C#

[C#] delegate vs Action

C#에서 delegate, event, 그리고 event Action은 모두 콜백(callback)이나 이벤트 시스템을 구성하기 위한 기능입니다. 이들은 기능적으로 겹치지만 사용 방식과 의도가 조금씩 다릅니다.


✅ 1. delegate와 event 기본 개념

delegate (델리게이트)

  • 메서드를 변수처럼 저장하고 실행할 수 있게 해주는 형식(Type)
  • 여러 메서드를 체인처럼 연결할 수 있음 (Multicast delegate)

예:

public delegate void MyDelegate();  // 델리게이트 타입 선언

MyDelegate callback;               // 변수처럼 사용
callback += SomeMethod;
callback();

 

event

  • 델리게이트에 접근 제한을 추가한 특수한 멤버
  • 외부에서 +=, -=는 가능하지만 =, Invoke()는 불가
    캡슐화를 보장하기 위한 용도

예:

public class MyClass
{
    public delegate void MyEventDelegate();
    public event MyEventDelegate OnSomethingHappened;

    public void DoSomething()
    {
        OnSomethingHappened?.Invoke();
    }
}

 

✅ 2. event Action은 뭘까?

Action은 .NET에서 제공하는 미리 정의된 델리게이트

  • delegate void Action();
  • Action<int, string> → void 반환, 인자 2개
  • Func<T>도 있음 → 리턴값 있음

그래서 직접 delegate를 만들지 않고 바로 event Action을 쓰면 간결함

예:

public event Action OnClicked;
public event Action<int> OnScoreChanged;

 

 

✅ 추천 사용 기준

  • 간단한 이벤트 / 파라미터가 일반적인 경우 → event Action
  • 특정한 시그니처가 필요한 경우 → delegate + event
  • 프레임워크에서 delegate 타입을 명시해야 할 때 → delegate 별도 정의

 

✅ 1. 특정한 시그니처가 필요한 경우

(1) 리턴값이 필요하거나 void가 아닌 경우

  • Action은 반환값이 없는 메서드만 허용 (void)
  • Func<>은 반환값은 있지만 17개 이상의 인자는 못 받음
  • 하지만 내가 원하는 복잡한 시그니처는 맞지 않을 수 있음

예:

// 예시: 상태 머신에서 다음 상태를 결정하는 함수
public delegate State StateTransition(State current, EventData data);

public StateTransition OnStateChange;

→ 위처럼 입력값 2개, 출력값 1개인 커스텀 구조는 Func<State, EventData, State>로도 가능하지만, 명시적으로 의미를 줄 때는 delegate가 더 적합합니다.

 

(2) ref, out 매개변수가 필요한 경우

  • Action, Func은 ref, out 매개변수 지원 안 함
  • 이런 경우에는 직접 delegate를 선언해야 함
public delegate void DataParser(ref int offset, out string value);

 

(3) 의미 있는 이름이 필요한 경우

  • API를 설계할 때 Action<T>보단 의미 있는 delegate 이름이 좋을 수 있음

예:

public delegate void OnDamageReceived(float damage, GameObject attacker);
// 보다 명확하게 역할을 설명

 

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

[C#] 구조체를 쓰는 이유  (1) 2025.08.10
[C#] Boxing과 UnBoxing  (3) 2025.07.25
[C#] Garbage Collector  (2) 2025.07.25
[C#] LINQ와 Lazy Evaluation(지연 평가)  (2) 2025.07.25
[C#] IEnumerable을 쓰는 이유  (2) 2025.07.24