본문 바로가기

🎯 C# 델리게이트와 이벤트 차이 - Action vs event Action

@코야딩구2025. 8. 14. 09:56

1. 개요

- C#에서 델리게이트와 이벤트는 둘 다 메서드를 참조하고 호출할 수 있는 기능을 제공하지만, 접근 제어 범위호출 권한에서 중요한 차이가 있다.
- 특히 public Action과 public event Action은 겉보기엔 비슷하지만, 외부에서 호출 가능 여부캡슐화 수준에서 큰 차이를 만든다.

2. public Action

- Action은 반환 값이 없고 매개변수가 없는 메서드를 참조하는 델리게이트 타입이다.
- public으로 선언하면 외부 코드에서도 해당 델리게이트에 구독, 해제, 호출까지 모두 가능하다.

//Test1 클래스
public Action addItem;

void Test()
{
    addItem?.Invoke(); // 내부 호출
}

// Test2 클래스
someClass.addItem += MyMethod; // 구독
someClass.addItem();           // 직접 호출 가능 (의도치 않은 실행 위험)

특징

- 자유도가 높아 테스트, 디버그, 임시 기능 구현에 편리하다.

- 하지만 외부에서 임의로 호출이 가능하므로, 의도하지 않은 로직 실행 위험이 있다.

3. public event Action

- event 키워드를 붙이면 외부에서 호출이 불가능하고, 오직 해당 클래스 내부에서만 호출할 수 있다.
- 외부에서는 구독(+=)해제(-=) 만 가능하다.

// 클래스 1
public event Action addItem;

void Test()
{
    addItem?.Invoke(); // 내부 호출만 가능
}
// 클래스 2
someClass.addItem += MyMethod; // ✅ 구독 가능
someClass.addItem();           // ❌ 호출 불가 (컴파일 에러)

특징

- 이벤트 발생 주도권을 해당 클래스가 가진다.

- 잘못된 외부 호출을 방지해 안전성을 높인다.

- 팀 프로젝트나 라이브러리 개발 시 기본적으로 event를 쓰는 것이 좋다.

4. 델리게이트 교체 위험

- 델리게이트와 이벤트는 둘 다 힙(Heap)에 저장되는 멀티캐스트 델리게이트 객체를 참조한다. 하지만 외부 접근 범위가 다르기 때문에 관리 방식에도 차이가 생긴다.

// public Action
someClass.addItem = null;  // ❌ 모든 구독자 날아감
someClass.addItem();       // NullReferenceException 발생

// public event Action
someClass.addItem = null;  // ❌ 컴파일 에러 (외부에서 교체 불가)

- 즉, event는 같은 Delegate 구조를 쓰지만 외부 제어를 막아 "안전한 래퍼" 역할을 한다.

5. 정리

- public Action은 외부 호출 + 참조 교체까지 가능 → 자유롭지만 위험

- public event Action은 외부 호출/교체 불가 → 안전하고 캡슐화에 유리

- 원칙: 외부 호출이 필요 없다면 기본적으로 event를 사용한다.

- 예외: 테스트, 툴, 임시 디버그 상황에서는 Action을 사용할 수 있다.

목차