728x90
반응형
C#에서 이벤트 처리와 콜백 구조의 핵심은 delegate와 event입니다.
이번 글에서는 두 개념의 차이, 사용 방법, 실전 응용 예제까지 하나씩 정리해보겠습니다.
1. delegate란?
메서드를 변수처럼 전달하거나 보관할 수 있는 참조 타입 (함수 포인터 역할)
선언과 사용 예시
public delegate void MyDelegate(string message);
void SayHello(string msg)
{
Console.WriteLine("Hello: " + msg);
}
// 사용
MyDelegate d = SayHello;
d("World"); // 출력: Hello: World
2. event란?
delegate를 기반으로 한 이벤트 처리 전용 문법
외부에서 직접 호출은 불가능하고, +=, -=로 구독/해지만 가능
선언과 사용 예시
public class Button
{
public delegate void ClickHandler(string msg);
public event ClickHandler OnClick;
public void Click()
{
OnClick?.Invoke("Button clicked!");
}
}
// 사용
Button btn = new Button();
btn.OnClick += msg => Console.WriteLine(msg);
btn.Click(); // 출력: Button clicked!
3. delegate vs event 비교
항목 delegate event
외부 호출 | 가능 (d()) | 불가능 (OnClick()) |
용도 | 콜백, 전략 패턴 | UI 이벤트, 신호 전달 |
멀티 핸들러 지원 | 가능 | 가능 |
대표 사용처 | 내부 구조 | 외부 노출용 인터페이스 |
4. 멀티캐스트 delegate
하나의 delegate에 여러 메서드를 동시에 등록할 수 있습니다.
void A(string msg) => Console.WriteLine("A: " + msg);
void B(string msg) => Console.WriteLine("B: " + msg);
MyDelegate d = A;
d += B;
d("Test");
// 출력
// A: Test
// B: Test
5. 실전 예제: 사용자 정의 버튼 클래스
class CustomButton
{
public event Action OnPressed;
public void Press()
{
Console.WriteLine("[버튼 눌림]");
OnPressed?.Invoke();
}
}
class Program
{
static void Main()
{
CustomButton btn = new CustomButton();
btn.OnPressed += () => Console.WriteLine("1번 동작 실행");
btn.OnPressed += () => Console.WriteLine("2번 동작 실행");
btn.Press();
}
}
출력:
[버튼 눌림]
1번 동작 실행
2번 동작 실행
요약
- delegate: 메서드를 변수처럼 담는 함수 포인터
- event: delegate를 외부 노출 없이 이벤트 처리 전용으로 만든 구조
- UI 이벤트 처리, 콜백 등록, 비동기 구조 등에서 널리 사용됨
728x90
반응형
'개발이야기' 카테고리의 다른 글
C# 언어 심화 3편 – 익명 타입과 dynamic 활용법 (8) | 2025.04.25 |
---|---|
C# 언어 심화 2편 – 람다식(Lambda)과 LINQ 고급 활용 (10) | 2025.04.25 |
자료구조 시리즈 11편 (6) | 2025.04.23 |
자료구조 시리즈 10편 (2) | 2025.04.22 |
자료구조 시리즈 9편 (0) | 2025.04.22 |