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

+ Recent posts