callback 함수를 인자로 받는, 함수(고차함수)만들기
고차함수(Callback)을 사용하는 C# 코드 예제
고차 함수(Higher-Order Function)는 다른 함수를 매개변수로 받거나 결과로 반환하는 함수를 의미합니다. 프로그래밍 언어에서 고차 함수는 함수 자체를 데이터로 취급해, 보다 유연하고 재사용 가능한 코드를 작성할 수 있도록 해준다. Action, Func, 그리고 사용자 정의 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) 함수에서 실행되어 만들어진 객체 또는 변수 , 값등을 본문으로 전달할 수있다.