delegate는 C#이 가진 독특한 개념인데 따라서 기본적으로 생소한 개념으로 다가온다.

아래는 delegate에 대한 기본적인 개념 소개와 간단한 예제를 통해 개념을 이해해 보고자 한다.


using System;

using System.Collections.Generic;

using System.Diagnostics;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace EXdelegate1

{

    class Program

    {

        //delegate란 

        // (1) 일종의 데이터 type과 같다. 

        // (2) 어떤 메소드를 encapsulate할수 있다. 즉 어떤 메소드를 가리킬수 있고 이를 통해 그 메소드를 실행할수 있다.

        // (3) similar to function pointer in C, C++ 

        // (C, C++에서 어떤 함수를 포인터로 가리키고 이 포인터를 이용해서 해당 함수를 실행하는 방식)

        //아래는 새로운 데이터 타입과 같은 delegate를 선언하는데 이 새로운 데이터 타입의 이름은 Del이고

        //이 데이터 타입이 가리킬수 있는 메소드는 argument로 string을 하나 받고 반환 값은 void인

        //메소드가 있다면 그들 메소드들은 모두 delegate 이름이 Del인 새로운 데이터 타입으로 객체를 선언하고

        //이 선언된 delegate 타입의 객체로 그들 메소드들을 실행할수 있다.

        private delegate void Del(string message);


        //아래는 새로운 데이터 타입인 MyDel이라는 이름의 데이터 타입을 선언하는데 이 데이터 타입은 

        //특별히 delegate형태의 데이터 타입이다.

        //MyDel라는 데이터 타입으로 선언된 어떤 객체(참조변수)는 argument로 string 타입 하나, int 타입 하나를

        //받고 반환 데이터는 string 타입을 반환하는 모든 메소드를 MyDel이라는 데이터 타입으로 모두 

        //가리키고 또 실행할수 있다는 개념이다.

        private delegate string MyDel(string info, int some);


        static void Main(string[] args)

        {

            //delegate 객체를 생성. 이 delegate 객체가 실행할 메소드는 DelegateMethod()이다.

            //handler는 delegate Del 타입의 object이다.

            //delegate 타입의 객체 생성은 Java나 기존의 객체 생성 방식과 약간 다르다.

            //Del이라는 delegate 타입의 객체 handler가 실행할 메소드 이름을 대입해 주면 

            //delegate Del 타입의 새로운 객체가 하나 생성된다.

            Del handler = DelegateMethod;

            handler("delegate object가 보낸 메시지");


            MyDel another = AnotherDelegateMethod;


            Console.WriteLine("\n\n 이름 : " + another("홍길동", 25));


            Del myDel = mDel;

            myDel("Del이라는 이름의 delegate가 실행하는 두~~ 번째 메소드임");



            //익명함수 방식으로 delegate 객체 생성

            //익명함수란 원래 객체 생성 시점에 함수(메소드)의 이름은 없이 막바로 함수 본체가

            //주어지면서 객체 생성되는 형태이다.

            //따라서 아래에서 MyDel의 조건인 매개인자로 string 하나, int형 하나를 받고

            //반환 데이터 타입이 string이라는 조건만 만족시켜주면 함수 본체는 

            //내용이 어떠하든지 상관이 없다.

            MyDel anonymMyDel = delegate (string addr, int sex)

            {

                string gender = "";


                if (sex == 1)

                {

                    gender = "남성";

                } else if (sex == 0)

                {

                    gender = "여성";

                }

                return "주소 : " + addr + ", 성별 : " + gender;

            };


            Console.WriteLine(anonymMyDel("서울특별시 강남구 아무개길 77", 1));



            //익명함수 방식의 delegate 객체 생성2

            Del anonymDel = delegate (string msg)

            {

                Console.WriteLine("\n\nDel의 익명함수 방식 객체 : "+msg);

            };


            anonymDel("오 이런 식으로 되는구나\n\n\n");

        }



        private static void DelegateMethod(string msg)

        {

            Console.WriteLine("\n여기는 delegate method\nmessage sent from delegate object : \""+msg+"\"");

        }


        private static string AnotherDelegateMethod(string name, int age)

        {

            return name + ", age : " + age;

        }


        private static void mDel(string info)

        {

            Console.WriteLine("\n\n여기는 " + info + "~~~\n\n");

        }


    }

}




+ Recent posts