C#
C# 비동기 프로그래밍 : Action / event 차이
우준세
2025. 7. 29. 08:34
728x90
반응형

프로젝트를 진행하거나 레거시 코드를 보다 보면
Action과 event 키워드를 많이 사용하는 것을 볼 수 있습니다.
이번 포스팅은 Action과 event의 개념적 차이와 예시를 통해 정리하겠습니다.
| 기본 개념 이해
기본적으로 Action과 event는 모두 메서드의 실행을 전달하는 역할입니다.
하지만 구조와 사용 방식에 차이가 있습니다.
✅ Action이란?
Action은 C#에서 제공하는 내장 델리게이트(Delegate) 타입입니다.
메서드를 참조하여 실행할 수 있는 포인터 역할을 하며, 반환값이 없는 메서드(=void 메서드)를 참조합니다.
public delegate void Action<in T>(T obj); // 기본 정의 (System.Action)
- Action은 최대 16개의 매개변수를 받을 수 있으며, 반환형은 항상 void
- 메서드를 변수처럼 다룰 수 있어, 콜백 함수나 전략 패턴, 비동기 실행, 간단한 이벤트 처리 등에 사용
예시) 계산기 로직 전달
class Calculator
{
public void Operate(int a, int b, Action<int, int> operation)
{
operation(a, b);
}
}
class Program
{
static void Main()
{
Calculator calc = new Calculator();
// 덧셈 로직 전달
calc.Operate(10, 5, (x, y) => Console.WriteLine("Add: " + (x + y)));
// 곱셈 로직 전달
calc.Operate(10, 5, (x, y) => Console.WriteLine("Multiply: " + (x * y)));
}
}
// 결과
Add: 15
Multiply: 50
Action은 인자로 로직을 전달할 수 있어 유연한 설계에 좋습니다.
✅ event란?
event는 C#에서 델리게이트를 캡슐화한 이벤트 처리 메커니즘입니다.
주로 클래스 간의 메시지 전달이나 UI 이벤트에 사용됩니다.
public event EventHandler eventCall;
- 이벤트는 +=, -= 연산자로만 외부에서 구독/제거가 가능합니다.
- 이벤트를 직접 호출할 수 있는 권한은 선언한 클래스 내부에만 있습니다.
제가 프로젝트에서 UI를 다룰 때 자주 사용하는 방법입니다ㅎㅎ
예시) 알람 발생 로직
class Alarm
{
public event Action OnAlarmTriggered;
public void Trigger()
{
Console.WriteLine("Alarm triggered!");
OnAlarmTriggered?.Invoke(); // null 체크 후 실행
}
}
class Program
{
static void Main()
{
Alarm alarm = new Alarm();
alarm.OnAlarmTriggered += () => Console.WriteLine("Handler 1: Wake up!");
alarm.OnAlarmTriggered += () => Console.WriteLine("Handler 2: Call the police!");
alarm.Trigger();
}
}
// 결과
Alarm triggered!
Handler 1: Wake up!
Handler 2: Call the police!
| Action vs event 차이점
| 항목 | Action | Event |
| 정의 | 메서드를 참조할 수 있는 delegate 객체 | delegate를 캡슐화한 알림 시스템 |
| 선언 방법 | Action handler; | event Action handler; |
| 접근 제한 | 내부/외부 모두 참조, 호출 가능 | 외부에서는 +=, -=만 가능 (호출 불가) |
| 사용 목적 | 함수 전달, 전략 패턴, 람다 등 | 이벤트 알림, UI 이벤트 처리 |
| 호출 권한 | 누구나 호출 가능 | 선언한 클래스 내부만 호출 가능 |
| 캡슐화 | 없음 | 있음 (보안성, 제어권 부여) |
| Action의 장단점
장점
- 코드가 간결하고 직관적이다.
- 람다식, 익명 함수 등과 결합해 사용하기 좋다.
- 전략 패턴, 콜백 처리 등 다양한 설계 패턴에 응용 가능하다.
단점
- 외부에서 자유롭게 호출이 가능하므로, 의도치 않은 실행을 막기 어렵다.
- 관리 포인트가 많아지면 디버깅이 어려워질 수 있다.
- 이벤트 시나리오에서는 적합하지 않을 수 있음 (캡슐화 부족).
| Event의 장단점
장점
- 캡슐화로 인해 안전하고 유지보수성이 높다.
- 다수의 구독자를 자연스럽게 관리할 수 있다.
- 클래스 간의 의존성 없이 메시지를 전달할 수 있다.
단점
- 선언 및 사용이 Action에 비해 약간 복잡하다.
- 구독자에게 전달할 수 있는 정보가 한정적일 수 있다 (예: EventArgs로 우회 필요).
- 람다나 커스텀 로직을 전달하기에는 불편함이 있다.
| 결론: 언제 무엇을 쓸까?
- Action :
- 전략을 유연하게 바꾸고 싶을 때
- 콜백 함수, 람다식, 동적 실행이 필요할 때
- 내부 또는 제한된 영역에서만 사용하는 기능일 때
- event
- 클래스 외부에 알림을 보내야 할 때
- 라이브러리 또는 UI 프레임워크에서 사용자 정의 이벤트를 설계할 때
- 일반적으로 라이브러리 내부에서는 Action, 외부 노출이나 알림이 필요한 경우에는 Event를 사용하는 것이 좋습니다.
| 마무리
C#에서 자주 사용하는 Action과 event 키워드를 정리했습니다.
비동기 프로그래밍에서 자주 사용하는 방법이니 이번 기회에 잘 익히면 좋을 것 같네요!
틀린 점이나 질문이 있으시면 댓글을 남겨주세요!
다음 포스팅으로 찾아오겠습니다. 감사합니다 :)
728x90
반응형