본문 바로가기

C#

Delegate와 Event

728x90

Delegate

델리게이트는 메소드에 대한 참조입니다. 즉, 델리게이트는 하나의 형식(type)입니다.

델리게이트는 인스턴스 메소드, 정적메소드 모두 참조가능합니다.

프로그래밍을 할 때 매개변수에 값을 넘겨 쓸모있는 메소드를 만들었습니다. 델리게이트는 값이 아닌 '코드' 자체를 넘기고 싶을 때 사용할 수 있습니다.

한정자 delegate 반환형식 델리게이트이름(매개변수_목록);

 

델리게이트 체인(Delegate Chain), 익명메소드(Anonymous Method)

델리게이트 하나가 여러개의 메소드를 동시에 참조할 수 있습니다. 체인처럼 델리게이트를 연달아 등록하여, 순서대로 참조된 함수들을 호출합니다.

델리게이트를 등록할 때는 += 연산자 또는 Delegate.Combine() 메소드를 이용할 수 있고,

체인을 끊고 싶을 때는 -= 연산자 또는 Delegate.Remove() 메소드를 이용하면 됩니다.

 

익명메소드는 델리게이트가 참조할 메소드가 필요한데, 이 메소드가 다시 사용할 일이 없다고 판단될 때 이름이 없는 메소드를 참조하면 됩니다.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace CsharpStudy
{
    class Program
    {
        delegate void DelegateChains();
   
        static void Print1()
        {
            Console.WriteLine("Welcome");
        }
        static void Print2()
        {
            Console.WriteLine("To");
        }
        static void Print3()
        {
            Console.WriteLine("C#");
        }
 
        static void Main(string[] args)
        {
            Console.WriteLine("==체인 연결==");
            DelegateChains chaincall = new DelegateChains(Print1);
            chaincall += Print2;
            chaincall += Print3;
            chaincall();
 
            Console.WriteLine("== 체인 끊기 ==");
            chaincall -= Print1;
            chaincall -= Print3;
            chaincall+=
                delegate()
                {
                    Console.WriteLine("Anonymous Method call");
                };
            chaincall();
        }
    }
}

 

Event

프로그래밍을 할 때 보통 순차적으로 진행되고는 했습니다. 하지만 어떤 일이 생겼을 때 이를 알려주는 객체가 필요할 때가 있습니다. 이 객체를 만들 때 사용하는 것이 이벤트입니다.

이벤트는 어떤 일이 일어났을 때, 그 때 실행되는 코드입니다.

이벤트기반 프로그래밍은 마우스를 움직이고, 클릭하고, 키보드를 입력하는 등 사용자가 명령하는 것에 대해서 프로그래밍이 그에 맞는 반응을 하는 것처럼 이벤트 기반으로 만들어진 프로그래밍 방식입니다.

 

이벤트 처리기에 등록하지 않아도 컴파일 에러가 발생하지 않습니다. 따라서 이벤트를 만들었을 때 초기화를 하지 않으면, 이벤트가 발생해도 아무런 일이 일어나지 않은 것처럼 나오기 때문에 항상 초기화하는 습관을 갖는 것이 좋을 듯 합니다.

 

+

이벤트는 델리게이트에 event를 수식해서 선언한 것에 불과합니다. 하지만 이벤트가 델리게이트와 가장 큰 차이점은 이벤트는 외부에서 직접 사용할 수 없다는 데 있습니다. 이벤트는 public 한정자로 선언되어 있어도 자신이 선언되어 있는 클래스 외부에서는 호출이 불가능합니다. 이는 이벤트 기반 프로그래밍을 할 때 안정성을 추구할 수 있게 합니다.

예를 들어 네트워크 상태변화에 대한 사건을 알리는 클래스를 만들었다고 하면, 클래스 내부에서 객체를 감시하며 네트워크 상태를 체크하지만, 클래스 외부에서 네트워크 상태 변화 이벤트를 줄 수 있다면, 이미 네트워크 상태는 신뢰할 수 없게 됩니다.

따라서, 델리게이트는 콜백 용도로 사용하고, 이벤트는 객체 상태 변화나 사건의 발생을 알리는 용도로 사용해야 합니다.

 

[출처]

https://nshj.tistory.com/entry/C-%EA%B8%B0%EC%B4%88%EB%AC%B8%EB%B2%95-8-%EB%8D%B8%EB%A6%AC%EA%B2%8C%EC%9D%B4%ED%8A%B8delegate%EC%99%80-%EC%9D%B4%EB%B2%A4%ED%8A%B8-Event

728x90

'C#' 카테고리의 다른 글

마샬링(Marshalling) vs 직렬화(Serialization)  (1) 2023.11.04
마샬링(Marshalling)  (0) 2023.11.04
AutoMapper란?  (0) 2023.11.03
LiteDB  (0) 2023.01.31
싱글톤 패턴(Singleton Pattern)  (0) 2023.01.30