C# 대리자 delegate & 이벤트 event

728x90
  • 델리게이트(delegate)

- 대리자(메소드 참조형)

- 메소드의 틀을 만들어 소통

- 클래스간 통신에 활용

- 문법 : delegate 리턴형 식별자(파라미터);

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _116_delegate
{
    delegate int DelegateFunc(int a); 
    class Program
    {
        static int Add(int a)
        {
            Console.WriteLine("Add");
            return a + a;
        }
        static void Main(string[] args)
        {
            DelegateFunc delegateFunc = Add; //delegateFunc(Add) 대리 참조
            Console.WriteLine("delegateFunc : " + delegateFunc(10));
        }
    }
}

 

  • 델리게이트 선언 방법

기본 선언

DelegateTest dt = new DelegateTest(Sum);

- 간략한 선언

DelegateTest dt2 = Sum;

- 익명 함수 선언

DelegateTest dt3 = delegate(int a, int b)
{
	Console.WriteLine("a + b = " (a + b));
};

- 람다식 선언

DelegateTest dt4 = (a, b) =>
{
	Console.WriteLine("a + b = " + (a + b));
};
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _117_delegateDeclare
{
    delegate void DelegateTest(int a, int b);
    class Program
    {      
        static void Sum(int a, int b)
        {
            Console.WriteLine("a + b = " + (a + b));
        }
        static void Main(string[] args)
        {
            // 1 : 기본 선언
            DelegateTest dt = new DelegateTest(Sum);

            // 2 : 간략한 산언
            DelegateTest dt2 = Sum;

            // 3 : 익명 함수 선언
            DelegateTest dt3 = delegate (int a, int b)
            {
                Console.WriteLine("a + b = " + (a + b));
            };

            // 4 : 람다식 선언
            DelegateTest dt4 = (a, b) =>
            {
                Console.WriteLine("a + b = " + (a + b));
            };

            dt(1, 1);
            dt2(2, 2);
            dt3(3, 3);
            dt4(4, 4);

            dt = delegate (int a, int b)  //dt를 새롭게 정의되면 위의 sum과는 별개로 초기화된다
            {
                Console.WriteLine("a - b : " + (a - b));
            };

            dt(2, 1);
        }
    }
}

 

  • 델리게이트 함수 파라미터 활용

- 일반적인 사용

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _118_delegateParam
{
    delegate void delegaterFunc();

    class MessageProcess
    {
        delegaterFunc CallOkFunc;
        delegaterFunc CallCancelFunc;

        public void Message(string msg, delegaterFunc okFunc, delegaterFunc cancelFunc)
        {
            CallOkFunc = okFunc;
            CallCancelFunc = cancelFunc;

            Console.WriteLine("Message : " + msg + " (0 : ok, 1 : cancel)");
            string inputStr = Console.ReadLine();

            if(inputStr.Equals("0"))
            {
                CallOkFunc();
            }
            else
            {
                CallCancelFunc();
            }
        }
    }
    class Program
    {
        static void CallOK()
        {
            Console.WriteLine("CallOK");
        }
        static void CallCancel()
        {
            Console.WriteLine("CallCancel");
        }
        static void Main(string[] args)
        {
            MessageProcess msg = new MessageProcess();
            msg.Message("Test Message", CallOK, CallCancel);
        }
    }
}

 

  • 이벤트(event)

- delegate와의 차이점

  1) 할당 연산자(=)  사용 불가

  2) 클래스 외부 호출 불가

  3) 클래스 멤버 필드에서 사용

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _119_event
{
    public delegate void delegateEvent(string msg);

    class InDelegate
    {
        public delegateEvent myDelegate;
        public event delegateEvent myEvent;

        public void DoEvent(int a, int b)
        {
            if (null != myEvent)
                myEvent("DoEvent : " + (a + b)); // == ConsoleFunc("DoEvent : " + (a + b));
        }
    }
    class Program
    {
        static public void ConsoleFunc(string msg)
        {
            Console.WriteLine("ConsoleFunc : " + msg);
        }
        static void Main(string[] args)
        {
            InDelegate id = new InDelegate();
            id.myEvent += new delegateEvent(ConsoleFunc);
            //id.myEvent += ConsoleFunc;  //사용 가능
            //id.myEvent = ConsoleFunc;  //대입연산자 사용 불가

            id.myDelegate = ConsoleFunc;

            id.myDelegate("Test");  //클래스 외부 직접 호출 가능
            //id.myEvent("Test");  //클래스 외부에서 직접 호출 불가

            for(int i = 0; i < 10; i++)
            {
                id.DoEvent(i + 1, i + 2);
            }
        }
    }
}

 

728x90