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
반응형