๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
728x90

*์ด ๊ธ€์€ <์ด๊ฒƒ์ด 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} ");
     }
}

 

 

 

์ด ๋•Œ๊นŒ์ง€ ๋Œ€๋ฆฌ์ž์˜ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ๋ฐ ์‘์šฉ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค. ๊ธ€์ด ๊ธธ์–ด์งˆ ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ์ผ๋ฐ˜ํ™” ๋Œ€๋ฆฌ์ž, ๋Œ€๋ฆฌ์ž ์ฒด์ธ ๋‚ด์šฉ์€ ๋‹ค์Œ ๊ธ€์—์„œ ๋‹ค๋ค„๋ณด์ž.

 

 

728x90
๋ฐ˜์‘ํ˜•