// Declare delegate -- defines required signature:
delegate double MathAction(double num);

class DelegateTest
{
    // Regular method that matches signature:
    static double Double(double input)
    {
        return input * 2;
    }

    static void Main()
    {
        // Instantiate delegate with named method:
        MathAction ma = Double;

        // Invoke delegate ma:
        double multByTwo = ma(4.5);
        Console.WriteLine("multByTwo: {0}", multByTwo);

        // Instantiate delegate with anonymous method:
        MathAction ma2 = delegate(double input)
        {
            return input * input;
        };

        double square = ma2(5);
        Console.WriteLine("square: {0}", square);

        // Instantiate delegate with lambda expression
        MathAction ma3 = s => s * s * s;
        double cube = ma3(4.375);

        Console.WriteLine("cube: {0}", cube);
    }
    // Output:
    // multByTwo: 9
    // square: 25
    // cube: 83.740234375
}

Delegate(대표, 위임하다)다.

위임자라고 생각하면 되는데, 메쏘드를 대신 불러와 준다.

간단하게 위의 코드를 설명하면

double형 1개를 매개변수로 받고 double형을 반환받는 delegate를 MathAction으로 선언하고 변수 생성 후 필요한 메소드를 참조시킨다. 고로 delegate는 참조 형식이다.

예제의 첫번째 방식은 명명된 메서드를 참조시키는 방법이다. 쉬우니깐 넘어가고

두번째는 무명 메서드를 참조시켰다.

"무명 메서드를 사용하면 별도 메서드를 만들 필요가 없기 때문에 대리자를 인스턴스화하는 코딩 오버헤드가 줄어듭니다.

예를 들어 메서드를 만드는 것이 불필요한 오버헤드처럼 보일 수도 있는 경우 대리자 대신 코드 블록을 지정하는 것이 유용할 수 있습니다. 좋은 예로 새 스레드를 시작하는 경우를 들 수 있습니다. 이 클래스는 스레드를 만들며, 대리자에 대한 추가 메서드를 만들지 않고 스레드에서 실행하는 코드도 포함합니다." <- 닷넷 설명.

세번째는 람다식

=> 왼쪽은 매개변수고 오른쪽은 리턴값이다.

 

 

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp2
{
    delegate int MyDelegate(int a, int b);

    class Program
    {
        //계산기 함수
        public static void Calculator(int a, int b, MyDelegate _dele)
        {
            Console.WriteLine(_dele(a, b));
        }

        public static int plus(int a, int b) { return a + b; }
        public static int minus(int a, int b) { return a - b; }
        public static int multiply(int a, int b) { return a * b; }

        static void Main(string[] args)
        {
            MyDelegate Plus = new MyDelegate(plus);
            MyDelegate Minus = new MyDelegate(minus);
            MyDelegate Multiply = new MyDelegate(multiply);

            Calculator(11, 22, Plus);
            Calculator(33, 22, Minus);
            Calculator(11,22,Multiply);
        }
    }
}

이번에는 콜백메서드를 구현이다.

설명하면 A메서드에 B라는 메서드를 넘겨 A메서드로 하여금 B메서드를 호출하도록 하는 것을 말한다.

델리게이트 변수를 선언 후 필요 메서드를 참조시키고 Calculator 메서드에 필요한 델리게이트만 넘겨준다.

namespace ConsoleApp2
{
    delegate T MyDelegate<T>(T a, T b);

    class Program
    {
        public static void Calculator<T>(T a, T b, MyDelegate<T> _dele)
        {
            Console.WriteLine(_dele(a, b));
        }

        public static int plus(int a, int b) { return a + b; }
        public static float plus(float a,float b) { return a + b; }
        public static double plus(double a,double b) { return a + b; }

        static void Main(string[] args)
        {
            MyDelegate<int> PlusInt = new MyDelegate<int>(plus);
            MyDelegate<float> PlusFloat = new MyDelegate<float>(plus);
            MyDelegate<double> PlusDouble = new MyDelegate<double>(plus);

            Calculator(11, 22, PlusInt);
            Calculator(3.3f, 4.4f, PlusFloat);
            Calculator(5.5, 6.6, PlusDouble);
        }
    }
}

위의 코드에서는 제너릭화 시켜 어떤 타입에도 사용 가능하도록 만들었다. 어떤 형으로 선언하냐에 따라서 자동으로 오버로딩이 된다.

namespace ConsoleApp2
{
    delegate void MyDelegate();

    class Program
    {
        public static void func0() { Console.Write("First "); }
        public static void func1() { Console.Write("Second "); }
        public static void func2() { Console.Write("Third "); }

        static void Main(string[] args)
        {
            MyDelegate dele;
            dele = new MyDelegate(func0);
            dele += func1;
            dele += func2;

            dele();
            Console.WriteLine();

            dele -= func0;
            dele -= func2;

            dele();
            Console.WriteLine();
        }
    }
}

마지막으로 델리게이트 체인이다.

이 녀석은 여러개의 메서드를 참조할 수도 있다.

변수를 만들고 선언한 다음에 +연산자로 붙여주기만 하면된다. -연산자로 뺄 수도 있다.

 

'게임 프로그래밍 > C#' 카테고리의 다른 글

구조체와 클래스 차이  (0) 2021.11.12
func, Action 델리게이트  (0) 2021.11.12
Delegate, Event  (0) 2021.11.12
Interface  (0) 2021.11.12
일반화 컬렉션  (0) 2021.11.12
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기
위와 같은 스크립트 코드를 추가하면 H2가 두 개 이상이거나 H3가 두 개 이상인 경우 첫 번째 H2 헤딩 태그 앞에 목차를 표시합니다. 만약 H2가 한 개도 없으면 목차가 표시되지 않습니다. H3 이상부터 있는 경우에는 코드를 조금 수정해야 합니다. 다음과 비슷하게 하면 잘 작동합니다.