2022년 2월 1일 화요일

C# 델리게이트(Delegate) 선언, 생성, 호출, 콜백(Callback) 구현, Func, Action, C#학원, C#교육, C#동영상, 닷넷학원, 닷넷교육, 닷넷동영상

 C# 델리게이트(Delegate)  선언, 생성, 호출, 콜백(Callback) 구현, Func, Action, C#학원, C#교육, C#동영상, 닷넷학원, 닷넷교육, 닷넷동영상


http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=408 


C# 델리게이트(Delegate) 선언, 생성, 호출, 콜백(Callback) 구현, Func, Action

C# 델리게이트(Delegate) 선언, 생성, 호출, 콜백(Callback) 구현, Func, Action델리게이트(Delegate)선언, 생성, 호출Callback 구현C# 델리게이트(Delegate)델리게이트(Delegate)는 대리자라고 하는데 C의 함수 포인터

ojc.asia

https://www.youtube.com/watch?v=p9H3cDRjS7M&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=17 




델리게이트(Delegate)

선언, 생성, 호출

Callback 구현







C# 델리게이트(Delegate)


  • 델리게이트(Delegate)는 대리자라고 하는데 C의 함수 포인터와 유사하며 메소드에 대한 참조를 포함한다. 자신이 실제로 하는 일은 없고 가리키고 있는 메소드(함수)를 호출하는 역할을 하는 것이다.


  • 어떤 일을 해줄 코드, 실제 할 일을 컴파일 타임이 아닌 런타임에 부여하는데 이 “일”을 콜백 이라 한다. C# 델리게이트는 이 콜백을 구현하기 위해 사용되는 것으로 델리게이트에 메소드의 주소를 할당한 후 델리게이트를 호출하면 델리게이트가 메소드를 호출해 주는 것이다.


  • 델리게이트는 쓰레드와 이벤트에서 주로 사용된다.



선언방법


한정자 delegate 리턴형 델리게이트이름 ( 매개변수목록 ); 

예) private delegate int OjcSum(int i, int j)


델리게이트는 메소드에 대한 참조이므로 참조할 메소드의 반환형식과 매개변수를 정의해 주어야 한다. 구현부가 없는 이유는 delegate 자신은 아무것도 하지 않고, 자신이 참조하고 있는 메소드(함수)만 호출해 주기 때문 이다.


델리게이트를 이용하여 콜백을 구현하는 과정


  1. 델리게이트 선언
  2. 델리게이트의 인스턴스 생성
  3. 델리게이트를 호출(2에서 생성한 인스턴스, 객체참조를 통해 참조하는 메소드를 호출한다.)


아래 예제를 보자



[예제1]

delegate int SumDele(int i, int j);

class DeliTest

{

    static void Main()

    {

        SumDele s1 = DeliTest.Sum;

        SumDele s2 = new SumDele(DeliTest.Gop);

        S(s1); //합

        S(s2); //곱

    }


    //아래 메소드는 실제 할일(콜백)이 컴파일 타임에 결정되는 것이 아니라 런타임중에

    //인자로 넘어오는 델리게이트를 통해 결정된다.  이런 콜백의 구현은 델리게이트로

    static void S(SumDele s) => Console.WriteLine(s(1, 2));   

    

    static int Sum(int i, int j) => i + j;

    static int Gop(int i, int j) => i * j;

}


//아래처럼 델리게이트 정의를 C#에서 제공하는 Func 델리게이트를 사용할 수도 있다.

//delegate int SumDele(int i, int j);

class DeliTest

{

    static void Main()

    {

        Func<int, int, int> s1 = DeliTest.Sum;

        Func<int, int, int> s2 = new Func<int, int, int>(DeliTest.Gop);

        S(s1); //합

        S(s2); //곱

    }


    //아래 메소드는 실제 할일(콜백)이 컴파일 타임에 결정되는 것이 아니라 런타임중에

    //인자로 넘어오는 델리게이트를 통해 결정된다.  이런 콜백의 구현은 델리게이트로

    static void S(Func<int, int, int> s) => Console.WriteLine(s(1, 2));   

    

    static int Sum(int i, int j) => i + j;

    static int Gop(int i, int j) => i * j;

}


[예제2]


using System;

public class Delegate1

{

    //델리게이트 선언은 Action, Func로 대체할수 있다.

    private delegate int OnjSum(int i, int j); //1. 선언

    private delegate void OnjSum2(int i, int j); //1. 선언

    public static void Main(string[] args)

