본문 바로가기

SW 개발 공부/C#

[C#] delegate 활용(Callback과 Event)

callback과 event 모두 delegate를 사용하여 선언되고, 특정 사건이 일어난 이후에 연결된 메서드가 실행된다는 공통점이 있다. 둘의 차이점은 무엇인가?

 

1. Callback

1) 정의

 

- 특정 작업이 완료된 이후 호출되는 메서드

- 델리게이트를 사용하여 콜백 메서드를 참조하고, 작업 완료시 이를 호출함.

 

2) 구현 방식

 

- 델리게이트 선언: 콜백 메서드의 시그니처를 정의함.

- 콜백 메서드 등록 : 델리게이트를 매개변수로 받아 등록

- 콜백 호출: 작업 완료시 델리게이트를 호출

 

3)예제

using System;
using System.Threading;

public class Timer
{
    public delegate void TimerCompleteCallback();

    private TimerCompleteCallback _callback;

    public void SetCallback(TimerCompleteCallback callback)
    {
        _callback = callback;
    }

    public void Start(int seconds)
    {
        for (int i = 0; i < seconds; i++)
        {
            Console.WriteLine($"Time: {i + 1} seconds");
            Thread.Sleep(1000);
        }

        // 타이머 종료 시 콜백 호출
        _callback?.Invoke();
    }
}

public class Program
{
    public static void Main()
    {
        Timer timer = new Timer();

        // 콜백 메서드 등록
        timer.SetCallback(() => Console.WriteLine("Timer complete!"));

        // 타이머 시작
        timer.Start(5);
    }
}

 

4) 특징

- 직접적인 호출 : 발행자가 구독자를 직접 호출함

 

 

2. Event

1) 정의

- 이벤트는 특정 사건이 발생했을 때 이를 알리는 메커니믖

- 델리게이트를 기반으로하며, 여러 이벤트 핸들러를 등록 가능

 

2) 구현 방식

- 델리게이트 선언: 이벤트 핸들러 메서드의 시그니처를 정의

- 이벤트 선언: event 키워드와 선언한 델리게이트 시그니처를 사용해 이벤트 정의

- 이벤트 핸들러 등록: 구독자측에서 발행자의 객체를 선언한 이후, 발행자의 이벤트에 이벤트 핸들러를 구독

- 이벤트 발생: 이벤트를 호출하여 등록된 이벤트 핸들러를 호출 

 

3) 예제

 

using System;

// 델리게이트 선언 (이벤트 핸들러의 시그니처 정의)
public delegate void ButtonClickEventHandler(object sender, EventArgs e);

public class Button
{
    // 이벤트 선언
    public event ButtonClickEventHandler Click;

    // 이벤트를 발생시키는 메서드
    public void OnClick()
    {
        Click?.Invoke(this, EventArgs.Empty);
    }
}

public class Program
{
    public static void Main()
    {
        Button btn = new Button();

        // 이벤트 핸들러 등록
        btn.Click += (sender, e) => Console.WriteLine("Button clicked!");

        // 이벤트 발생
        btn.OnClick();
    }
}

 

4) 특징

- 사건 기반 프로그래밍: 특정 사건이 발생했을 떄 사용됨.

 

3. Callback과 Event의 차이점

 

비교 항목 Callback (Delegate) Event (event)
선언 방식 DelegateType delegateName event DelegateType eventName
다중 핸들러 등록 += 사용가능 += 사용 가능
외부에서 직접 호출 가능 여부 가능 불가능
외부에서 덮어쓰기 가능 여부 가능(위험함) 불가능(안전함)
사용 목적 콜백 또는 이벤트 역할 가능 이벤트 전용

 

* event 키워드를 사용하지 않고도 다중 핸들러를 등록하여 이벤트 처럼 사용이 가능하다.

하지만, delegate로 event처럼 사용한다면 외부에서 수정할 수 있기때문에 위험하다. 따라서 event역할로 사용하기 위해선 event 키워드를 사용하여 event를 선언하는 것이 안전하다.

'SW 개발 공부 > C#' 카테고리의 다른 글

[C#/기초 문법] 구조체, 클래스  (1) 2025.02.06
[C#/기초 문법] namespace  (0) 2025.02.06
[C#] delegate  (0) 2025.01.31
[C#] 배열을 Sort 하는 방법 OrderBy  (0) 2025.01.17
[C#] throw new exception  (0) 2025.01.17