callback 함수를 인자로 받는, 함수(고차함수)만들기

 

 

고차함수(Callback)을 사용하는 C# 코드 예제

고차 함수(Higher-Order Function)는 다른 함수를 매개변수로 받거나 결과로 반환하는 함수를 의미합니다. 프로그래밍 언어에서 고차 함수는 함수 자체를 데이터로 취급해, 보다 유연하고 재사용 가능한 코드를 작성할 수 있도록 해준다. ActionFunc, 그리고 사용자 정의 Delegate를 사용해 만들어 보자

1. 파라미터 없는 Action 객체를 사용하는 myCallbackAction

            private static void myCallbackAction(Action callback) {
                Console.Write("ㆍcallback of myCallbackAction : → ");
                callback();
            }

            myCallbackAction(() => {
                int x = 10;
                int y = 10;

                Console.WriteLine(x + y);
            });
        

2. 파라미터 있는 Action 객체를 사용하는 myCallbackAction2

            private static void myCallbackAction2(Action<string> callback) {
                Console.Write("ㆍcallback of myCallbackAction #2 : → ");
                string param = "성공";
                callback(param);
            }

            myCallbackAction2((s) => {
                var result = s;
                Console.WriteLine("처리결과는 : ".Concat(s));
            });
        

3. Func 객체를 사용하는 myCallbackFunc

            private static string myCallbackFunc(Func<int, int, string> callback) {
                Console.WriteLine("Callback of myCallbackFunc.....");

                int a = 100;
                int b = 200;

                var result = callback(a, b);
                return result;
            }

            var func = myCallbackFunc((p1, p2) => {
                return "xxx";
            });

            Console.WriteLine("FuncResult → " + func);
        

4. Delegate를 사용하는 myCallBackDelegate

       private static void myCallBackDelegate(MyDelegate callback) {
           int x = 5;
           int y = 7;

           Console.Write("ㆍcallback of myCallBackDelegate : → ");
                callback(x, y);
            }
       }

       myCallBackDelegate((v1, v2) => {
          (int returnVal1, int returnVal2) = (v1, v2);
          Console.WriteLine($"rtn Val #1 : {returnVal1} , rtn Va #2 : {returnVal2}");
       });
  ★★★★★★   변수를 인자로 받는 함수를 callback 함수로 구현할때 유의사항
  변수를 인자로 받는 콜백함수(delegate 또는 func) 의 경우,  
  아래와 같이 호출전 v1,v2 변수를 전달하는게 아니라는것에 유의하자

  int v1 = 100;
  int v2 = 200;   
   
  myCallBackDelegate((v1, v2) =>  {  // 위에 v1 = 100 , v2= 200 이 전달되는것 아님

     
      (int returnVal1, int returnVal2) = (v1, v2);  // 튜플 디컨스트럭션(분해구조)
      Console.WriteLine($"rtn Val #1 : {returnVal1} , rtn Va #2 : {returnVal2}"); 
  });

  v1,v2  2개의 파라미터를 갖는 무명 함수를 만드는것이고 그 함수는,       
  v1,v2 파라미터를 갖는 myCallBackDelegate(MyDelegate callback) callback 변수(함수)로 
  전달 되는것임, 결국 myCallBackDelegate 의 MyDelegate callback 이 실행될때, v1 ,v2 의
  해당하는 자리에 파라미터로 사용할 수  있다는 의미이다

  private static void myCallBackDelegate(MyDelegate callback) { 
      int x = 5; 
      int y = 7; 
      Console.Write("ㆍcallback of myCallBackDelegate : → "); 
      callback(x, y); 
  }
       
  그래서, callback 호출하면서 전달한 파라미터 v1,v2 의 값을 무명클래스로 선언한 함수에서
  사용할 수 있음 

  (v1, v2) => {
      (int returnVal1, int returnVal2) = (v1, v2); 
      Console.WriteLine($"rtn Val #1 : {returnVal1} , rtn Va #2 : {returnVal2}"); 
  }); 
 
  그래서 myCallBackDelegate(MyDelegate callback)  함수에서 실행되어 만들어진
  객체 또는 변수 , 값등을 본문으로 전달할 수있다.

  
Posted in C#

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다