IT/C#

[C#_기본] 델리게이트(Delegate)

배당 줍는 다람쥐 2021. 9. 30. 10:49
반응형

델리게이트

  • 대리자
  • 메소드의 틀을 만들어 소통
  • 클래스간 통신에 활용
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    /*-----------------------------------------------------------------------------
     * Name: _delegate
     * DESC: delegate 기초
    -----------------------------------------------------------------------------*/
    namespace _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));
            }
        }
    }

델리게이트 선언 방법

  • 기본 선언
  • 간략한 선언
  • 익명 함수 선언
  • 람다식 선언
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/*-----------------------------------------------------------------------------
 * Name: _delegateDeclare
 * DESC: delegate 선언 방법
-----------------------------------------------------------------------------*/
namespace _delegateDeclare
{
    delegate void DelegateTest(int a, int b);
	
    // 1, 2번은 미리 함수를 선언해서 사용하는 방법
    // 3, 4번은 바로 함수를 작성해서 사용하는 방법
    
    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)
            {
                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;

/*-----------------------------------------------------------------------------
 * Name: _delegateParam
 * DESC: delegate 파라미터
-----------------------------------------------------------------------------*/
namespace _delegateParam
{
    delegate void delegateFunc();

    class MessageProcess
    {
        delegateFunc CallOkFunc;
        delegateFunc CallCancelFunc;

        public void Message(string msg, delegateFunc okFunc, delegateFunc 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();
            
            // 1. 일반적인 사용 방법
            //msg.Message("Test Message", CallOK, CallCancel);

			// 2. 내부에 익명 함수로 사용하는 방법도 존재
            msg.Message("Test Message",
                delegate ()
                {
                    Console.WriteLine("Call InDelegate");
                }
                ,CallCancel);
        }
    }
}
반응형

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

[C#_List] Find 검색  (0) 2021.10.01
[C#_기본] 람다식 - Lambda Expression  (0) 2021.10.01
[C#_클래스] this, static 키워드  (0) 2021.09.28
[C#_클래스] 개념과 생성자, 소멸자  (0) 2021.09.28
[C#_기본] 접근제한자  (0) 2021.09.28