*์ด ๊ธ์ <์ด๊ฒ์ด C#์ด๋ค> ์ฑ ์ ๋ฐํ์ผ๋ก ๊ณต๋ถํ ๊ธ์ ๋๋ค.
๊ฐ์
์ฝ๋ฐฑ(Callback)์ด๋ ๊ฐ๋ ์ ์ฒ์ ๋ค์ ๊ฒ์ ์ ๋ํฐ๋ฅผ ๊ณต๋ถํ ๋์๋ค. ๊ฒ์์ด๋ ๋ถ์ผ ํน์ฑ์, ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์ฃผ๋ฅผ ์ด๋ฃจ๋ ์์ ์ ์ฝ๋ฐฑ์ด๋ ๊ฐ๋ ์ ํ์์ ์ผ๋ก ๋ฑ์ฅํ๋ ๊ฒ ๊ฐ์๋ค. ๊ทธ ๋น์์๋ ๋ฐฐ๊ฒฝ ์ง์์ด ์๋ฌด๊ฒ๋ ์์๊ธฐ ๋๋ฌธ์ ์ฝ์ด๋ด๋ ๋ฌด์จ ๋ง์ธ์ง ๋ชฐ๋๋ค. ์ง๊ธ๋ ๋ฌผ๋ก ์๋ฒฝํ๊ฒ ์๋ ๊ฒ์ ์๋ ์๋ ์๋ค. ๊ทธ๋๋ ์ฑ ์ ๋ณด๋ฉฐ ๊ณต๋ถํ ๊ฒ์ ํ ๋๋ก ๋ด๊ฐ ์ดํดํ ๋ด์ฉ๋ค์ ์ ๋ฆฌํด๋ณผ ์๊ฐ์ด๋ค.
์ด ๊ธ์ ์ฝ๋ ๋ค๋ฅธ ๋ถ๋ค๊ป ๋์์ด ๋์ จ์ผ๋ฉด ์ข๊ฒ ๊ณ , ํ๋ฆฐ ์ ์ด ์๋ค๋ฉด ์ง์ ๋ ํด์ฃผ์ จ์ผ๋ฉด ํ๋ค.
1. ์ฝ๋ฐฑ (Callback)์ด๋?
์ ์ ๊ฐ๋ ์ผ๋ก ๋ณธ๋ค๋ฉด, ํผํธ์ถ์๊ฐ ํธ์ถ์๋ฅผ ๋ค์ ํธ์ถํ๋ ๊ฒ์ด๋ผ๊ณ ํ๋ค. ์ด ๋ง๋ง ๋ค์ผ๋ฉด ๋ฌด์จ ๋ง์ธ์ง ์ดํด๊ฐ ์ ์ ๋๋ค. ๊ทธ๋์ ์ฑ ๊ณผ ๊ตฌ๊ธ์ ์๋ ์ ๋ฆฌ ์ ๋ ์ฌ๋ฌ ๋ธ๋ก๊ทธ๋ค์ ์ฐธ๊ณ ํ์ฌ ๋ค์๊ณผ ๊ฐ์ ์์ ์ํฉ์ ๋ง๋ค์๋ค.
์ด๋ค ํ ์ฌ์ ๊ฐ๊ฐ ๋ชจ ๊ธฐ์ ์ ํ๋ก์ ํธ ํฌ์์ ๊ด์ฌ์ด ์์ด์ ์ง์ ์ฐพ์๊ฐ๋ค. ๊ทธ๋ฐ๋ฐ, ์ฌ์ฅ์ด ๋ถ์ฌ ์ค์ด๋ผ ๊ทธ์ ๋น์์๊ฒ "์ฌ์ฅ๋ ์ค์๋ฉด ์ ํ ๋ถํ๋๋ฆฐ๋ค."๋ผ๋ ๋ฉ๋ชจ๋ฅผ ๋จ๊ฒจ์ฃผ๊ณ ์๋ค.
์ฌ์ ๊ฐ๋ ๊ทธ๋์ ์๊ธฐ ์์ ์ ๋ค๋ฅธ ์ ๋ฌด๋ฅผ ์งํํ๋ค. ์ผ๋ง ๋ค, ์ฌ์ฅ์ด ๋์์๋ค.
๋น์๋ ์์ ์ด ๋ถํ๋ฐ์ ๋ฉ๋ชจ๋ฅผ ์ฌ์ฅ์๊ฒ ์ฃผ์๋ค.
์ฌ์ฅ์ ๋น์์๊ฒ ๋ถํ๋ฐ์ ๋ฉ๋ชจ์ ์ ํ ๋ด์ฉ๋๋ก ํ๋์ ํ๋ค. (์ ํ๊ฑธ๊ธฐ)
์ฌ์ ๊ฐ๋ ์ฌ์ฅ์๊ฒ ์ ํ๊ฐ ์ค์, ํ๋ ์ผ์ ์ ๊น ๋ฉ์ถ๊ณ ์ ํ๋ฅผ ๋ฐ์ ์ฌ์ฅ๊ณผ ํตํ๋ฅผ ํ๊ธฐ ์์ํ๋ค.
์ฌ๊ธฐ๊น์ง ๊ณผ์ ์ ์ดํด๋ณด์๋ค. ์ฝ๋ฐฑ์ด ๋๊ฐ ์ด๋ฐ ๊ณผ์ ์ด๋ค. ๊ทธ๋ฐ๋ฐ, ๋ง์ฝ ์ฝ๋ฐฑ์ด ์์๋ค๋ฉด ์ด๋ ์๊น?
์๋ง ์ ์ฌ์ ๊ฐ๋ ๋น์์๊ฒ ๋๋ค๊ฒจ ๋ง์์ ๊ฒ์ด๋ค. ๋น๋๊ธฐ ์ฒ๋ฆฌ์์ ์ฝ๋ฐฑ์ด ์ฐ์ด๋ ์ด์ ๋ฅผ ์ดํดํ ์ ์์๋ ์์์๋ค.
๊ทธ๋ ๋ค๋ฉด, ์ด์ ์ด๋ฐ ์ฝ๋ฐฑ์ ํ๋ก๊ทธ๋๋ฐ์์ ์ ์ฉํ๊ฒ ๋ค๋๊ฑด๋ฐ ์ด๋ป๊ฒ ์ ์ฉํ ์ ์์๊น?
C#์์๋ ์ด๋ฐ ์ฝ๋ฐฑ์ ์ ์ฉํ ์ ์๊ฒ๋ ๋์์ฃผ๋ ๋๋ฆฌ์(Delegate)๋ผ๋ ๋ฉ์ง ๋ ์์ด ์กด์ฌํ๋ค.
2. ๋๋ฆฌ์ (Delegate)
์์์ ์์๋ฅผ ๋ค์๋ ์ธ๋ฌผ ์ค์ ๋น์ ์ญํ ์ ํ๋ ๊ฒ์ด ๋ฐ๋ก ์ด ๋๋ฆฌ์๋ ๋ ์์ด๋ค. ๋๋ฆฌ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธํ๋ค.
ํ์ ์ delegate ๋ฐํํ์ ๋๋ฆฌ์์ด๋ฆ(๋งค๊ฐ๋ณ์ ๋ชฉ๋ก);
ํ์์ ๋ณด๋ฉด, delegate ํค์๋๊ฐ ์๋ ๊ฒ์ ๋นผ๋ฉด ๋ฉ์๋๋ฅผ ์ ์ธํ๋ ๊ฒ๊ณผ ๋๊ฐ์ด ์๊ฒผ๋ค. ์ด๋ ๊ฒ ์ ์ธํ ๋๋ฆฌ์๋ ๋ถํ๋ฐ์ ํ ์ผ(๋ฉ๋ชจ)๋ฅผ ์ ๋ฌ ํด์ฃผ๋ ์ญํ ์ ํ๋ฉฐ, ๊ทธ๋ ๊ธฐ์ ๋จผ์ ํ ์ผ(๋ฉ์๋)๋ฅผ ๋ฃ์ด์ฃผ๋ ๊ฒ์ด ํ์ํ๋ค.
ํด์ผํ ํ๋์ ๋ฃ์ด์ฃผ๋ ๊ฒ์ด๋ฏ๋ก ๋น์ฐํ ์ธ์๋ ๋ฉ์๋๊ฐ ๋จ์๊ฐ ๋๋ค. ์ฃผ์ํ ์ ์ ๋๋ฆฌ์์ ๋ฉ์๋์ ๋ฐํ ํ์, ๋งค๊ฐ๋ณ์๊ฐ ์ผ์นํด์ผ ํ๋ค.
delegate void Memo(string phoneNumber); // ๋๋ฆฌ์ ์ ์ธ
void Callback(string phoneNumber); // ์ฌ์ฉ ๊ฐ๋ฅ
// int Callback(string phoneNumber); ๋ฐํํ ๋ถ์ผ์น๋ก ์ฌ์ฉ ๋ถ๊ฐ
// void Callback(); ๋งค๊ฐ๋ณ์ ๋ถ์ผ์น๋ก ์ฌ์ฉ ๋ถ๊ฐ
๋๋ฆฌ์๋ ์ธ์คํด์ค๊ฐ ์๋ ํ์(Type)์ด๋ค.
๋๋ฆฌ์๋ int, string๊ณผ ๊ฐ์ ํ์์ด๋ผ์, ์ธ์คํด์ค๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ค์ผ ํ๋ค.
class Program
{
delegate void Memo(string phoneNumber); // ๋๋ฆฌ์ ์ ์ธ
static void Callback(string phoneNumber)
{
Console.WriteLine($"{phoneNumber} ๋ฒํธ๋ก ์ ํ๋ฅผ ๊ฑธ์์ต๋๋ค.");
}
static void Main(string[] args)
{
Memo memo = new Memo(Callback); // ๋ฉ์๋๋ฅผ ์ธ์๋ก ์ฃผ์ด ์ธ์คํด์ค ์์ฑ
memo("010-1234-5678"); // ๋๋ฆฌ์ ์คํ
}
}
์ด๋ ๋ฏ, ๋๋ฆฌ์๋ ํ์ฌ ์์ ์ด ์ฐธ์กฐํ๊ณ ์๋ ๋ฉ์๋ ์ฝ๋๋ฅผ ์คํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํธ์ถ์์๊ฒ ๋ฐํํ๋ค. ๋ค๋ฅธ ๋ฉ์๋๋ก ๊ฐ์ ๋ผ์ฐ๊ณ ์ถ๋ค๋ฉด ์๋ก์ด ๋๋ฆฌ์ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
static void Absensce(string phoneNumber)
{
Console.WriteLine($"์์ง ๋ถ์ฌ ์ค์ด์๋ผ, {phoneNumber} ๋ฒํธ๋ก ์ ํ๋ฅผ ๋ชป ๊ฒ๋๋ค.");
}
static void Main(string[] args)
{
memo = new Memo(Absensce);
memo("010-1234-5678");
}
๋ํ ๋๋ฆฌ์์ ์ธ์๋ก ์ ์ ๋ฉ์๋(static)๋ ์ธ์คํด์ค ๋ฉ์๋๋ ์๊ด์์ด ๋ฃ์ ์ ์๋ค. ํ์๋ ์ ์ ๋ฉ์๋๋ก ๊ตฌํ์ ํด๋ณธ ๊ฒ์ด๋ค.
"๋๋ฆฌ์๋ ์, ๊ทธ๋ฆฌ๊ณ ์ธ์ ์ฌ์ฉ์ ํ๋์?"
ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค ๋ณด๋ฉด, ๊ฐ์ด ์๋ "์ฝ๋" ๊ทธ ์์ฒด๋ฅผ ๋งค๊ฐ๋ณ์์ ๋๊ธฐ๊ณ ์ถ์ ๋๊ฐ ๋ง๋ค. ์ค๋ฆ์ฐจ์๊ณผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ์ ํ ๋, ๋น๊ต ์ฝ๋๋ฅผ ์ธ์๋ก ๋ฃ์ ์ ์๋ค๋ฉด ์ฐธ ํธ๋ฆฌํ ๊ฒ์ด๋ค. ๋จผ์ ๋น๊ตํ๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ ๋๋ฆฌ์๋ฅผ ์ ์ธํ๋ค.
delegate int Compare(int a, int b);
์ค๋ฆ์ฐจ์ ๋น๊ต ๋ฉ์๋๋ถํฐ ํ ๋ฒ ํด๋ณด์. ์ค๋ฆ์ฐจ์ ๋น๊ต ๋ฉ์๋๋ฅผ ๋ง๋ค์ด ์ค๋ค.
static int AscendCompare(int a, int b) // ์ค๋ฆ์ฐจ์ ๋น๊ต ๋ฉ์๋
{
if (a > b)
return 1;
else if (a == b)
return 0;
else
return -1;
}
์๋ง์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๋ค์ด ์์ง๋ง, ๊ฐ์ฅ ๊ฐ๋จํ ๋ฒ๋ธ์ํธ(BubbleSort)๋ฅผ ํ ๋ฒ ๋ง๋ค์ด๋ณด์. ์ด ๋, ๋งค๊ฐ๋ณ์๋ก ๋๋ฆฌ์๋ฅผ ๋ฐ๋๋ค.
static void BubbleSort(int[] array, Compare Comparer)
{
int i = 0;
int j = 0;
int temp = 0;
for (i = 0; i < array.Length - 1; i++)
{
for (j = 0; j < array.Length - (i + 1); j++)
{
if (Comparer(array[j], array[j+1]) > 0)
{
temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
}
}
}
}
ํ ์คํธ๋ฅผ ํ ๋ฒ ํด๋ณด์.
static void Main(string[] args)
{
int[] array = { 6, 1, 15, 3, 5 };
BubbleSort(array, new Compare(AscendCompare));
foreach(int i in array)
{
Console.Write($"{i} ");
}
}
์ค๋ฆ์ฐจ์์ผ๋ก ์ ์ ๋ ฌ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๊ทธ๋ฐ๋ฐ, ์ด ๋ฒ๋ธ์ํธ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ํ์ฉํ๋ฉด์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ๋ก ๋ณ๊ฒฝํ ์ ์์๊น? ๋ด๋ฆผ์ฐจ์ ๋ฉ์๋๋ฅผ ํ๋ ๋ง๋ค์ด์ ์๋ก์ด ๋๋ฆฌ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ์ฃผ๋ฉด ๋๋ค.
static int DescendCompare(int a, int b) // ๋ด๋ฆผ์ฐจ์ ๋ฉ์๋
{
if ( a < b)
return 1;
else if (a == b)
return 0;
else
return -1;
}
๊ทธ๋ฆฌ๊ณ ๋ค์ ํ ์คํธ๋ฅผ ํด๋ณด์.
static void Main(string[] args)
{
int[] array = { 6, 1, 15, 3, 5 };
BubbleSort(array, new Compare(DescendCompare)); // ๋ด๋ฆผ์ฐจ์ ๋ฉ์๋ ๋๋ฆฌ์ ๊ฐ์ฒด ์์ฑ
foreach(int i in array)
{
Console.Write($"{i} ");
}
}
์ด ๋๊น์ง ๋๋ฆฌ์์ ๊ฐ๋จํ ์ฌ์ฉ ๋ฐฉ๋ฒ ๋ฐ ์์ฉ์ ๋ํด ์์๋ณด์๋ค. ๊ธ์ด ๊ธธ์ด์ง ๊ฒ ๊ฐ์ผ๋ ์ผ๋ฐํ ๋๋ฆฌ์, ๋๋ฆฌ์ ์ฒด์ธ ๋ด์ฉ์ ๋ค์ ๊ธ์์ ๋ค๋ค๋ณด์.