1. 델리게이트 ( Delegate )


델리게이트는 메서드를 참조하여 대신 일을 하는 대리자라 할수 있습니다.

메서드를 참조한다는 것은 매개변수 대신 메서드를 매개변수로 사용할수 있다는 말입니다.

개별적으로 사용도 가능하고 복수의 메서드들을 사용할수도 있습니다.

사용시 주의해야 될점은 델리게이트와 참조하여 사용하는 메서드들의 구성형식(반환타입, 매개변수...)이 같아야

한다는 것입니다.


서식형식

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

소스코드

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Function()
        {
            Console.WriteLine("Function Call!");
        }
        static void Function2()
        {
            Console.WriteLine("Function2 Call!");
        }
        static void Function3()
        {
            Console.WriteLine("Function3 Call!");
        }
        //일을 대신할 델리게이트 참조자를 선언
        delegate void Work();

        static void Main(string[] args)
        {
            //델리게이트 인스턴스 생성(단일 목적으로 사용)
            Work w1 = new Work(Function);
            w1();

            //기존의 참조된 메서드는 해제되고 새로운 메서드를 참조
            w1 = new Work(Function2);
            w1();

            Console.WriteLine();

            // +, -, +=, -= 연산자로 복수의 참조자를 늘릴수도 줄일수도 있습니다.
            w1 = new Work(Function);
            w1 += new Work(Function2);
            w1 += new Work(Function3);
            w1();

            w1 -= Function2;
            Console.WriteLine();
            w1();
        }
    }
}

결과

Function Call!
Function2 Call!

Function Call!
Function2 Call!
Function3 Call!

Function Call!
Function3 Call!


위와 같이 델리게이트는 연산자를 이용하여 추가할수도 삭제할수도 있습니다.

일종의 메서드배열과 같이 델리게이트를 실행하면 참조되고있는 모든 메서드들을 실행하게 됩니다.

또한 델리게이트를 인스턴스화 하여 객체를 매개변수로 전달할수도 있습니다.




2. 이벤트 ( Event )


이벤트는 컴퓨터에서 특정한 일이 일어나게 되면 발생하는 메세지라 할수 있습니다.

일반적으로 많이 사용하는 windows 운영체제 역시 이 이벤트 기반으로 만들어져 있으며 기능들을 수행하게 됩니다.

특정 시간이되면 알려주는 이벤트라던지 사용자가 주변기기를 사용하여 마우스를 이동, 클릭, 드래그 등...

이벤트와 델리게이트의 차이점은 외부에서 직접적인 접근이 가능하냐 그렇지 못하냐의 차이가 있습니다.


서식 형식

[접근 한정자] event [델리게이트 명];

소스코드

using System;

namespace ConsoleApp1
{
    delegate void EventHandler(int number, string message);

    //방문자 이벤트를 발생할 클래스
    class Visitor
    {
        public event EventHandler EventCall;
        
        public void VisitorCheck(int VisitorNum)
        {
            //방문자가 3의 배수일때마다 이벤트 발생
            if (VisitorNum % 3 == 0)
                EventCall(VisitorNum, "방문자");
        }
    }

    //이벤트를 받아 처리할 
    class Celebration
    {
        public void VisitorEvent(int number, string message)
        {
            if (number == 9)
            {
                Console.WriteLine("---축하합니다---");
                Console.WriteLine("{0}번째 {1}로 이벤트에 당첨 되셨습니다.", number, message);
            }
            else
                Console.WriteLine("방문자 이벤트 발생!");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //이벤트를 받을 객체 인스턴스
            Celebration Cele = new Celebration();

            //이벤트 발생 인스턴스
            Visitor Vis = new Visitor();
            //이벤트가 발생될때 호출될 메서드 추가
            Vis.EventCall += new EventHandler(Cele.VisitorEvent);

            for(int i = 0; i < 10; i++)
            {
                Vis.VisitorCheck(i);
            }
        }
    }
}

결과

방문자 이벤트 발생!
방문자 이벤트 발생!
방문자 이벤트 발생!
---축하합니다---
9번째 방문자로 인벤트에 당첨 되셨습니다.


이러한 이벤트 기반 프로그래밍은 프로그램의 상태변화에 따라 델리게이트를 호출하여 안정적인 데이터 관리와

공정하게 이벤트 상황을 전달할수 있습니다. 외부에서 호출이 가능한 델리게이트는 임의 적으로 호출이 가능하다는 점때문에

프로그램의 상태변화와 상관없이 호출되어 버그를 발생 시킬수 있습니다.


이상으로 델리게이트와 이벤트에 대해서 알아 보았습니다.

수고하셨습니다.

+ Recent posts