DevDino

[Unity 기술면접] C# 델리게이트(Delegate)와 이벤트(Event)의 차이점 본문

Unity/기술면접

[Unity 기술면접] C# 델리게이트(Delegate)와 이벤트(Event)의 차이점

데브다이노 2026. 1. 15. 08:32

"C#에서 이벤트와 델리게이트의 차이는 무엇인가요?"

C# 델리게이트(Delegate)와 이벤트(Event)의 차이점

 

델리게이트(delegate)

델리게이트는 함수 포인터 또는 메서드 참조를 저장할 수 있는 타입입니다. 즉, 메서드 자체를 변수처럼 취급하여 저장하고 나중에 호출할 수 있도록 해줍니다.

public delegate void MyDelegate(string message);

 

특징

- 타입 안정성: 매개변수 타입과 반환 타입이 선언된 시그니처와 일치해야만 할당이 가능합니다.

 

- 런타임 유연성: 참조를 저장하기 때문에 런타임에 동적으로 메서드를 호출하거나 콜백(Callback)으로 전달할 수 있습니다.

 

- 멀티캐스트(Multicast): += 연산자를 통해 메서드를 하나의 delegate 인스턴스에 체인처럼 연결해 연속으로 호출할 수 있습니다.

 

- 최근에는 직접 델리게이트 타입을 선언하기보다, 제네릭으로 제공되는 System.Action(반환값이 없을 때)과 System.Func(반환값이 있을 때)를 주로 사용합니다.

 

사용하면 좋은 경우
콜백을 구현하거나, 런타임에 실행 흐름을 유연하게 교체하고 싶을 때 사용합니다.

 

이벤트(Event)

이벤트는 델리게이트 기반으로 만들어진 안전하고 캡슐화알림 매커니즘입니다.
특정 사건이 발생했을 때 이를 구독(Subscribe)한 객체들에게 신호를 보냅니다.

public event MyDelegate OnSomethingHappened;

 

특징
- 호출(Invoke) 권한의 캡슐화: delegatepublic으로 선언될 경우 외부 클래스에서 마음대로 호출해버릴 수 있는 위험이 있습니다. 반면 event 키워드를 붙이면, 해당 이벤트가 선언된 클래스 내부에서만 호출이 가능합니다.


- 구독/구독 해제만 허용: 외부 클래스에서 오직 +=(구독)와 -=(구독 해제) 연산만 접근할 수 있습니다.

 

사용하면 좋은 경우

객체 간 결합도(Coupling)를 낮추고 싶을 때
(예: 플레이어 캐릭터의 레벨이 올랐을 때, UI 매니저나 도감 시스템이 플레이어 스크립트를 직접 참조하지 않고 이벤트만 구독하여 각자의 UI를 갱신하도록 구성)

 

주의점: 메모리 누수(Memory Leak)

이벤트나 델리게이트를 사용할 때 가장 주의해야 할 점은 구독 해제입니다. 수명이 긴 싱글턴 매니저의 이벤트를 특정 UI 컴포넌트가 구독한 상태에서 UI 객체가 파괴(Destroy)될 경우, 델리게이트 내부에는 파괴된 객체의 메서드 참조가 그대로 남아있게 됩니다.
따라서 객체가 사라질 때 OnDisable이나 OnDestroy 생명주기에서 반드시 -= 연산자를 통해 구독을 해제해주어야 메모리 누수와 런타임 에러(NullReferenceException)를 방지할 수 있습니다.

 

요약
delegate는 메서드를 변수처럼 담아 런타임 유연성을 제공하는 기능이고, event는 delegate에 캡슐화와 접근 제어(안전성)를 더해 알림 메커니즘으로 쓰게 만든 구조입니다. 이를 통해 게임 내 다양한 시스템 간의 의존성을 줄이고 안전한 구조를 설계할 수 있습니다.

참고
Microsoft - 대리자 및 이벤트 구별