해당 포스팅은 개인적으로 C# WPF를 공부하면서 익힌 내용을 기억에 남기기 위한 작업의 일환으로 작성된 글로서
일부 내용에 오류가 있을 수도 있으니 참고하시기 바랍니다.
오늘은 두번째 포스팅으로서
C#WPF 프로그래밍에서 많이 사용되는
event의 개념과 사용 방법에 대해 살펴보고
delegate와의 차이점은
무엇인지 알아보자.
내용 요약
C#에서 delegate와 event는 모두 메서드 참조를 캡슐화하고,
특정 조건에서 메서드를 호출하는 데 사용됩니다.
그러나 이 둘은 사용 목적과 동작 방식에서 중요한 차이점을 가지고 있습니다.
이 글에서는 delegate와 event의 정의, 사용 방법,
그리고 이 둘의 차이점에 대해 자세히 설명하겠습니다.
개념 정의(event)
1. Event의 정의
event는 특정 작업이 발생했을 때 실행되는 메서드를 나타내는 형식이다.
event는 주로 이벤트 기반 프로그래밍에서 사용되며,
이벤트 발생 시 여러 메서드를 호출할 수 있다.
event는 delegate를 기반으로 하며, delegate를 통해 이벤트 처리기를 등록하고 호출한다.
event는 다음과 같이 정의할 수 있다.
public class Button
{
public delegate void ClickEventHandler(object sender, EventArgs e);
public event ClickEventHandler Click;
public void OnClick()
{
if (Click != null)
{
Click(this, EventArgs.Empty);
}
}
}
위 정의에서 ClickEventHandler는 이벤트를 처리하는 delegate입니다.
Click은 ClickEventHandler 형식의 event로,
버튼이 클릭되었을 때 호출된다.
2. event 사용
event를 사용하여 이벤트 처리기를 등록하고 호출하는 방법은 다음과 같다.
using System;
public class Program
{
public static void Button_Click(object sender, EventArgs e)
{
Console.WriteLine("Button clicked!");
}
public static void Main()
{
Button button = new Button();
button.Click += Button_Click;
button.OnClick();
}
}
위 예제에서 Button_Click 메서드는 이벤트 처리기로,
버튼이 클릭되었을 때 호출된다.
button.Click += Button_Click을 통해 Button_Click 메서드를 Click 이벤트에 등록하고
button.OnClick()을 호출하면 Click 이벤트가 발생하며,
등록된 모든 이벤트 처리기가 호출된다.
3.event와 delegate의 차이점
delegate와 event는 메서드 참조를 캡슐화하고 호출하는 데 사용되지만,
몇 가지 중요한 차이점이 있다.
- 첫번째, 접근제한
delegate는 클래스 외부에서 직접 호출할 수 있다.
이는 delegate가 메서드 참조를 캡슐화하는 단순한 형식이기 때문이다.
반면, event는 클래스 외부에서 직접 호출할 수 없으며,
이벤트를 발생시키는 메서드를 통해서만 호출할 수 있다.
이는 이벤트의 무결성을 보장하고, 이벤트가 의도치 않게 호출되는 것을 방지하기 위함이다.
public class Program
{
public delegate void MyDelegate();
public event MyDelegate MyEvent;
public void RaiseEvent()
{
if (MyEvent != null)
{
MyEvent();
}
}
public static void Main()
{
Program program = new Program();
// Delegate는 외부에서 직접 호출 가능
MyDelegate del = program.RaiseEvent;
del();
// Event는 외부에서 직접 호출 불가
// program.MyEvent(); // 컴파일 오류 발생
}
}
위 예제에서 del은 RaiseEvent 메서드를 참조하는 delegate로,
외부에서 직접 호출할 수 있다.
반면, MyEvent는 외부에서 직접 호출할 수 없으며,
RaiseEvent 메서드를 통해서만 호출할 수 있다.
- 두번째, 이벤트 처리기 등록 및 해제
delegate는 메서드를 참조하는 단순한 형식으로,
+=와 -= 연산자를 사용하여 메서드를 추가하거나 제거할 수 있다.
event도 +=와 -= 연산자를 사용하여 이벤트 처리기를 등록하거나 해제할 수 있지만,
이벤트 처리기를 직접 호출할 수는 없다.
public class Program
{
public delegate void MyDelegate();
public event MyDelegate MyEvent;
public static void Handler()
{
Console.WriteLine("Event handled");
}
public static void Main()
{
Program program = new Program();
// Delegate에 메서드 추가 및 제거
MyDelegate del = Handler;
del += Handler;
del -= Handler;
// Event에 이벤트 처리기 등록 및 해제
program.MyEvent += Handler;
program.MyEvent -= Handler;
}
}
위 예제에서 del은 Handler 메서드를 참조하는 delegate로,
+=와 -= 연산자를 사용하여 메서드를 추가하거나 제거할 수 있다.
MyEvent는 Handler 메서드를 이벤트 처리기로 등록하거나 해제할 수 있다.
- 세번째, 이벤트의 캡슐화
event는 이벤트의 캡슐화를 보장한다.
이는 이벤트가 클래스 외부에서 직접 호출되지 않도록 하여,
이벤트의 무결성을 유지해 준다.
반면, delegate는 클래스 외부에서 직접 호출될 수 있어, 이벤트의 무결성을 보장하지 않는다.
public class Program
{
public delegate void MyDelegate();
public event MyDelegate MyEvent;
public void RaiseEvent()
{
if (MyEvent != null)
{
MyEvent();
}
}
public static void Main()
{
Program program = new Program();
// Delegate는 외부에서 직접 호출 가능
MyDelegate del = program.RaiseEvent;
del();
// Event는 외부에서 직접 호출 불가
// program.MyEvent(); // 컴파일 오류 발생
}
}
위 예제에서 del은 RaiseEvent 메서드를 참조하는 delegate로,
외부에서 직접 호출할 수 있다.
반면, MyEvent는 외부에서 직접 호출할 수 없으며,
RaiseEvent 메서드를 통해서만 호출할 수 있다.
- 네번째, 이벤트의 멀티캐스트
delegate는 여러 메서드를 참조할 수 있는 멀티캐스트 기능을 제공한다.
event도 멀티캐스트 기능을 제공하며, 여러 이벤트 처리기를 등록할 수 있다.
이는 += 연산자를 사용하여 여러 메서드를 delegate나 event에 추가할 수 있기 때문이다.
public class Program
{
public delegate void MyDelegate();
public event MyDelegate MyEvent;
public static void Handler1()
{
Console.WriteLine("Handler1");
}
public static void Handler2()
{
Console.WriteLine("Handler2");
}
public static void Main()
{
Program program = new Program();
// Delegate에 여러 메서드 추가
MyDelegate del = Handler1;
del += Handler2;
del();
// Event에 여러 이벤트 처리기 등록
program.MyEvent += Handler1;
program.MyEvent += Handler2;
program.RaiseEvent();
}
}
위 예제에서 del은 Handler1과 Handler2를 모두 참조하는 delegate로,
호출 시 두 메서드가 순차적으로 실행된다.
MyEvent는 Handler1과 Handler2를 모두 참조하는 이벤트로,
RaiseEvent 메서드를 통해 호출 시 두 이벤트 처리기가 순차적으로 실행된다.
정리하면... (delegate, event)
C#에서 delegate와 event는 메서드 참조를 캡슐화하고 호출하는 데 사용된다는
공통점을 가지고 있지만, 몇 가지 중요한 차이점이 있다.
delegate는 메서드 참조를 나타내는 단순한 형식으로,
클래스 외부에서 직접 호출할 수 있다.
반면, event는 특정 작업이 발생했을 때 실행되는 메서드를 나타내는 형식으로,
클래스 외부에서 직접 호출할 수 없으며,
이벤트를 발생시키는 메서드를 통해서만 호출할 수 있다.
event는 이벤트의 무결성을 보장하고, 이벤트가 의도치 않게 호출되는 것을 방지한다.
delegate와 event를 이해하고 적절히 사용하면,
다양한 프로그래밍 시나리오에서 유용하게 활용할 수 있을 것이다.
'프로그래밍 > C# (WPF)' 카테고리의 다른 글
C# WPF에서 MVVM패턴을 사용할 때 Thread의 개념에 대해 (0) | 2024.11.21 |
---|---|
C# WPF에서 MVVM 패턴에 대하여 (3) | 2024.11.15 |
C# WPF에서 delegate와 event에 대하여 - 1/2 (3) | 2024.11.13 |
C# WPF에서 Grid내에 Row/Column을 자동 Align하는 방법에 대하여 (7) | 2024.11.11 |
C# WPF에서 터널링(Tunneling)과 버블링(Bubbling) 이벤트에 대하여 (0) | 2024.11.08 |