์๋ฉด ์ข์ ์ง์ - Callback Function(์ฝ๋ฐฑํจ์)
Delegate
๋ฅผ ํ์ฉํ ํจ์์ ๋ฌ์ callback
๊ณผ ๊ฐ์ ๊ฐ๋
callback
: A, B, C ๋ฉ์๋๊ฐ ์์๋, A๊ฐ B(์ค๊ฐ์=Delegate)๋ฅผ ํตํด์ C์๊ฒ ์ ๋ฌ์ ํด๋ฌ๋ผ๊ณ ํ๋๋ฐ, B๊ฐ C์๊ฒ A์๊ฒ ์ฐ๋ฝํ ๊ฒ์ ์์ฒญํ๊ณ ,
C๊ฐ ๋ค์ A์๊ฒ ์ฐ๋ฝ์ ์ทจํ๋ค.
- ์ฝ๊ฒ ๋งํด A๋ฅผ C์๊ฒ ์ ๋ฌํ๊ณ ์ถ์๋ฐ ์ค๊ฐ์ delegate๊ฐ ๊ทธ ์ญํ ์ ํ๊ณ , C๋ ๊ฒฐ๊ณผ๋ฅผ A์๊ฒ ๋ฐํํ๋ค.
using System.Collections;
namespace DelegateEx
{
delegate int CalculationDelegate(int x, int y);
class Program
{
static int Add(int x, int y)
{
return x + y;
}
static int Sub(int x, int y)
{
return x - y;
}
public static void calc(int x, int y, CalculationDelegate cd)
{
/*
calc()๋ฉ์๋๊ฐ `calc = A`๋ ์ง์ Add๋ Sub ๋ฉ์๋๋ฅผ ํธ์ถํ๋๊ฒ ์๋๋ผ cd ๋๋ฆฌ์(์ค๊ฐ์ or Delegate = B)๋ฅผ ์ด์ฉํด `Add ํน์ Sub = C`๋ฅผ ํธ์ถํจ.
*/
Console.WriteLine(cd(x, y));
}
static void Main(string[] args)
{
CalculationDelegate plus = new CalculationDelegate(Add);//์ค๊ฐ์(B)
// ์์ ์ฝ๋์ CalculationDelegate plus = Add; ๋ ๊ฐ์ ์ฝ๋์ด๋ค.
CalculationDelegate minus = new CalculationDelegate(Sub);
// ์์ ์ฝ๋์ CalculationDelegate plus = Sub; ๋ํ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ ์ฝ๋์ด๋ค.
calc(11, 22, plus); // plus๊ฐ ์ฝ๋ฐฑ์, plus = Add๋ผ๋ ํจ์๋ฅผ ํธ์ถํจ.
/*
calc()๋ฉ์๋๊ฐ `calc = A`๋ ์ง์ Add๋ฅผ ํธ์ถํ๋๊ฒ ์๋๋ผ plus ๋๋ฆฌ์๋ฅผ ์ด์ฉํด `Add = C`๋ฅผ ํธ์ถํจ.
*/
calc(11, 22, minus); // minus๊ฐ ์ฝ๋ฐฑ์
}
}
}
Output
33
-11
โญ๏ธโญ๏ธโญ๏ธ ์ฝ๋ฐฑ ์ดํด์ ์์ด ์ค์ํ ์ฝ๋
static int Add(int x, int y)
{
return x + y;
}
static int Sub(int x, int y)
{
return x - y;
}
public static void calc(int x, int y, CalculationDelegate cd)
{
/*
calc()๋ฉ์๋๊ฐ `calc = A`๋ ์ง์ Add๋ Sub ๋ฉ์๋๋ฅผ ํธ์ถํ๋๊ฒ ์๋๋ผ cd ๋๋ฆฌ์(์ค๊ฐ์ or Delegate = B)๋ฅผ ์ด์ฉํด `Add ํน์ Sub = C`๋ฅผ ํธ์ถํจ.
*/
Console.WriteLine(cd(x, y));
}
- ์ ์ฝ๋์์ ํ์ธํ ์ ์๋ฏ์ด
calc(= A)
๋ฉ์๋๊ฐ ์ง์ Add
๋ Sub
๋ฉ์๋๋ฅผ ํธ์ถํ๋๊ฒ ์๋๋ผ cd ๋๋ฆฌ์(์ค๊ฐ์ or Delegate = B)
๋ฅผ ์ด์ฉํด Add ํน์ Sub (= C)
๋ฅผ ํธ์ถํจ.
- ๊ทธ ํ
Add ํน์ Sub (= C)
๋ ๋ฐํ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ calc(= A)
๋ก ๋ฐํํ์ฌ ๋์๊ฐ๋ ์ฝ๋ฐฑ(CallBack)
๋์์ ํจ.
์ ๋ค๋ฆญ ๋ธ๋ฆฌ๊ฒ์ดํธ(Generic Delegate)
using System.Collections;
namespace DelegateEx
{
delegate T CalDelegate<T>(T x, T y);
class Program
{
static int Add(int x, int y)
{
return x + y;
}
static double Sub(double x, double y)
{
return x - y;
}
public static void calc<T>(T x, T y, CalDelegate<T> cd)
{
Console.WriteLine(cd(x, y));
}
static void Main(string[] args)
{
CalDelegate<int> plus = Add;
CalDelegate<double> minus = Sub;
calc(11, 11, plus);
calc(5.1, 2.2, minus);
}
}
}
Output
22
2.8999999999999995
- ๊ธฐ์กด ๊ณต๋ถํ๋ ์ ๋ค๋ฆญ์ ํ์ฉํ๋ฉด ๋๋ ๊ฒ์ด๊ธฐ์ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.