반응형
해당 포스팅은 개인적으로 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를 이해하고 적절히 사용하면,

다양한 프로그래밍 시나리오에서 유용하게 활용할 수 있을 것이다.

 

 

 

 

 

 

 

 

반응형

+ Recent posts