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 |