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 |