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을 사용할 수 있다.
'Programming > C#' 카테고리의 다른 글
| C# 콘솔에서 세이브/로드 시 참조가 깨지는 문제 (with Guid) (3) | 2025.07.18 |
|---|---|
| C# 미니 프로젝트 - TextRPG (1) | 2025.07.11 |
| C# 콘솔에서 멀티 스레드로 키 입력 처리하기 (2) | 2025.07.10 |
| C# static 함수의 구조와 그 의미 (2) | 2025.07.09 |
| C# object: 참조 타입의 뿌리 (1) | 2025.07.07 |
