2017년 12월 18일 월요일

C#의 델리게이트(delegate)에 대한 기본적인 개념 및 간단한 예제





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");
        }

    }
}

댓글 없음:

댓글 쓰기