    {

        Delegate1 d1 = new Delegate1();


        //Sum이 static 이 아니므로 객체참조 필요

        //Func는 값을 리턴하는 메소드를 참조하는 시샵에서 제공하는 델리게이트로 16개 입력인자를 가질수있다.

        OnjSum myMethod = d1.Sum;             //2. 생성, 메소드이름을 인자로


        Console.WriteLine("10 + 20 = {0}", myMethod(10, 20));  //3. 실행


        //Action은 값을 리턴하지 않는 메소드를 참조하는 델리게이트

        //시샵에서 인자17까지 제공함

        //Sum3가 static 이므로 다이렉트 접근, 객체생성 없이 접근

        OnjSum2 d2 = Sum2;

        d2(20, 30);

    }


    int Sum(int i, int j) => i + j; 

    static void Sum2(int i, int j) => Console.WriteLine($"{i} + {j} = {i + j}"); 

}




using System;

public class Delegate1

{

    //델리게이트 선언은 Action, Func로 대체할수 있다.

    //private delegate int OnjSum(int i, int j); //1. 선언

    //private delegate void OnjSum2(int i, int j); //1. 선언

    public static void Main(string[] args)

    {

        Delegate1 d1 = new Delegate1();


        //Sum이 static 이 아니므로 객체참조 필요

        //Func는 값을 리턴하는 메소드를 참조하는 시샵에서 제공하는 델리게이트로 16개 입력인자를 가질수있다.

        Func<int, int,  int> myMethod = d1.Sum;             //2. 생성, 메소드이름을 인자로


        Console.WriteLine("두수 합 : {0}", myMethod(10, 30));  //3. 실행


        //Action은 값을 리턴하지 않는 메소드를 참조하는 델리게이트

//시샵에서 인자17까지 제공함

        //Sum3가 static 이므로 다이렉트 접근, 객체생성 없이 접근

        Action<int, int> d2 =Sum2;

        d2(10, 20);

    }

    int Sum(int i, int j)     {        return i + j;    }

    static void Sum2(int i, int j) { Console.WriteLine($"{i} + {j} = {i+j}"); }

}



[예제3]

using System;

delegate void Hello();  //1. 선언

class Program {

    static void Main(string[] args)  {

        Speak(new Hello(K_Hello));  //2. 생성

        Speak(new Hello(C_Hello));

        Speak(new Hello(E_Hello));

    }


    static void Speak(Hello h) { h(); }  //3. 실행 


    static void K_Hello() { Console.WriteLine("안녕~"); }

    static void C_Hello() { Console.WriteLine("你好~"); }


    static void E_Hello() { Console.WriteLine("Hello~"); }

}


class Program

{

    static void Main(string[] args)

    {

        Speak(K_Hello);  //2. 생성

        Speak(C_Hello);

        Speak(E_Hello);

    }


    static void Speak(Action h) { h(); }  //3. 실행 


    static void K_Hello() => Console.WriteLine("안녕~"); 

    static void C_Hello() => Console.WriteLine("你好~"); 

    static void E_Hello() => Console.WriteLine("Hello~"); 

}



Delegate를 사용할 때 주의할 점은 delegate가 참조하는 메소드(여기서는 Sum)의 인자 및 리턴형이 선언된 delegate와 같아야 한다는 것이다. 예제에서도 볼 수 있듯이, int Sum(int I, int j) 메소드는 int형 인자 둘이고, int형을 리턴한다. 따라서 선언된 delegate도 int형 인자가 둘이고 int형을 리턴하도록 선언되어 있지만 delegate는 참조하는 메소드가 어떤 타입이든 상관하지 않는다. static이든 non static이든 관계없다. 즉, 참조하는 메소드의 인자형, 개수, 리턴 타입만 같으면 문제가 없다는 것이다. 위 예제에서 OnjSum이 참조하는 메소드 Sum이 static이므로 델리게이트를 생성할 때 Delegate1.Sum 이라고 참조하는 메소드를 인자로 넣었다.

 

#델리게이트, #Delegate, #Callback, #콜백, #Func, #Action, #시샵교육, #시샵학원, #닷넷교육, #닷넷학원, #닷넷동영상, #시샵동영상,
델리게이트, Delegate, Callback, 콜백, Func, Action, 시샵교육, 시샵학원, 닷넷교육, 닷넷학원, 닷넷동영상, 시샵동영상

댓글 없음:

댓글 쓰기

(C#교육동영상)C# ADO.NET 실습 ODP.NET/ODAC 설치 오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원

  (C#교육동영상)C# ADO.NET 실습  ODP.NET/ODAC 설치  오라클 함수 호출 실습, C#학원, WPF학원, 닷넷학원, 자바학원 https://www.youtube.com/watch?v=qIPU85yAlzc&list=PLxU-i...