Delegate·ÎºÎÅÍ ÆÄ»ýµÇ´Â µ¨¸®°ÔÀÌÆ®´Â ¸Þ¼µå Çϳª¸¸ °¡¸®Å°´Âµ¥
ºñÇØ MulticastDelegate·ÎºÎÅÍ ÆÄ»ýµÇ´Â µ¨¸®°ÔÀÌÆ®´Â È£ÃâÇÒ ¸Þ¼µåÀÇ ¸ñ·ÏÀ» °¡Áö°í ÀÖ¾î
µÑ ÀÌ»óÀÇ ¸Þ¼µå¸¦ °¡¸®Å²´Ù. ¾î¶² ŸÀÔÀ» »ç¿ëÇÒ °ÍÀÎÁö´Â ÃëÇÏ´Â ¿¬»êÀ» º¸°í ÄÄÆÄÀÏ·¯°¡ ÀÚµ¿À¸·Î °áÁ¤ÇÑ´Ù.
¸Þ¼µå¸¦ Ãß°¡ÇÒ ¶§´Â + ¿¬»êÀÚ³ª
+= ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¸ç ¹Ý´ë·Î Á¦°ÅÇÒ ¶§´Â -³ª -= ¿¬»êÀÚ¸¦
»ç¿ëÇÑ´Ù. Åë»ó ÀÚ±â ÀÚ½ÅÀÇ ¸ñ·Ï¿¡ ¸Þ¼µå¸¦ Ãß°¡, »èÁ¦ÇϹǷΠ+=, -= ¿¬»êÀÚ°¡ »ç¿ëµÈ´Ù. ¸ÖƼij½ºÆ® µ¨¸®°ÔÀÌÆ®¸¦ È£ÃâÇÏ¸é µî·ÏµÈ
¸Þ¼µå¸¦ ¼ø¼´ë·Î È£ÃâÇÑ´Ù.
MultiCast |
|
using
System; delegate
void Dele(int a); class CSTest
{ public
static void Method1(int a) { Console.WriteLine("Method1 " + a); } public
static void Method2(int a) { Console.WriteLine("Method2 " + a); } static
void Main() { Dele
d; d
= Method1; d
+= Method2; d(34); } } |
|
½ÇÇà°á°ú |
Method1 34 Method2 34 |
d¿¡ Method1À» ´ëÀÔÇÑ
ÈÄ += ¿¬»êÀÚ·Î Method2¸¦ Ãß°¡Çß´Ù. Ãß°¡ µ¿ÀÛÀ» ÇßÀ¸´Ï ¸ÖƼij½ºÆ®·Î »ý¼ºµÈ´Ù. d °´Ã¼¿¡´Â Method1°ú Method2°¡ µî·ÏµÇ¸ç d¸¦ È£ÃâÇÏ¸é µÎ ¸Þ¼µå°¡ ¼ø¼´ë·Î È£ÃâµÈ´Ù. ÃÖÃÊ null·Î ÃʱâÈÇϸé Ç×»ó += ¿¬»êÀÚ·Î ¸Þ¼µå¸¦ Ãß°¡ÇÒ ¼ö ÀÖ¾î
ÀÏ°ü¼ºÀÌ ÀÖ´Ù.
Dele d = null;
d += Method1;
d += Method2;
¿©·¯ ¸Þ¼µå¸¦ ÇѲ¨¹ø¿¡ È£ÃâÇÏ·Á¸é ¸®ÅÏ Å¸ÀÔÀº void¿©¾ß ÇÑ´Ù. ÀÓÀÇ Å¸ÀÔÀ» ¸®ÅÏÇÏ´Â °ÍÀ» ¹®¹ýÀûÀ¸·Î ±ÝÁöÇÏÁö´Â ¾ÊÁö¸¸ ¸¶Áö¸· ¸Þ¼µåÀÇ ¸®ÅÏ°ª¸¸ À¯È¿ÇÑ ³í¸®ÀûÀÎ ¹®Á¦°¡ ÀÖ´Ù. °°Àº ÀÌÀ¯·Î Ãâ·Â¿ë(out) Àμö°¡ À־ ¾ÈµÈ´Ù.
¸ÖƼ ij½ºÆÃÀº ÇϳªÀÇ »ç°ÇÀ» ¿©·¯ °´Ã¼¿¡ µ¿½Ã¿¡ Àü´ÞÇÒ ¶§ »ç¿ëÇÑ´Ù. ºñµð¿À
´ë¿©Á¡ÀÇ ÃÖ½ÅÀÛ ºñµð¿À´Â ÀαⰡ ¸¹¾Æ ¼·Î ºô·Á °¡·Á°í ÁÙÀ» ¼±´Ù. »çÀå´ÔÀº ÁÙ ¼± °í°´ÀÇ ¸í´ÜÀ» ÀÛ¼ºÇØ
³õ°í ÃÖ½ÅÀÛÀÌ Ãâ½ÃµÇ¸é °í°´¿¡°Ô ¾Ë·Á ÁÖ´Â ¼ºñ½º¸¦ ÇÑ´Ù. ÀÌ·² ¶§ ¸ÖƼ ij½ºÆÃÀÌ ÇÊ¿äÇÏ´Ù. ÃÖ½ÅÀÛ ºñµð¿À Ãâ½Ã´Â ÇϳªÀÇ »ç°ÇÀÌ°í ÀÌ »ç°ÇÀ» ±â´Ù¸®´Â °í°´Àº ¿©·¯ ¸íÀÌ´Ù.
ÀÏ°ýÀûÀ¸·Î ÅëÁö¸¦ º¸³»·Á¸é ¹Ì¸® ¸ñ·ÏÀ» ÀÛ¼ºÇØ µÎ¾ú´Ù°¡ ¸ðµç °í°´¿¡°Ô µ¿½Ã¿¡ ¾Ë·Á¾ß ÇÑ´Ù. ÀÌ
»óȲÀ» ÄÚµå·Î ±¸ÇöÇØ º¸ÀÚ.
NewVideo |
|
using
System; delegate
void Notice(string Movie); class Mania
{ private
int id; public
Mania(int aid) { id
= aid; } public
void RendMe(string Movie) { Console.WriteLine($"{id}¹ø
°í°´ÀÌ {Movie}¸¦ ºô·Á°£´Ù."); } } class CSTest
{ static
void Main() { Mania[]
arMania = new Mania[10]; for
(int i = 0; i < 10; i++) { arMania[i]
= new Mania(i); } Notice
RentCall = null; RentCall
+= arMania[1].RendMe; RentCall
+= arMania[4].RendMe; RentCall
+= arMania[6].RendMe; RentCall
+= arMania[9].RendMe; RentCall("¿¬ÇʺÎÀÎ
Èæ½É Ç°¾ú³×"); } } |
|
½ÇÇà°á°ú |
1¹ø °í°´ÀÌ
¿¬ÇʺÎÀÎ Èæ½É Ç°¾ú³×¸¦ ºô·Á°£´Ù. 4¹ø °í°´ÀÌ
¿¬ÇʺÎÀÎ Èæ½É Ç°¾ú³×¸¦ ºô·Á°£´Ù. 6¹ø °í°´ÀÌ
¿¬ÇʺÎÀÎ Èæ½É Ç°¾ú³×¸¦ ºô·Á°£´Ù. 9¹ø °í°´ÀÌ
¿¬ÇʺÎÀÎ Èæ½É Ç°¾ú³×¸¦ ºô·Á°£´Ù. |
°í°´Àº °íÀ¯ÀÇ ID¸¦ °¡Áö¸ç ºñµð¿À¸¦ ºô·Á º¸´Â RendMe µ¿ÀÛÀ» ÇÑ´Ù. Main¿¡¼ 10¸íÀÇ °í°´ °´Ã¼¸¦ »ý¼ºÇß´Ù. Notice´Â ºñµð¿À¸¦ ºô·Á º¸´Â
¸Þ¼µåÀÇ ¸ñ·ÏÀ» °¡¸®Å°´Â ŸÀÔÀ̸ç Àμö´Â ºô·Áº¼ ºñµð¿À Á¦¸ñÀÌ´Ù. RentCall °´Ã¼´Â ÃÖ½ÅÀÛÀ» ±â´Ù¸®´Â
°í°´ÀÇ RendMe ¸Þ¼µå ¸ñ·ÏÀ» °¡Áø´Ù.
RentCall µ¨¸®°ÔÀÌÆ®¿¡ °í°´ÀÇ
RendMe ¸Þ¼µå¸¦ µî·ÏÇÏ´Â °ÍÀº "ÃÖ½ÅÀÛÀÌ ³ª¿À¸é ÀúÇÑÅ× Á» ºô·Á ÁÖ¼¼¿ä"¶ó°í ¹Ì¸® ºÎŹÇØ ³õ´Â °ÍÀÌ´Ù. 1, 4, 6, 9¹ø °í°´ÀÌ
µî·ÏÇßÀ¸¸ç »çÀå´ÔÀº ÃÖ½ÅÀÛÀÌ ³ª¿À´Â Áï½Ã RentCall¸¸ È£ÃâÇÏ¸é µÈ´Ù. ÀÌ ¸ñ·Ï¿¡ µî·ÏµÈ °í°´ÀÌ ¼ø¼´ë·Î ¿Í ºñµð¿À¸¦ ºô·Á°£´Ù. ¸ÖƼij½ºÆ®°¡
¾ø´Ù¸é º°µµÀÇ ÀÚ·á ±¸Á¶¸¦ ¸¸µé¾î ¸ñ·ÏÀ» ÀÛ¼ºÇÏ°í ÃÖ½ÅÀÛ ¹ßÇ¥ »ç½ÇÀ» °í°´µé¿¡°Ô ¾Ë¸®±â À§ÇØ ·çÇÁ¸¦ µ¹¾Æ¾ß ÇÑ´Ù.
¾î·ÆÁö´Â ¾ÊÁö¸¸ Á÷Á¢ Çϱâ´Â ±ÍÂú´Ù. ÀÌ ÀÛ¾÷À» ´ë½ÅÇØ ÁÖ´Â °ÍÀÌ ¸ÖƼij½ºÆ® µ¨¸®°ÔÀÌÆ®ÀÌ´Ù.
À̺¥Æ®(Event)´Â ¸ÖƼij½ºÆ® µ¨¸®°ÔÀÌÆ®·Î ±¸ÇöµÇ¸ç ¾î¶² »ç°ÇÀÌ
¹ß»ýÇßÀ» ¶§ È£ÃâÇÒ ¸Þ¼µåÀÇ ¸ñ·ÏÀÌ´Ù. À̺¥Æ®¿¡ ÀÇÇØ È£ÃâµÇ´Â ¸Þ¼µå¸¦ À̺¥Æ® Çڵ鷯¶ó°í ºÎ¸¥´Ù. ¸Þ½ÃÁö ±¸µ¿ ½Ã½ºÅÛ¿¡¼ Äڵ带 ¼øÂ÷ÀûÀ¸·Î ½ÇÇàÇÏÁö ¾Ê°í ¹ß»ýÇÑ »ç°Ç¿¡ µû¶ó ¹ÝÀÀÇÏ´Â ¹æ½ÄÀ¸·Î ó¸®ÇÑ´Ù.
»ç¿ëÀÚ³ª ÁÖº¯ ÀåÄ¡¿¡ ÀÇÇØ ¹ß»ýÇÏ´Â ÀÏüÀÇ º¯È¸¦ À̺¥Æ®¶ó°í ÇÏ¸ç ¿î¿µÃ¼Á¦´Â À̺¥Æ®°¡ ¹ß»ýÇÒ ¶§¸¶´Ù ¸Þ½ÃÁö¸¦
º¸³» ó¸®ÇÒ ±âȸ¸¦ Á¦°øÇÏ´Ù. ¸Þ½ÃÁö¸¦ °´Ã¼ÁöÇâÀûÀ¸·Î ĸ½¶ÈÇÑ °ÍÀÌ ¹Ù·Î À̺¥Æ®ÀÌ´Ù. À̺¥Æ®ÀÇ ¼±¾ð Çü½ÄÀº ´ÙÀ½°ú °°´Ù.
ÁöÁ¤ÀÚ event µ¨¸®°ÔÀÌÆ® À̸§;
À̺¥Æ®´Â µ¨¸®°ÔÀÌÆ®ÀÇ °´Ã¼ Çü½ÄÀ¸·Î ¼±¾ðÇÑ´Ù. µ¨¸®°ÔÀÌÆ®´Â ¾î¶² Àμö¸¦
¹Þ´ÂÁö Á¤ÀÇÇÏ¿© À̺¥Æ® Çڵ鷯ÀÇ ÇüŸ¦ ±ÔÁ¤ÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â µ¥ÀÌÅÍ ¼ö½Å °´Ã¼°¡ ³×Æ®¿÷À¸·Î µ¥ÀÌÅ͸¦
Àü¼Û¹Þ´Ù°¡ ¿Ï·áµÇ¸é À̺¥Æ®·Î ÁöÁ¤ÇÑ ¸Þ¼µå¸¦ È£ÃâÇÏ¿© Àü¼Û ¿Ï·á »ç½ÇÀ» ¾Ë¸°´Ù.
CompleteEvent |
½ÇÇà°á°ú |
using
System; delegate
void Notice(); class
Printer { public
void Print() { Console.WriteLine("¼ö½ÅµÈ
µ¥ÀÌÅ͸¦ ÀμâÇÕ´Ï´Ù."); } } class Receiver
{ public
event Notice OnComplete; public
void Receive() { for
(int i = 0; i < 100; i += 10) { Console.WriteLine(i
+ "% ¼ö½ÅÁß"); System.Threading.Thread.Sleep(200); } if
(OnComplete != null) OnComplete(); } } class CSTest
{ static
void Main() { Printer
P = new Printer(); Receiver
R = new Receiver(); R.OnComplete
+= P.Print; R.Receive(); } } |
0% ¼ö½ÅÁß 10% ¼ö½ÅÁß 20% ¼ö½ÅÁß 30% ¼ö½ÅÁß 40% ¼ö½ÅÁß 50% ¼ö½ÅÁß 60% ¼ö½ÅÁß 70% ¼ö½ÅÁß 80% ¼ö½ÅÁß 90% ¼ö½ÅÁß ¼ö½ÅµÈ µ¥ÀÌÅ͸¦ ÀμâÇÕ´Ï´Ù. |
¼øÂ÷ÀûÀ¸·Î ¸Þ½ÃÁö¸¦ ¼ö½ÅÇÏ¸ç ¿Ï·á½Ã ÀμâÇÑ´Ù. Receiver Ŭ·¡½ºÀÇ Receive ¸Þ¼µå´Â ³×Æ®¿÷¿¡¼ µ¥ÀÌÅ͸¦ ¼ö½ÅÇϴµ¥ ²Ï ¿À·£ ½Ã°£ÀÌ °É¸°´Ù.
È£Ãâ¿ø¿¡¼ ¼ö½ÅÀÌ ¿Ï·áµÉ ¶§ ¾î¶² µ¿ÀÛ, ¿¹¸¦ µé¾î ÀμâÇÏ°í ½Í´Ù¸é À̺¥Æ®¸¦ µî·ÏÇØ µÐ´Ù. Receiver Ŭ·¡½º´Â ¼ö½Å ¿Ï·á½Ã È£ÃâÇÒ ¸Þ¼µå¸¦ ÀúÀåÇϱâ À§ÇØ
Notice ŸÀÔÀÇ OnComplete À̺¥Æ®¸¦ °¡Áø´Ù.
Notice´Â ´Ü¼øÈ÷ ÀÛ¾÷ ¿Ï·á »ç½Ç¸¸ Å뺸 ¹ÞÀ¸¹Ç·Î Àμö³ª ¸®ÅÏ°ªÀº ¾ø´Ù.
Receive¸¦ È£ÃâÇϱâ Àü¿¡
OnComplete À̺¥Æ®¿¡ ¼ö½Å ¿Ï·á ÈÄ¿¡ È£ÃâÇÒ ¸Þ¼µå¸¦ ¹Ì¸® µî·ÏÇØ µÐ´Ù. Àμ⸦
´ã´çÇÏ´Â Printer °´Ã¼ÀÇ Print ¸Þ¼µå¸¦ OnComplete À̺¥Æ®¿¡ µî·ÏÇÏ¿© ¼ö½Å ¿Ï·á »ç°Ç¿¡ ´ëÇØ Àμ⠵¿ÀÛÀ¸·Î ¹ÝÀÀÇÑ´Ù. À̺¥Æ® Çڵ鷯¸¦ µî·ÏÇØ ³õÁö ¾ÊÀ¸¸é ¼ö½Å¸¸ µÉ »Ó È£Ãâ¿øÀÌ ¼ö½Å ¿Ï·á »ç½ÇÀ» ¾Ë ¼ö ¾ø´Ù.
ÀÌ ¿¹Á¦ÀÇ °æ¿ì Receive ¸Þ¼µå°¡ ¸®ÅÏÇÒ ¶§°¡ ¼ö½Å ¿Ï·á ½ÃÁ¡À̸ç
À̶§ Àμâ ÀÛ¾÷À» Çصµ µÈ´Ù. ±×·¯³ª ¿©·¯ °³ÀÇ ÀÛ¾÷ÀÌ ºñµ¿±âÀûÀ¸·Î ÁøÇàµÇ´Â ¸ÖƼ ½º·¹µå ȯ°æ¿¡¼´Â
¿Ï·á ½ÃÁ¡À» Á¤È®È÷ ¾Ë ¼ö ¾ø´Ù. ±×·¡¼ °¢ °´Ã¼°¡ °íÀ¯ÀÇ ÀÛ¾÷À» ¾Ë¾Æ¼ ó¸®Ç쵂 ¿äûÇÑ »ç°ÇÀÌ ¹ß»ýÇÒ
¶§ ¼·Î Åë½ÅÇÒ ¼ö ÀÖ´Â À̺¥Æ®°¡ ÇÊ¿äÇÏ´Ù.
À̺¥Æ®¿¡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸°¡ ÀÖÀ¸¸é À̺¥Æ® Çڵ鷯·Î Àμö¸¦ Àü´ÞÇÑ´Ù. À̺¥Æ®¸¦
¹ß»ý½ÃŲ ÁÖü¿Í À̺¥Æ®¿¡ ´ëÇÑ Á¤º¸¸¦ EventArgs µîÀÇ °´Ã¼·Î Àü´ÞÇÑ´Ù. ¼ö½Å °´Ã¼°¡ µÑ ÀÌ»óÀÌ¸é ´©°¡ ¼ö½Å ¿Ï·áÇß´ÂÁö ¾Ë·Á¾ß ÇÏ¸ç ¼ö½ÅµÈ ÆÄÀÏ¿¡ ´ëÇÑ Á¤º¸µµ ÇÊ¿äÇÏ´Ù.
À̺¥Æ® Çڵ鷯´Â ¹ß»ýÇÑ »ç°ÇÀ» ó¸®ÇÒ »Ó ¿äûÀ̳ª Áú¹®¿¡ ÀÀ´äÇÏ´Â °ÍÀÌ ¾Æ´Ï¾î¼ ¸®ÅÏ°ªÀº ¾ø´Ù. º¸Åë ºñµ¿±âÀûÀ¸·Î È£ÃâµÇ¾î ¸®ÅÏÀ» ¹Þ¾ÆÁÙ ÁÖüµµ ¾ø´Ù. ²À ¸®ÅÏÀÌ
ÇÊ¿äÇÏ´Ù¸é Ãâ·Â¿ë Àμö¸¦ ´ë½Å »ç¿ëÇÑ´Ù.
µ¨¸®°ÔÀÌÆ®¿Í À̺¥Æ®´Â °ÅÀÇ ºñ½ÁÇÏ´Ù. ¸Þ¼µåÀÇ ¸ñ·ÏÀ» ÀúÀåÇÏ´Â °ÍÀº
µ¨¸®°ÔÀÌÆ®·Îµµ ÃæºÐÇѵ¥ ¿Ö ±»ÀÌ À̺¥Æ®¶ó´Â °ÍÀ» ¶Ç ¸¸µç °ÍÀϱî? À§ ¿¹Á¦ÀÇ OnComplete ¼±¾ð¹®¿¡¼ event Å°¿öµå¸¦ »©°í µ¨¸®°ÔÀÌÆ®·Î
¼±¾ðÇصµ Àß µ¿ÀÛÇÑ´Ù.
public Notice OnComplete;
À̺¥Æ®¿Í µ¨¸®°ÔÀÌÆ®´Â »ç¿ë ¸ñÀûÀÌ °°´Ù. ±×·¯³ª Á¤¸» ¶È°°´Ù¸é ±»ÀÌ
À̺¥Æ®¶ó´Â °ÍÀ» Á¤ÀÇÇØ ³õ¾ÒÀ» ¸®°¡ ¾ø´Ù. À̺¥Æ®´Â µ¨¸®°ÔÀÌÆ®¿¡ ºñÇØ ±â´ÉÀÌ Á¦ÇÑÀûÀÌ´Ù. Çڵ鷯¸¦ Ãß°¡, »èÁ¦¸¸ ÇÒ ¼ö ÀÖ°í ¸ñ·ÏÀ» º¸°Å³ª °ü¸®ÇÒ ¼ö´Â ¾ø´Ù. À̺¥Æ®¿¡ ÀÌ·± °í±Þ ±â´É±îÁö ÇÊ¿ä ¾øÀ¸¸ç ÀÖ¾î ºÁ¾ß ³À̵µ¸¸ ³ô¾ÆÁö°í ºÎÁÖÀÇÇÑ »ç¿ëÀ¸·Î ÀÎÇØ ¾ÈÁ¤¼º±îÁö À§Çù¹Þ´Â´Ù. ±×·¡¼ µ¨¸®°ÔÀÌÆ®´Â ¼û±â°í ÃÖÁ¾ »ç¿ëÀÚ°¡ Æí¸®ÇÏ°Ô ¾µ ¼ö ÀÖ´Â ´õ °£´ÜÇÑ À̺¥Æ®¸¸ °ø°³ÇÑ´Ù.
ÄÄÆÄÀÏ·¯´Â À̺¥Æ®¿¡ ¸Þ¼µå¸¦ ÷»èÇÏ´Â Á¢±ÙÀÚ¸¦ Á¤±³ÇÏ°Ô ÀÛ¼ºÇÏ¿© ¸ÖƼ ½º·¹µå¿¡ ´ëÇؼµµ ¾ÈÀüÇÏ´Ù. Á¢±ÙÀÚ´Â ½º·¹µå¿¡ ¾ÈÀüÇÑ ¹æ¹ýÀ¸·Î ¸Þ¼µå¸¦ ÷»èÇÑ´Ù. ¾Õ ¿¹Á¦ÀÇ OnComplete À̺¥Æ®´Â ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ ´ÙÀ½°ú °°ÀÌ ±¸ÇöµÈ´Ù. À̺¥Æ®
¼±¾ð¹®À» ÀÌ ÄÚµå·Î ´ëüÇصµ Àß µ¿ÀÛÇÑ´Ù.
public Notice __OnComplete;
public event Notice OnComplete {
add
{
lock
(this) { __OnComplete += value; }
}
remove
{
lock
(this) { __OnComplete -= value; }
}
}
µ¨¸®°ÔÀÌÆ®´Â __OnComplete¶ó´Â À̸§À¸·Î ¼û±ä´Ù. OnComplete À̺¥Æ® ³»ºÎ¿¡´Â add, remove Á¢±ÙÀÚ
ºí·ÏÀÌ »ý¼ºµÇ¸ç À̺¥Æ®¿¡ ´ëÇØ += ¿¬»êÀ» Çϸé add°¡
È£ÃâµÇ°í -= ¿¬»êÀ» Çϸé remove°¡ È£ÃâµÈ´Ù. »ç¿ëÀÚ°¡ À̺¥Æ®¿¡ ´ëÇØ ÇÒ ¼ö ÀÖ´Â Á¶ÀÛÀº ÀÌ µÎ °¡Áö¿Í À̺¥Æ®¸¦ È£ÃâÇÏ´Â °Í »ÓÀÌ´Ù.
Á¢±ÙÀÚ´Â ´ë»ó ¸Þ¼µå¸¦ ¾Ï½ÃÀû Àμö value·Î ¹Þ¾Æ ¼û°ÜÁø __OnComplete µ¨¸®°ÔÀÌÆ®¿¡ Ãß°¡ ¹× Á¦°ÅÇÑ´Ù. À̶§ lock ¸í·ÉÀ¸·Î °´Ã¼¸¦ Àá±Å ´Ù¸¥ ½º·¹µå°¡ ¹æÇØÇÏÁö ¾Êµµ·Ï ÇÑ´Ù. ¸ÖƼ
½º·¹µå ȯ°æ¿¡¼´Â ÇϳªÀÇ ´ë»óÀ» µ¿½Ã¿¡ ¼öÁ¤ÇÏ¿© ¹Î°¨ÇÑ ¹®Á¦°¡ ¹ß»ýÇϴµ¥ lock¸í·ÉÀ¸·Î µ¿±âÈÇÏ¿©
¸»½éÀ» ¿øõ Â÷´ÜÇÑ´Ù.
add, remove Á¢±ÙÀÚ¸¦ Á÷Á¢ ÀÛ¼ºÇÏ¸é ¸ñ·ÏÀ» ´õ È¿À²ÀûÀ¸·Î
°ü¸®Çϰųª null ÂüÁ¶¿¡ ´ëÇÑ ¿¡·¯±îÁö ¼¶¼¼ÇÏ°Ô Ã³¸®ÇÒ ¼ö ÀÖ´Ù. ¸ñ·ÏÀ̶ó°í
ÇØ ºÁ¾ß ±â²¯ ÇÑ µÎ °³ÀÇ ¸Þ¼µå¿¡ ºÒ°úÇØ °í±Þ ±â´É±îÁö´Â ÇÊ¿ä ¾ø´Ù. ÄÄÆÄÀÏ·¯ÀÇ ÀÚµ¿ Äڵ常 Çصµ
ÃæºÐÇÏ´Ù. À̺¥Æ®´Â µ¨¸®°ÔÀÌÆ®ÀÇ º¹ÀâÇÑ ¹®¹ýÀ» ¼û°Ü ÆíÀǼºÀ» ³ôÀÌ°í ³À̵µ¸¦ ¶³¾î¶ß¸°´Ù. µðÀÚÀΠŸÀÓ¿¡ ºñÁÖ¾ó ¹æ½ÄÀÇ Çڵ鷯 ÆíÁýÀÌ °¡´ÉÇØ Æí¸®ÇÏ°í »ý»ê¼ºÀÌ Çâ»óµÈ´Ù.
ºñÁÖ¾ó ½ºÆ©µð¿À´Â ÀÌ·± ±â´ÉÀ» ÈǸ¢ÇÏ°Ô Áö¿øÇϴµ¥ ¹öÆ°ÀÇ Å¬¸¯ À̺¥Æ®¸¦ ó¸®ÇØ º¸ÀÚ.
ClickEvent |
½ÇÇà°á°ú |
using
System; public
delegate void DeleClick(); class Button
{ public
event DeleClick Click; public
void Draw() { Console.WriteLine("³ª´Â
¹öÆ°ÀÔ´Ï´Ù."); } public
void OnClick() { if
(Click != null) Click(); } } class CSTest
{ static
void GameStart() { Console.WriteLine("°ÔÀÓÀ»
½ÃÀÛÇÕ´Ï´Ù."); for
(int i = 0; i < 50; i++) { Console.Write('.'); System.Threading.Thread.Sleep(50); } Console.WriteLine("\n°ÔÀÓ
³¡³µ´Ù Ä¡°í."); } static
void Main() { Button
BtnStart = new Button(); BtnStart.Draw(); BtnStart.Click
+= GameStart; Console.WriteLine("S:°ÔÀÓ
½ÃÀÛ , E:³¡"); for
(; ; ) { if
(Console.KeyAvailable) { ConsoleKeyInfo
cki; cki
= Console.ReadKey(); if
(cki.Key == ConsoleKey.S) { BtnStart.OnClick(); } if
(cki.Key == ConsoleKey.E) { break; } } System.Threading.Thread.Sleep(100); } } } |
³ª´Â ¹öÆ°ÀÔ´Ï´Ù. S:°ÔÀÓ ½ÃÀÛ , E:³¡ s°ÔÀÓÀ» ½ÃÀÛÇÕ´Ï´Ù. .................................................. °ÔÀÓ ³¡³µ´Ù Ä¡°í. s°ÔÀÓÀ» ½ÃÀÛÇÕ´Ï´Ù. .................................................. °ÔÀÓ ³¡³µ´Ù Ä¡°í. |
¹öÆ°ÀÇ Ä¸¼ÇÀÌ Ãâ·ÂµÇ°í ´©¸£¸é °ÔÀÓÀ» ½ÃÀÛÇϰųª ³¡³½´Ù. ¹öÆ°Àº ¸¶¿ì½º·Î
Ŭ¸¯ÇÏ´Â ÀåÄ¡ÀÌÁö¸¸ Äֿܼ¡¼ ¸¶¿ì½º¸¦ ¾µ ¼ö ¾ø¾î(Á¤¸» ¸ø¾²´Â °Ç ¾Æ´ÏÁö¸¸ ¹ø°Å·Ó´Ù.) ÆíÀÇ»ó Å°º¸µå S¸¦ ´©¸£´Â °ÍÀ¸·Î Ŭ¸¯À» ´ë½ÅÇß´Ù. Button Ŭ·¡½º¿¡ Click À̺¥Æ®°¡ ¼±¾ðµÇ¾î ÀÖ°í Main¿¡¼ GameStart Çڵ鷯¸¦ ÇÒ´çÇß´Ù. SÅ°¸¦ ´©¸£¸é ¹öÆ°ÀÇ OnClick ¸Þ¼µå°¡ È£ÃâµÇ°í ¿©±â¼ Click¿¡ ÀúÀåµÈ ¸Þ¼µå¸¦ È£ÃâÇÏ¿© °ÔÀÓÀ» ½ÃÀÛÇÑ´Ù.
ÅؽºÆ® ȯ°æÀ̶ó Èä³»¸¸ ³Â´Âµ¥ °³³ä¸¸ ÀÌÇØÇÏ°í ³Ñ¾î°¡ÀÚ. ±×·¡ÇÈ È¯°æ¿¡¼
À̺¥Æ®¸¦ µî·ÏÇÏ°í ÆíÁýÇÏ´Â °ÍÀº °³¹ßÅøÀÌ ´Ù Çϵµ·Ï µÇ¾î ÀÖ¾î °³¹ßÅø »ç¿ë¹ý¸¸ Àß ÀÍÈ÷¸é µÈ´Ù. ´Ù¸¸
°³¹ßÅøÀÌ ³»ºÎ¿¡¼ ¾î¶² µ¿ÀÛÀ» ÇÑ´Ù´Â °Í°ú °³¹ßÅøÀÌ »ý¼ºÇÑ Äڵ带 ÀÌÇØÇϸé ÀÀ¿ë·ÂÀÌ ´õ ³Ð¾îÁø´Ù.
µ¨¸®°ÔÀÌÆ®ÀÇ ÂüÁ¶ ´ë»óÀº Äڵ带 °¡Áö´Â ¸Þ¼µåÀÌ¸ç µû¶ó¼ µ¨¸®°ÔÀÌÆ®¸¦ »ç¿ëÇÏ·Á¸é ¿øÇüÀÌ °°Àº ¸Þ¼µå°¡ Á¸ÀçÇؾß
ÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â µÎ Á¤¼ö¸¦ ¹Þ¾Æ ÇÕÀ» ¸®ÅÏÇÏ´Â ÇÔ¼ö¸¦ °°Àº ¿øÇüÀÇ µ¨¸®°ÔÀÌÆ®·Î °£Á¢ÀûÀ¸·Î È£ÃâÇÑ´Ù.
DeleCall |
½ÇÇà°á°ú |
using
System; delegate int
Dele(int a, int b); class CSTest
{ public
static int Add(int a, int b) { return
a + b; } static
void Main() { Dele
d = Add; int
k = d(2, 3); Console.WriteLine(k); } } |
5 |
ƯÁ¤ µ¨¸®°ÔÀÌÆ®°¡ ¿ä±¸ÇÏ´Â Äڵ带 ½ÇÇàÇÏ·Á¸é ¸Þ¼µå¸¦ µû·Î ¸¸µé¾î¾ß ÇÑ´Ù. Äڵ带
´ãÀ» ¼ö ÀÖ´Â ÃÖ¼ÒÇÑÀÇ ´ÜÀ§°¡ ¸Þ¼µåÀ̱⠶§¹®ÀÌ´Ù. ±îÁþ°Å Çϳª ¸¸µé¸é µÇÁö¸¸ return a + b°°Àº ªÀº Äڵ峪 ÇÑ ÁÙÂ¥¸® À̺¥Æ® Çڵ鷯¸¦ ÀÏÀÏÀÌ ¸¸µå´Â °ÍÀº ºÎ´ã½º·´´Ù.
½ÇÁ¦ Äڵ庸´Ù Çì´õ³ª º»Ã¼¸¦ °¨½Î´Â ºí·ÏÀÌ ´õ ±æ°í ¸Þ¼µå°¡ ¸¹À¸¸é °ü¸®Çϱ⵵ ¹ø°Å·Ó´Ù. À̺¥Æ® Çڵ鷯´Â ƯÁ¤ÇÑ »óȲ¿¡¼ µü ÇÑ ¹ø¸¸ È£ÃâµÇ´Â ÀÏȸ¿ëÀÌ¾î¼ ¹Ýº¹ Á¦°ÅÀÇ Àǹ̵µ ¾ø°í ÀÏÀÏÀÌ À̸§À» ºÙÀÌ´Â
°ÍÁ¶Â÷µµ ±ÍÂú´Ù. ±×·¡¼ ´å³Ý 2.0ºÎÅÍ´Â À̸§¾ø´Â À͸í
¸Þ¼µå¸¦ Áö¿øÇÑ´Ù.
delegate(Àμö ¸ñ·Ï) { ¸Þ¼µå
ÄÚµå };
delegate Å°¿öµå·Î ½ÃÀÛÇϸç Àμö ¸ñ·Ï°ú { } ºí·Ï ¾ÈÀÇ º»Ã¼¸¦ Á¤ÀÇÇÑ´Ù. Add ¸Þ¼µå¸¦ ÀÍ¸í ¸Þ¼µå·Î ÀÛ¼ºÇØ
º¸ÀÚ.
Anonymous |
using
System; delegate int
Dele(int a, int b); class CSTest
{ static
void Main() { Dele
d = delegate (int a, int b) { return a + b; }; int
k = d(2, 3); Console.WriteLine(k); } } |
delegate Å°¿öµå ´ÙÀ½¿¡ Àμö ¸ñ·ÏÀ» ¾²°í º»Ã¼ ³»¿ëÀ» ÄÚµå
ºí·Ï¿¡ Áý¾î ³ÖÀ¸¸é µÈ´Ù. °°Àº ¿øÇüÀÇ µ¨¸®°ÔÀÌÆ® d·Î À͸í
¸Þ¼µå¸¦ ´ëÀÔ¹Þ¾Ò´Ù. ÀÍ¸í ¸Þ¼µå´Â °ªÀ¸·Î ºÐ·ùµÇ¹Ç·Î ´ëÀÔ¹® ³¡ÀÇ ¼¼¹ÌÄÝ·ÐÀ» »©¸ÔÁö ¾Êµµ·Ï ÁÖÀÇÇÏÀÚ. d´Â return a + b Äڵ带 °¡Áö¸ç d(2, 3) È£Ãâ¿¡ ÀÇÇØ ÀÌ ÄÚµå ºí·ÏÀÌ È£ÃâµÈ´Ù. Add ¸Þ¼µå°¡
»ç¶óÁö°í Äڵ常 ÀÍ¸í ¸Þ¼µå·Î ³²¾Ò´Ù. ÀÍ¸í ¸Þ¼µå°¡ µ¨¸®°ÔÀÌÆ®¸¦ ´ëüÇϹǷΠµ¨¸®°ÔÀÌÆ®¸¦ ¿ä±¸ÇÏ´Â ¸Þ¼µåÀÇ
½ÇÀμö·Î ³Ñ°Üµµ µÈ´Ù.
AnonPara |
using
System; delegate int
Dele(int a, int b); class CSTest
{ static
int Calc(Dele d) { return
d(2, 3); } static
void Main() { int
k; k
= Calc(delegate (int a, int b) { return a + b; }); Console.WriteLine(k); k
= Calc(delegate (int a, int b) { return a * b; }); Console.WriteLine(k); } } |
Calc ¸Þ¼µå´Â µÎ °³ÀÇ Á¤¼ö¸¦ ÃëÇÏ´Â ¸Þ¼µå¸¦ Àμö·Î ¹Þ¾Æ ´ë½Å
È£ÃâÇÑ´Ù. Dele ŸÀÔÀÇ ¸Þ¼µå°¡ ÇÊ¿äÇÏÁö¸¸ ÀÏÀÏÀÌ ¸¸µé ÇÊ¿ä ¾øÀÌ È£Ãâ¹®¿¡¼ ÀÍ¸í ¸Þ¼µå¸¦ ¸¸µé¾î
¹Ù·Î ³Ñ°Ü ¹ö¸®¸é µÈ´Ù.
µ¨¸®°ÔÀÌÆ®¿¡ ´ëÀԵǴ ÀÍ¸í ¸Þ¼µå´Â µ¨¸®°ÔÀÌÆ®°¡ ¿ä±¸ÇÏ´Â ¿øÇü°ú ÀÏÄ¡ÇÏ´Â °ÍÀÌ ÀÌ»óÀûÀÌ´Ù. ±×·¯³ª Á¤È®ÇÏ°Ô ÀÏÄ¡ÇÏÁö ¾Ê´õ¶óµµ ´ëÀÔÀÌ Çã¿ëµÇ´Â °æ¿ìµµ ÀÖ´Ù. ´ÙÀ½
¿¹Á¦·Î Å×½ºÆ®ÇØ º¸ÀÚ. ÁÖ¼® ó¸®µÈ ÄÚµå´Â ¿¡·¯°¡ ¹ß»ýÇÏ´Â ÁÙÀÌ´Ù.
DeleAssign |
using
System; delegate int
Dele(int a, string b); delegate
void Deleout(int a, out int b); class CSTest
{ static
void Main() { Dele
d1 = delegate (int a, string b) { return 0; }; //dele
d2 = delegate(double a) { return 0; }; //dele
d3 = delegate(int a, string b) { }; Dele
d4 = delegate { return 0; }; int
k = d4(1, "abcd"); Deleout
d5 = delegate (int a, out int b) { b = 0; }; //deleout
d6 = delegate { }; } } |
Dele µ¨¸®°ÔÀÌÆ®´Â Á¤¼öÇü Çϳª,
¹®ÀÚ¿ Çϳª¸¦ Àμö·Î ÃëÇÏ°í int¸¦ ¸®ÅÏÇÏ´Â ¸Þ¼µå¸¦ °¡¸®Å²´Ù. Dele ŸÀÔÀÇ °´Ã¼¿¡ ¿©·¯ °¡Áö ÀÍ¸í ¸Þ¼µå¸¦ ´ëÀÔÇØ º¸¾Ò´Ù. d1¿¡
´ëÀԵǴ ÀÍ¸í ¸Þ¼µå´Â dele ŸÀÔ°ú ÀÏÄ¡ÇÏ¿© ¹®Á¦°¡ ¾ø´Ù. ¹Ý¸é d2´Â Àμö ¸ñ·ÏÀÌ ´Ù¸£°í d3´Â ¸®ÅÏ Å¸ÀÔÀÌ ¸ÂÁö ¾Ê¾Æ Dele ŸÀÔÀÇ °´Ã¼¿¡ ´ëÀÔµÇÁö ¾Ê´Â´Ù. ¿©±â±îÁö´Â Áö±ØÈ÷ »ó½ÄÀûÀÌ´Ù. ±×·±µ¥ d4¿¡ ´ëÀԵǴ ÀÍ¸í ¸Þ¼µå´Â Àμö ¸ñ·ÏÀÌ ´Ù¸£Áö¸¸ ´ëÀÔ
°¡´ÉÇÏ´Ù. ±ÔÄ¢Àº ÀÌ·¸´Ù. ÀÍ¸í ¸Þ¼µåÀÇ Àμö ¸ñ·ÏÀº µ¨¸®°ÔÀÌÆ®ÀÇ
Àμö ¸ñ·Ï°ú Á¤È®ÇÏ°Ô ÀÏÄ¡Çϰųª ¾Æ´Ï¸é ¾Æ¿¹ ¾ø¾î¾ß ÇÑ´Ù. Àμö ¸ñ·ÏÀÌ ¾ø´Ù´Â °ÍÀº º»Ã¼¿¡¼ Àμö¸¦
ÂüÁ¶ÇÏÁö ¾Ê´Â´Ù´Â ¶æÀÌ´Ù.
¹Ù·Î ¾Æ·¡ÀÇ È£Ãâ¹® d4(1, "abcd")´Â ¾Æ¹«
¹®Á¦¾øÀÌ È£ÃâµÈ´Ù. ½ÇÀμö 1°ú "abcd"°¡ Àü´ÞµÇÁö¸¸ ÀÍ¸í ¸Þ¼µå¿¡¼ ÂüÁ¶ÇÏÁö ¾Ê´Â´Ù. Àü´ÞµÇÁö
¾ÊÀº Àμö¸¦ ÂüÁ¶ÇÏ´Â °ÍÀº ºÒ°¡´ÉÇÏÁö¸¸ Àü´ÞµÈ Àμö¸¦ ¹«½ÃÇÏ´Â °ÍÀº °¡´ÉÇÏ´Ù. ±×·¯³ª Ãâ·Â¿ë Àμö´Â
È£Ãâ¿ø¿¡¼ ´ëÀÔÇØ Áֱ⸦ °Á¦ÇÏ´Â °ÍÀÌ¾î¼ »ý·«ÇÒ ¼ö ¾ø´Ù. Deleout ŸÀÔÀº Ãâ·Â¿ë Àμö°¡ ÀÖ´Â
¸Þ¼µå¸¦ °¡¸®Å²´Ù. d5´Â ¿øÇü°ú ÀÏÄ¡ÇÏ´Â ÀÍ¸í ¸Þ¼µå¸¦ ´ëÀÔ¹Þ¾ÒÀ¸¸ç ÄÚµå ºí·Ï¿¡¼ bÀÇ °ªÀ» ´ëÀÔÇϹǷΠÁ¤»óÀûÀÌ´Ù. ¹Ý¸é d6´Â Àμö ¸ñ·ÏÀÌ ¾Æ¿¹ ¾øÀ¸¸ç bÀÇ °ªÀ» ÃʱâÈÇÏ´Â Äڵ尡 ¾ø¾î
¿¡·¯ 󸮵ȴÙ.
ÀÍ¸í ¸Þ¼µåÀÇ Àμö´Â ÄÚµå ºí·Ï¿¡¼¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Â Áö¿ªº¯¼ö´Ù. ºí·Ï³»¿¡¼
´õ ÇÊ¿äÇÑ Áö¿ªº¯¼ö¸¦ ¼±¾ðÇØ ¾µ ¼öµµ ÀÖ´Ù. Àμö ¹× Áö¿ªº¯¼ö ¿Ü¿¡ ÀÍ¸í ¸Þ¼µå°¡ ¼ÓÇÑ ºí·ÏÀÇ Áö¿ªº¯¼öµµ
ÂüÁ¶ÇÒ ¼ö Àִµ¥ À̸¦ ¿ÜºÎ º¯¼ö ¶Ç´Â ĸóµÈ º¯¼ö¶ó°í ÇÑ´Ù.
Capture |
½ÇÇà°á°ú |
using
System; delegate int
Dele(int a, int b); class CSTest
{ public
static void SetDelegate(out Dele d) { int
k = 5; d
= delegate (int a, int b) { return a + b + k; }; } static
void Main() { Dele
d; SetDelegate(out
d); int
z = d(2, 3); Console.WriteLine(z); } } |
10 |
SetDelegate ¸Þ¼µå´Â Ãâ·Â¿ë Àμö·Î Àü´ÞµÈ d¿¡ ÀÍ¸í ¸Þ¼µå¸¦ Á¤ÀÇÇÏ¿© ´ëÀÔÇÑ´Ù. a, b´Â ÀÍ¸í ¸Þ¼µåÀÇ Áö¿ªº¯¼öÀ̹ǷÎ
ÄÚµå ºí·Ï¿¡¼ »ç¿ë °¡´ÉÇÏ´Ù. SetDelegateÀÇ Áö¿ªº¯¼ö kµµ
ÂüÁ¶ÇÒ ¼ö Àִµ¥ ÀÌ º¯¼ö°¡ ¹Ù·Î ¿ÜºÎ º¯¼öÀÌ´Ù. ÀÍ¸í ¸Þ¼µå°¡ ÀÚ½ÅÀÌ ¼ÓÇÑ ºí·ÏÀÇ Áö¿ªº¯¼ö¸¦ ÂüÁ¶ÇÏ´Â
°ÍÀº ¾îÂî º¸¸é ÀÚ¿¬½º·¯¿ö º¸ÀδÙ. À̶§ ¿ÜºÎ º¯¼öÀÇ »ý¸íÀÌ ¹®Á¦°¡ µÈ´Ù. ÀÍ¸í ¸Þ¼µå´Â Á¤ÀÇ ½ÃÁ¡°ú È£Ãâ ½ÃÁ¡ÀÌ ´Þ¶ó È£ÃâµÉ °¡´É¼ºÀÌ ÀÖ´Â µ¿¾È¿¡´Â ¿ÜºÎ º¯¼öµµ °è¼Ó À¯È¿ÇØ¾ß ÇÑ´Ù.
±×·¡¼ ÀÍ¸í ¸Þ¼µå¸¦ ÂüÁ¶ÇÏ´Â µ¨¸®°ÔÀÌÆ®°¡ ¸ðµÎ Á¦°ÅµÉ ¶§±îÁö ¿ÜºÎ º¯¼öÀÇ »ý¸íÀº ¿¬ÀåµÈ´Ù. ¿ÜºÎ º¯¼ö°¡ ÀÍ¸í ¸Þ¼µå¿¡ ÀÇÇØ ºÙÀâÈù ²ÃÀ̶ó ĸóµÈ º¯¼ö¶ó°í ºÎ¸¥´Ù. k´Â SetDelegate ¸Þ¼µåÀÇ Áö¿ªº¯¼ö¿¡ ºÒ°úÇÏÁö¸¸ ÀÚ½ÅÀ» ÂüÁ¶ÇÏ´Â ÀÍ¸í ¸Þ¼µå°¡ ÀÖ´Â ÇÑ °è¼Ó ³²¾Æ ÀÖ¾î¾ß
ÇÑ´Ù. d¸¦ È£ÃâÇÒ ¶§±îÁö k´Â ¸Þ¸ð¸®¿¡ ³²¾Æ ÀÖÀ¸¸ç ±×·¡¼ 2, 3°ú kÀÇ °ª 5¸¦
´õÇÑ 10ÀÌ Ãâ·ÂµÈ´Ù. d°¡ Á¦°ÅµÉ ¶§ kµµ °°ÀÌ Á¦°ÅµÈ´Ù.
ÀÍ¸í ¸Þ¼µå¿¡´Â º¹ÀâÇÑ ±ÔÄ¢ÀÌ Àû¿ëµÈ´Ù. goto ¸í·ÉÀ¸·Î ÀÍ¸í ¸Þ¼µå
ºí·Ï ¾ÈÀ¸·Î Á¡ÇÁÇÒ ¼ö ¾ø°í ¿©·¯ °³ÀÇ ÀÍ¸í ¸Þ¼µå°¡ ÇϳªÀÇ ¿ÜºÎ º¯¼ö¸¦ °øÀ¯ÇÒ ¼ö ÀÖ´Ù. ÀÌ·± ±ÔÄ¢Àº
¿±±âÀûÀÌ°í ºñÁ¤»óÀûÀÎ »óȲ¿¡ ´ëóÇϱâ À§ÇØ ¸¶·ÃµÈ °ÍÀÌ¸ç º¹Àâµµ¿¡ ºñÇØ ½Ç¿ë¼ºÀÌ ¶³¾îÁ® Á¤È®È÷ ¾Ë ÇÊ¿ä ¾ø´Ù. »ó½Ä¿¡
¸Â°Ô¸¸ ÀÛ¼ºÇÏ¸é µÈ´Ù.