[C#°ú Ç÷¡½Ã·Î ¿Â¶óÀÎ °ÔÀÓ ¸¸µé±â] ¨ç µ¨¸®°ÔÀÌÆ® ÀÌÇØ
¿ÃÇØ 3¿ù ´å³Ý Á¤½Ä ¹öÀüÀÌ ¹ßÇ¥µÇ¸é¼ C#ÀÌ »õ·Î¿î ¾ð¾î·Î ¶°¿À¸£°í Àִµ¥, ƯÈ÷ ³×Æ®¿öÅ© ºÎºÐ¿¡¼ ±âÁ¸ÀÇ IOCP(IO Completion Port) ±â´ÉÀ» ¼Õ½±°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¸¸µé¾î ³õ¾Ò´Ù´Â Á¡¿¡¼ ÁÖ¸ñÇÒ¸¸ ÇÏ´Ù.
±âÁ¸¿¡´Â ÀÌ ±â´ÉÀ» ÀÌ¿ëÇÏ·Á¸é Win sock 2 API¸¦ Á÷Á¢ È£ÃâÇØ¾ß ÇßÁö¸¸, C#¿¡¼´Â ÀÌ ±â´ÉÀÌ BCL (Base Class Library) ¾È¿¡ Æ÷ÇԵǾî ÀÖ¾î ¼Õ½±°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. C#¿¡¼´Â ±âº»ÀûÀ¸·Î ºñµ¿±â Åë½ÅÀ» Çϸé ÀÚµ¿À¸·Î IOCP¸¦ ÀÌ¿ëÇÑ´Ù. ÀÌ´Â C# »Ó¸¸ ¾Æ´Ï¶ó ´å³ÝÀÇ ±âº» ±â´ÉÀÎ °ÍÀÌ´Ù. ¶ÇÇÑ Ç÷¡½Ã´Â À̹ø¿¡ MX ¹öÀüÀÌ Ãâ½ÃµÇ¸é¼ ¸¹Àº ±â´ÉÀÇ °³¼±ÀÌ ÀÖ¾ú´Ù. Ç÷¡½Ã 5ºÎÅÍ XML ¼ÒÄÏÀ» Áö¿øÇØ Áö¼ÓÀûÀ¸·Î ¿¬°áµÈ »óÅ¿¡¼ ³×Æ®¿öÅ© Åë½ÅÀÌ °¡´ÉÇØÁ³À¸¸ç ¿Â¶óÀÎ °ÔÀÓÀ¸·Î±îÁö ¿µ¿ªÀ» ³ÐÈú ¼ö ÀÖ°Ô µÆ´Ù.
¾ÕÀ¸·Î ÃÑ 4ȸÀÇ ¿¬À縦 ÅëÇÏ¿© ¿Â¶óÀÎ °ÔÀÓ ¼¹ö·Î¼ÀÇ C#ÀÇ °¡´É¼ºÀ» ¾Ë¾Æº¸°í, °ÔÀÓ Å¬¶óÀ̾ðÆ®·Î¼ Ç÷¡½ÃÀÇ °¡´É¼º¿¡ ´ëÇØ ¾Ë¾Æº¼ °ÍÀÌ´Ù. ±âÁ¸ ¿Â¶óÀÎ °ÔÀÓÀÇ °æ¿ì ÇÁ·Î±×·¥À» ´Ù¿î¹Þ¾Æ Ç÷¹ÀÌÇØ¾ß ÇßÀ¸³ª Ç÷¡½Ã·Î ¿Â¶óÀÎ °ÔÀÓÀ» ¸¸µé °æ¿ì, ½ºÆ®¸®¹Ö ¹æ½ÄÀ» ÀÌ¿ëÇÏ¿© º°µµÀÇ ´Ù¿î·Îµå¾øÀÌ ½Ç½Ã°£À¸·Î µ¥ÀÌÅ͸¦ ÁÖ°í¹ÞÀ½À¸·Î½á Áï½Ã Ç÷¹ÀÌ°¡ °¡´ÉÇÏ´Ù. Ãʺ¸ÀÚµµ ÇØ´ç ȨÆäÀÌÁö¿¡ Á¢¼ÓÇϱ⸸ ÇÏ¸é ¹Ù·Î Ç÷¹ÀÌÇÒ ¼ö Àֱ⠶§¹®¿¡ ´©±¸³ª ½±°Ô °ÔÀÓÀ» ½ÃÀÛÇÒ ¼ö ÀÖ´Ù.
ÇÊÀÚ´Â ÀÌ·¯ÇÑ Ç÷¡½Ã¿Í C#ÀÇ Æ¯Â¡¿¡ ÁÖ¸ñÇÏ¿© ±× °¡´É¼ºÀ» Å×½ºÆ®ÇÑ´Ù´Â Àǹ̿¡¼ Æ÷Æ®¸®½º¿Í ºñ½ÁÇÑ °ÔÀÓÀÎ ¡®½ÉÇà Æ÷Æ®¸®½º(Simple Fortress)¡¯¸¦ ¸¸µé¾î º¸¾Ò´Ù. º°µµÀÇ ´Ù¿î·Îµå ¾øÀÌ URL ÁÖ¼Ò¸¸ ÀÔ·ÂÇϸé Ç÷¹ÀÌÇÒ ¼ö ÀÖÀ¸¸ç, À¥ ºê¶ó¿ìÀú ³»¿¡¼ ½ÇÇàµÇ¹Ç·Î °ÔÀÓÀ» Çϸ鼵µ ´Ù¸¥ ÀÛ¾÷âÀ» ½ÇÇàÇÒ ¼ö ÀÖ´Ù´Â ÀÌÁ¡ÀÌ ÀÖ´Ù. º»°ÝÀûÀÎ ¼³¸í¿¡ µé¾î°¡±â Àü¿¡, ÀÌ °ÔÀÓÀº ÇÊÀÚ°¡ ´å³Ý°ú Ç÷¡½Ã¿¡ ´ëÇÑ Å×½ºÆ®¿ëÀ¸·Î ¸¸µç °ÍÀ¸·Î »ó¾÷ÀûÀ¸·Î »ç¿ëÇÒ Àǵµ°¡ ¾øÀ¸¸ç, ÀÌ °ÔÀÓÀÇ °ÅÀÇ ¸ðµç À̹ÌÁö¿Í »ç¿îµå ÆÄÀÏÀº Æ÷Æ®¸®½º 2 °ø½Ä ȨÆäÀÌÁö¿¡¼ ´Ù¿î¹Þ¾Æ »ç¿ëÇÑ °ÍÀÓÀ» ¹Ì¸® ¹àÇôµÐ´Ù.
½ÉÇà Æ÷Æ®¸®½º ¹Ì¸®º¸±â
¾ÕÀ¸·Î ¿ì¸®°¡ ¸¸µé °ÔÀÓÀÌ ¾î¶² °ÔÀÓÀÎÁö ÇÑ ¹ø º¸µµ·Ï ÇÏÀÚ. ¡®ÀÌ´ÞÀÇ µð½ºÄÏ¡¯ÀÇ ¾ÐÃàÀ» Ç®¸é Server¿Í Client µÎ °³ÀÇ Æú´õ°¡ ÀÖÀ» °ÍÀÌ´Ù. ÀÌÁß Server Æú´õ¿¡¼ FortressServer.exe¸¦ ½ÇÇàÇÏ¸é ¼¹ö°¡ ÀÛµ¿ÇÑ´Ù(ÀÌ ¼¹ö ÇÁ·Î±×·¥Àº ´å³Ý ±â¹Ý ÇÏ¿¡¼¸¸ ÀÛµ¿Çϱ⠶§¹®¿¡ ÃÖ¼ÒÇÑ ´å³Ý ÇÁ·¹ÀÓ¿öÅ©´Â ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù). ±× ´ÙÀ½ Client Æú´õÀÇ fortress.html ÆÄÀÏÀ» ½ÇÇà½ÃŲ´Ù. <ȸé 1>°ú <ȸé 2>´Â ¼¹ö¿Í Ŭ¶óÀ̾ðÆ®ÀÇ ÀÛµ¿ ȸéÀÌ´Ù.
|
|
|
<ȸé 1> FortessServer.exe ½ÇÇàȸé |
|
<ȸé 2> Fortess.html ½ÇÇàȸé |
À¥ ºê¶ó¿ìÀú ȸ鿡¼ ¿øÇÏ´Â ID¸¦ ÀÔ·ÂÇÏ°í µé¾î°£°¡¸é <ȸé 3>°ú °°Àº ´ë±â½Ç ȸéÀÌ ³ª¿Â´Ù. ÀÌ °÷¿¡¼ ÅÊÅ© Á¾·ù¿Í ÆÀÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ÀÌ »óÅ¿¡¼ ¶Ç ÇÑ ¹ø Fortress.html ÆÄÀÏÀ» ½ÇÇàÇؼ »õ·Î¿î ID¸¦ ÀÔ·ÂÇÏ°í µé¾î¿À¸é µÎ ¸íÀÇ °ÔÀ̸Ӱ¡ ´ë±â½Ç¿¡ µé¾î¿Â »óÅ°¡ µÈ´Ù.
|
|
|
<ȸé 3> ´ë±â½Ç ȸé |
|
<ȸé 4> °ÔÀÓ ½ÃÀÛ È¸é |
À̶§ µÎ °³ÀÇ À¥ ºê¶ó¿ìÀú¿¡¼ µ¿½Ã¿¡ ¹è°æÀ½¾ÇÀÌ ³ª¿À¹Ç·Î ¾à°£ È¥¶õ½º·¯¿ï ¼öµµ ÀÖ´Ù. ¼·Î ´Ù¸¥ ÆÀÀ» °í¸¥ ÈÄ, óÀ½¿¡ µé¾î¿Ô´ø »ç¶÷ÀÌ START ¹öÆ°À» ´©¸£¸é °ÔÀÓÀÌ ½ÃÀ۵ȴÙ(<ȸé 4>). °ÔÀÓ ¹æ¹ýÀº <Ç¥ 1>°ú °°´Ù.
|
|
±â´É |
Å° |
ÅÊÅ©ÀÇ À̵¿ |
È»ìÇ¥ Á¿ì Å° |
ÅÊÅ©ÀÇ °¢µµ Á¶Á¤ |
È»ìÇ¥ »óÇÏ Å° |
´ëÆ÷ ¹ß»ç |
½ºÆäÀ̽º ¹Ù¸¦ ´·¯¼ ÆÄ¿ö¸¦ Á¶Àý ÈÄ ¹ß»çÇÑ´Ù. | | |
| |
|
¸ÕÀú ÀÚ½ÅÀÇ Â÷·Ê°¡ µÇ¸é ÀÚ½ÅÀÇ ÅÊÅ© À§¿¡ ¡®READY!¡¯¶ó´Â ±ÛÀÚ°¡ ±ôºý°Å¸°´Ù. ±× »óÅ¿¡¼ °¢µµ Á¶Á¤À̳ª À̵¿À» ÇÏ¸é¼ Á¶ÀýÇÑ ÈÄ ½ºÆäÀ̽º ¹Ù¸¦ ±æ°Ô ´·¶´Ù°¡ ¶¼¸é ´ëÆ÷°¡ ¹ß»çµÈ´Ù(<ȸé 5>). ¼·Î ¹ø°¥¾Æ °¡¸é¼ ´ëÆ÷¸¦ ¹ß»çÇÏ´Â ¹æ½ÄÀ¸·Î °ÔÀÓÀ» ½±°Ô Çϱâ À§ÇÏ¿© Æø¹ßÀÇ ÆÄÆí¸¸ ´ê¾Æµµ »ý¸íÄ¡¸¦ ÁÙ°Ô ÇØ ³õ¾Ò´Ù. äÆõµ Áö¿øÇϹǷΠ´ëȸ¦ ÀÔ·ÂÇصµ µÈ´Ù(<ȸé 6>). ÀÌÁ¦ ¾î¶² °ÔÀÓÀÎÁö »ìÆìºÃÀ¸´Ï º»°ÝÀûÀ¸·Î °ÔÀÓ Á¦ÀÛ¿¡ Âø¼öÇØ º¸ÀÚ. ¸ÕÀú ¼¹öºÎÅÍ ¸¸µé¾î º¼ °ÍÀÌ´Ù.
|
|
|
<ȸé 5> ´ëÆ÷¸¦ ¹ß»çÇÑ Àå¸é |
|
<ȸé 6> ´ëȸ¦ ³ª´©´Â Àå¸é |
ºñµ¿±â È£ÃâÀÇ ±âº»Àº µ¨¸®°ÔÀÌÆ® ¼¹ö Á¦ÀÛ¿¡¼ Áß¿äÇÑ Á¡Àº ´Ù¼öÀÇ »ç¿ëÀÚ¸¦ ó¸®ÇØ¾ß ÇÏ´Â µ¥ ÀÖ´Ù. ÇÑ ¸íÀÌ ¾Æ´Ï¶ó ¿©·¯ ¸íÀÌ µ¿½Ã¿¡ Á¢¼ÓÇϹǷΠ±×µéÀÇ ¿ä±¸¸¦ µ¿½Ã¿¡ ó¸®ÇØ Áà¾ß¸¸ ÇÑ´Ù. ±×·±µ¥ ÀϹÝÀûÀ¸·Î ÇÁ·Î±×·¡¹ÖÇÏ´Ù º¸¸é ÇÑ ¸íÀ» ó¸®Çϱâ À§ÇØ ±× ´ë´äÀ» ±â´Ù¸®´Ù°¡ ´Ù¸¥ »ç¶÷ÀÇ ¿ä±¸¸¦ ¸ø µé¾îÁÖ°Ô µÈ´Ù.
Áï ºí·°ÀÌ µÅ ¹ö·Á¼ ´Ù¼öÀÇ »ç¿ëÀÚ¸¦ ó¸®ÇÒ ¼ö ¾ø°Ô µÈ´Ù. ÀÌ ¶§ÀÇ ÇØ°áÃ¥ÀÌ ¹Ù·Î ¾²·¹µåÀÌ´Ù. ´å³Ý¿¡¼´Â ÀÌ·¯ÇÑ ¾²·¹µå¸¦ ÀÌ¿ëÇÏ¿© ºñµ¿±â È£ÃâÀ» Áö¿øÇϴµ¥, À̸¦ ÀÌ¿ëÇÏ¿© ¸¹Àº »ç¿ëÀÚµéÀÇ ¿ä±¸¸¦ ó¸®ÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ µ¿±âÀûÀ¸·Î ±× ÇÔ¼öÀÇ È£ÃâÀÌ ³¡³¯ ¶§±îÁö ±â´Ù¸®´Â °ÍÀÌ ¾Æ´Ï¶ó ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ±× ÇÔ¼ö´Â »õ·Î¿î ¾²·¹µå ¾È¿¡¼ µ¹¾Æ°¡°í È£ÃâÀÚ ¶ÇÇÑ ±âÁ¸ ¾²·¹µå ³»¿¡¼ µ¹¾Æ°¡¹Ç·Î µ¿½Ã¿¡ ÀÏÀ» ó¸®ÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
|
<±×¸² 1> µ¿±â È£Ãâ°ú ºñµ¿±â È£Ãâ |
<±×¸² 1>Àº ¼ÒÄÏÀÇ Accept¹®À» ¿¹·Î µé¾î µ¿±â È£Ãâ°ú ºñµ¿±â È£ÃâÀÇ Â÷ÀÌÁ¡À» ¼³¸íÇÑ ±×¸²ÀÌ´Ù. ÀÌ ºñµ¿±â È£ÃâÀÇ ÇÙ½É °³³ä¿¡´Â ¹Ù·Î µ¨¸®°ÔÀÌÆ®(delegate)¶ó´Â °ÍÀÌ ÀÚ¸®Àâ°í ÀÖ´Ù. ±×·¯¹Ç·Î µ¨¸®°ÔÀÌÆ®ÀÇ º»ÁúºÎÅÍ ÆľÇÇÏ´Â °ÍÀÌ ºñµ¿±â È£ÃâÀÇ ¿ø¸®¸¦ ÀÌÇØÇÏ´Â ¹æ¹ýÀÏ °ÍÀÌ´Ù.
C# ¼¼°èÀÇ ºê·ÎÄ¿, µ¨¸®°ÔÀÌÆ® C#À» ¹è¿ì´Â »ç¶÷µé¿¡°Ô ÀÖ¾î µ¨¸®°ÔÀÌÆ®´Â »ý¼ÒÇÑ °³³äÀÌ ¾Æ´Ò ¼ö ¾ø´Ù. µ¨¸®°ÔÀÌÆ®´Â C ¾ð¾îÀÇ ÇÔ¼ö Æ÷ÀÎÅÍ¿¡¼ºÎÅÍ À¯·¡µÇ¾ú´Ù. C ¾ð¾î¿¡¼´Â ÇÔ¼ö Æ÷ÀÎÅ͸¦ Àß ¾È ½èÀ¸¹Ç·Î »ý¼ÒÇÒ ¼öµµ ÀÖ´Ù. ¸ÕÀú µ¨¸®°ÔÀÌÆ®ÀÇ »çÀüÀûÀÎ Àǹ̸¦ »ìÆ캸¸é ¡®´ë¸®ÀÚ¡¯ ¶Ç´Â ¡®À§ÀÓÇü¡¯ µîÀ¸·Î Á¤ÀÇÇÏ°í ÀÖ´Ù. µ¨¸®°ÔÀÌÆ®¶ó´Â °ÍÀÌ ¾î¶² ÇÔ¼ö¸¦ ´ë½ÅÇؼ È£ÃâµÇ±â ¶§¹®¿¡ ±×·¸°Ô À̸§À» ºÙÀÎ µíÇÏ´Ù. ÀÌÇظ¦ µ½±â À§ÇØ ´ÙÀ½°ú °°Àº ±â»óû ½Ã³ª¸®¿À¸¦ »ìÆ캸ÀÚ.
±â»óû¿¡¼´Â ±â»óÁ¤º¸¸¦ ¼öÁýÇØ ±× Á¤º¸¸¦ ÇÊ¿ä·Î ÇÏ´Â °÷¿¡ Àü´ÞÇÑ´Ù. ±×·±µ¥ ´©°¡ ¾ðÁ¦ ±×·¯ÇÑ Á¤º¸¸¦ ÇÊ¿ä·Î ÇÒÁö ¹Ì¸® ¾Ë¼ö ¾ø±â ¶§¹®¿¡ ±×·± º¸°í ½Ã½ºÅÛÀ» ¹Ì¸® ±¸ÃàÇØ ³õÀ» ¼ö ¾ø¾ú´Ù. ±×·¡¼ ´ë½Å ±â»ó Á¤º¸ ºê·ÎÄ¿¸¦ °í¿ëÇØ ±×¿¡°Ô Á¤º¸¸¦ ÁÖ¸é, ±×°¡ Àڽſ¡°Ô ¿¬°áµÈ ±â»ó Á¤º¸¸¦ ÇÊ¿ä·Î ÇÏ´Â »ç¶÷µé¿¡°Ô ±× Á¤º¸¸¦ ÁÖ±â·Î Çß´Ù. ±×·¸°Ô Çؼ º¸°í ½Ã½ºÅÛÀ» ¿Ï¼ºÇÏ°Ô µÆ´Ù. ÀÌ¿¡ ½Å¹®»ç°¡ Á¦ÀÏ Ã³À½ ±× Á¤º¸¸¦ ´Þ¶ó°í ºê·ÎÄ¿¿¡°Ô ¿äûÀ» Çß´Ù. ºê·ÎÄ¿´Â ±× ¿äûÀ» ¹Þ¾ÆµéÀÌ°í ±â»óûÀ¸·ÎºÎÅÍ ±â»ó Á¤º¸¸¦ ¹Þ´Â´ë·Î ½Å¹®»ç¿¡°Ô ÀüÇØ ÁÖ±â·Î Çß´Ù.
|
<±×¸² 2> ±â»ó ºê·ÎÄ¿ ½Ã³ª¸®¿À |
À̸¦ ±×¸²À¸·Î ³ªÅ¸³»¸é <±×¸² 2>¿Í °°´Ù. ±×·¯¸é À̸¦ ÄÚµùÀ¸·Î ³ªÅ¸³» º¸ÀÚ. ¹Ì·¡ÀÇ ÀÏÀº ¿¹ÃøÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ÀÌ¹Ì ¸ðµç °èȹÀº ´Ù ¼¼¿üÁö¸¸ ´©°¡ ±× °èȹ¿¡ Âü¿©ÇÒÁö´Â ¸ð¸¦ ¶§°¡ ÀÖ´Ù. ÇÁ·Î±×·¡¹ÖÀÇ ¼¼°è¿¡¼µµ ´©°¡ ±× ÀÏ¿¡ Âü¿©ÇÏ°Ô µÉÁö ¸ð¸£´Â »óȲÀÌ Á¾Á¾ »ý±ä´Ù. ÀÌ·² ¶§ µ¨¸®°ÔÀÌÆ®¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. Â÷ÈÄ¿¡ µ¨¸®°ÔÀÌÆ®¸¦ ÅëÇؼ ±× ÀÏÀ» ÇÒ ¸Þ½îµå¸¸ ¿¬°á½ÃÄÑÁÖ¸é µÈ´Ù.
|
<¸®½ºÆ® 1> ±â»ó º¸°í ½Ã½ºÅÛ | |
| |
namespace MeteorologicalSystem { // ±â»ó Á¤º¸ ºê·ÎÄ¿ public delegate void Information(int temparature, int humidity, string nephanalysis); // ±â»óû class MeteorologicalOffice { // ±â»ó ¿¹º¸ public static void Report(Information broker) { broker(25,60,¡±±¸¸§ ¾øÀ½¡±); } } // ½Å¹®»ç class NewspaperCompany { // ½Å¹®»ç¿¡¼ ½Å¹®À» ¹ß°£ public static void Publish(int temparature, int humidity, string nephanalysis) { Console.WriteLine(¡°[½Å¹®»ç ÃâÆÇ] ¿Âµµ:{0}, ½Àµµ:{1}, ±¸¸§ºÐÆ÷:{2}¡±, temparature, humidity, nephanalysis); } } // // Class1¿¡ ´ëÇÑ ¿ä¾à ¼³¸í // class Class1 { // ÇØ´ç ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÁÖ ÁøÀÔÁ¡ [STAThread] static void Main(string[] args) { // TODO: ¿©±â¿¡ ÀÀ¿ë ÇÁ·Î±×·¥À» ½ÃÀÛÇÏ´Â Äڵ带 Ãß°¡ // ù¹ø° ¿¹Á¦ Console.WriteLine(¡°=== ù¹ø° ¿¹Á¦ ===¡±); Information broker = new Information (NewspaperCompany.Publish); // ½Å¹®»ç µî·Ï MeteorologicalOffice.Report(broker); // ±â»óÁ¤º¸ º¸°í ½Ã½ºÅÛ °¡µ¿ } } }
| |
|
µ¨¸®°ÔÀÌÆ®ÀÇ ºñ¹ÐÀ» ÆÄÇìÄ¡ÀÚ <¸®½ºÆ® 1>À» º¸¸é ÇÑ °¡Áö ±Ã±ÝÁõÀÌ ¶°¿À¸¦ ¼öµµ ÀÖ´Ù. ¸¶Áö¸· ÁÙÀ» ´Ù½Ã º¸ÀÚ.
Information broker =
new Information(NewspaperCompany.Publish);
¿©±â¼ ¿Ö new¶ó´Â Å°¿öµå¸¦ ½è´ÂÁö ±Ã±ÝÁõÀÌ ÀϾ °ÍÀÌ´Ù. new¶ó´Â °ÍÀº »õ·Î¿î Object¸¦ ÇÒ´çÇÒ ¶§¿¡¸¸ ¾²´Â Å°¿öµåÀε¥, ¿©±â¼ »ç¿ëÇß´Ù´Â °ÍÀº ¸¶Ä¡ Ŭ·¡½º¸¦ ÇÒ´çÇÏ´Â °Í°ú ºñ½ÁÇÏ´Ù°í »ý°¢ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à ±×·¸°Ô »ý°¢Çß´Ù¸é ¸Â´Ù. µ¨¸®°ÔÀÌÆ®¶ó´Â °ÍÀÌ ¹Ù·Î Ŭ·¡½ºÀ̱⠶§¹®ÀÌ´Ù. µ¨¸®°ÔÀÌÆ®¸¦ ¡®À§ÀÓ[Çü]¡¯À̶ó°í ¹ø¿ªÇϵíÀÌ µ¨¸®°ÔÀÌÆ®´Â Ŭ·¡½º ŸÀÔÀÌ´Ù. ±×·¯¸é Ŭ·¡½º ¹Ùµð´Â ¾îµð¿¡ ÀÖ´Â °É±î? Ŭ·¡½º¶ó¸é ´ÙÀ½°ú °°ÀÌ µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.
Class Information
{
}
ÇÏÁö¸¸ Ŭ·¡½ºÀÇ Á¤ÀÇ°¡ ´ÙÀ½°ú °°ÀÌ ÇÑ ÁÙ·Î µÇ¾î ÀÖ´Ù.
delegate void Information(int temparature, int humidity, string nephanalysis);
µµ´ëü ¹Ùµð´Â ¾îµð¿¡ Àִ°¡? »ç½Ç ÀÌ ÇÑ ÁÙ¿¡´Â ¹Ùµð¸¦ Æ÷ÇÔÇÏ°í ÀÖ´Ù(<±×¸² 3>). Áï ¸®ÅÏÇü°ú ÀÎÀÚÇü¿¡ ´ëÇÑ Á¤º¸°¡ Ŭ·¡½º ¹Ùµð°¡ µÇ´Â °ÍÀÌ´Ù.
|
<±×¸² 3> DeleBangÀÇ Å¬·¡½º ¹Ùµð |
µ¨¸®°ÔÀÌÆ®°¡ Á¤¸» Ŭ·¡½ºÀÎÁö È®ÀÎÇØ º¸±â À§ÇÏ¿© Áß°£ ÄÚµå·Î È®ÀÎÇØ º¸ÀÚ. ´å³ÝÀ» ¼³Ä¡ÇÑ Æú´õ¿¡ ILDA SM.exe ÆÄÀÏÀÌ ÀÖ´Ù. ÀÌ´Â IL DisassemblerÀÇ ¾àÀÚ·Î ¸» ±×´ë·Î Áß°£ Äڵ带 disassembleÇØ ÁØ´Ù. À̸¦ ÅëÇØ ¾Õ¿¡¼ ÄÄÆÄÀÏÇÑ Meteorological System.exe ÆÄÀÏÀ» ¿¾î º¸¸é <ȸé 7>ÀÌ ³ªÅ¸³´Ù. <ȸé 7>À» º¸¸é ±ÛÀÚ ¿·¿¡ ¾ÆÀÌÄܵéÀÌ Àִµ¥, À̵éÀÌ ¹«¾ùÀ» ÀǹÌÇÏ´ÂÁö´Â <ȸé 8>À» º¸¸é ¾Ë ¼ö ÀÖ´Ù.
|
<ȸé 7> MeteorologicalSystem.exe¸¦ DisassembleÇÑ È¸é |
|
<ȸé 8> ¾ÆÀÌÄÜ µµ¿ò¸» |
À̸¦ ÅëÇؼ º¸¸é InformationÀº Ŭ·¡½º¶ó´Â °Í°ú .ctor, BeginInvoke, EndInvoke, Invoke¶ó´Â ³× °³ÀÇ ¸Þ½îµå¸¦ °¡Áö°í ÀÖÀ½À» ¾Ë ¼ö ÀÖ´Ù. ¶ÇÇÑ InformationÀº System.Muticastdele gate¿¡¼ »ó¼Ó¹Þ¾Ò´Ù´Â Á¤º¸±îÁö °®°í ÀÖ´Ù. ¿©±â¿¡ ³ª¿À´Â 4°³ÀÇ ¸Þ½îµåÁß .ctorÀº »ý¼ºÀÚ¸¦ ÀǹÌÇÑ´Ù. BeginInvoke¿Í EndInvoke´Â ºñµ¿±â È£Ãâ¿¡ ¾²À̸ç, Invoke´Â µ¿±â È£Ãâ¿¡ ¾²ÀÌ´Â ¸Þ½îµåÀÌ´Ù. À̵鿡 ´ëÇÑ ÄÚµå´Â <¸®½ºÆ® 2>¿Í °°´Ù.
|
<¸®½ºÆ® 2> Information Ŭ·¡½ºÀÇ ÄÚµå | |
| |
public class Information : System.Multicastdelegate { // »ý¼ºÀÚ public Information (object target, int32 methodPtr); public void virtual Invoke( int temparature, int humidity, string nephanalysis ); public virtual IAsyncResult BeginInvoke( int temparature, int humidity, string nephanalysis, AsyncCallback callback, Object object); public virtual void EndInvoke( IAsyncResult result); }
| |
|
|
|
Çʵå |
ŸÀÔ |
¼³ ¸í |
_target |
System.Object |
ÀνºÅϽº ¸Þ½îµå¿¡ ¾²ÀÌ´Â °ÍÀ¸·Î, Äݹé¸Þ½îµå°¡ È£ÃâµÉ¶§ ÂüÁ¶ÇÏ´Â ObjectÀÌ´Ù. |
_methodPtr |
System.Int32 |
CLR¿¡¼ »ç¿ëµÇ´Âµ¥, ÄݹéµÉ ¸Þ½îµå¸¦ °¡¸®Å°´Â integer °ª |
_prev |
System.Multicastdelegate |
´Ù¸¥ µ¨¸®°ÔÀÌÆ®¸¦ °¡¸®Å°´Â °ª | | |
| |
|
<¸®½ºÆ® 2>¸¦ º¸¸é ÇÑ °¡Áö ÀÌ»óÇÑ Á¡À» ¹ß°ßÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¹Ù·Î InformationÀÇ »ý¼ºÀÚÀε¥, ¿ì¸®´Â <¸®½ºÆ® 1>¿¡¼ »ý¼ºÀÚ·Î NespaperCompany.Publish¸¦ ³Ñ°ÜÁá´Ù. ±×·±µ¥ <¸®½ºÆ® 2>¸¦ º¸¸é »ý¼ºÀÚ´Â µÎ °³ÀÇ ÀÎÀÚ°¡ ÇÊ¿äÇÏ´Ù. ºÐ¸í ¿¡·¯¸¦ ¹ß»ýÇØ¾ß Çϴµ¥ Àß µÇ´Â °ÍÀ» º¸¸é ÀÌ»óÀÌ ¾ø´Â °ÍÀÌ´Ù. ¿©±â¼ ÄÄÆÄÀÏ·¯´Â ¿øº» ¼Ò½º¸¦ ÄÄÆÄÀÏÇÒ ¶§, ¾ÕÀÇ »ý¼ºÀÚ¿¡ ¸Âµµ·Ï ÆĽÌÀ» ÇØÁֱ⠶§¹®¿¡ ¿¡·¯°¡ ¾È ³ª´Â °ÍÀÌ´Ù.
¾ÕÀÇ µÎ ÀÎÀÚÁß targetÀº ¸Þ½îµå°¡ ÀÖ´Â ¿ÀºêÁ§Æ®¸¦ °¡¸®Å°´Âµ¥ ¸¸¾à ¸Þ½îµå°¡ staticÀ̸é null °ªÀ» ³Ñ°ÜÁØ´Ù. methodPtrÀº callback ¸Þ½îµå¸¦ °¡¸®Å°´Â CLR ³»ºÎ¿¡¼ ¾²ÀÌ´Â ·¹ÆÛ·±½º °ªÀÌ´Ù. ÀÌµé »ý¼ºÀÚ¿¡¼ ¹ÞÀº µÎ °³ÀÇ °ªÀ» Information Ŭ·¡½º´Â µû·Î Private Çʵ忡 ÀúÀåÇØ µÎ´Âµ¥ ±× Private Çʵå´Â <Ç¥ 2>¿Í °°´Ù.
ÀÌÁß _prev °ªÀº ³ªÁß¿¡ Muticatedelegate¿¡¼ ¼³¸íÇÒ °ÍÀÌ´Ù. ±×·³ ÀÌÁ¦ ¿ì¸®°¡ »ý¼ºÀÚ¿¡°Ô ³Ñ°ÜÁØ ±× °ªµéÀ» Á÷Á¢ ´«À¸·Î È®ÀÎÇØ º¸ÀÚ. <¸®½ºÆ® 1>¿¡¼ main ¸Þ½îµå¿¡ ´ÙÀ½°ú °°Àº Äڵ带 Ãß°¡ÇÏÀÚ.
// »ý¼ºÀÚ¿¡ ³Ñ°ÜÁØ °ªÀ» º¸ÀÚ.
if ( broker.Target == null )
{
Console.WriteLine(¡°null¡±);
}
else
{
Console.WriteLine(broker.Target);
}
Console.WriteLine(broker.Method);
À̸¦ ½ÇÇàÇÏ¸é ´ÙÀ½°ú °°Àº °á°ú¸¦ º¼ ¼ö ÀÖ´Ù.
=== ù¹ø° ¿¹Á¦ ===
[½Å¹®»ç ÃâÆÇ] ¿Âµµ : 25, ½Àµµ : 60, ±¸¸§ºÐÆ÷ : ±¸¸§ ¾øÀ½
=== µÎ¹ø° ¿¹Á¦ ===
null
Void Publish(Int32, Int32, System.String)
¿ì¸®°¡ ³Ñ°ÜÁØ ¸Þ½îµå°¡ StaticÀ̱⠶§¹®¿¡ Target¿¡´Â null °ªÀÌ µé¾î°¬°í, ¸Þ½îµå¿¡´Â ´ë¸®ÀÚ¿¡ µî·ÏµÈ ¸Þ½îµåÀÇ Çü½ÄÀÌ ³ª¿Ô´Ù. ¸¸¾à ¿©±â¿¡¼ instance ¸Þ½îµå¸¦ ³Ñ°ÜÁÖ¸é ¾î¶² °ªÀÌ ³ª¿Ã±î? ¾Õ¿¡¼ Kill ¸Þ½îµå¿¡¼ staticÀ» »©°í, NewspaperCompany Ŭ·¡½º¸¦ »õ·Î »ý¼ºÇؼ ½ÇÇàÇØ º¸¸é ´ÙÀ½°ú °°Àº °á°ú°¡ ³ª¿Â´Ù. Áï ¸Þ½îµåÀÇ Object¸¦ ³Ñ°ÜÁÖ´Â °ÍÀÌ´Ù.
=== ù¹ø° ¿¹Á¦ ===
[½Å¹®»ç ÃâÆÇ] ¿Âµµ : 25, ½Àµµ : 60, ±¸¸§ºÐÆ÷ : ±¸¸§ ¾øÀ½
=== µÎ¹ø° ¿¹Á¦ ===
MeteorologicalSystem.NewspaperCompany
Void Publish(Int32, Int32, System.String)
ÀÌÁ¦ »ý¼ºÀÚ¿¡ ´ëÇÑ ºñ¹ÐÀº Ç®¾úÀ¸³ª ¾ÆÁ÷ Information Ŭ·¡½ºÀÇ ¸Þ½îµå¿¡ ´ëÇÑ ºñ¹ÐÀÌ ³²¾Æ ÀÖ´Ù. <¸®½ºÆ® 2>¿¡¼ Invoke ¸Þ½îµå°¡ Àִµ¥ ÀÌ°ÍÀÌ ½ÇÁ¦ ½ÇÇàÇÏ´Â ¸Þ½îµåÀÌ´Ù. ±×·±µ¥ ¿ì¸®´Â ±× ¸Þ½îµå¸¦ È£ÃâÇÑ ÀûÀÌ ¾ø´Ù. ±×·¯¸é ÄÄÆÄÀÏ·¯°¡ ¾Ë¾Æ¼ È£ÃâÇØ ÁÖ´Â °ÍÀϱî? ±×·¸°Ô »ý°¢Çß´Ù¸é Á¤´äÀÌ´Ù. ¿ì¸®´Â <¸®½ºÆ® 1>¿¡¼ ´ÙÀ½°ú °°ÀÌ È£ÃâÇß´Ù.
broker(25,60,¡±±¸¸§ ¾øÀ½¡±);
ÄÄÆÄÀÏ·¯´Â ÀÌ Äڵ带 º¸°í ´ÙÀ½°ú °°ÀÌ ¹ø¿ªÇÑ´Ù.
broker.Invoke(25,60,¡±±¸¸§ ¾øÀ½¡±);
±×·±µ¥ Á¤¸» ÀÌ·¸°Ô ¹ø¿ªÇÏ´Â °ÍÀϱî? ÀÌ°Í ¿ª½Ã ILDASMÀ» ÀÌ¿ëÇؼ È®ÀÎÇØ º¸ÀÚ. <ȸé 9>¸¦ º¸¸é ÄÄÆÄÀÏ·¯°¡ ¸¸µé¾î ÁØ Invoke ¸Þ½îµå¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
|
|
|
<ȸé 9> Invoke°¡ È£ÃâµÈ ºÎºÐ |
|
<ȸé 10> += ¿¬»êÀÚ°¡ ³ªÅ¸³»´Â ¸Þ½îµå |
³Ê¿¡°Ô ÀÓ¹«¸¦ Ãß°¡ÇÑ´Ù! ÀÌÁ¦ µ¨¸®°ÔÀÌÆ®¿¡ ´ëÇØ ¾î´À Á¤µµ ºñ¹ÐÀ» Ç®¾ú´Ù. ±×·±µ¥ ¿©±â¼ ÇÑ °¡Áö Àǹ®ÀÌ ³²¾Æ ÀÖ´Ù. <Ç¥ 2>¸¦ º¸¸é _prev¶ó´Â Çʵ尡 Àִµ¥ ÀÌ ÇʵåÀÇ ¿ëµµ°¡ ¹«¾ùÀÌ³Ä ÇÏ´Â °ÍÀÌ´Ù. À̸¦ À§ÇØ ´ÙÀ½°ú °°Àº ½Ã³ª¸®¿À¸¦ º¸ÀÚ.
¾î´À ³¯ ¹æ¼Û»ç¿¡¼µµ ±× ±â»ó Á¤º¸¸¦ ´Þ¶ó´Â ¿äûÀÌ µé¾î¿Ô´Ù. ÀÌ¹Ì ±â»óû¿¡¼´Â ºê·ÎÄ¿¿¡°Ô ±× ÀÏÀ» ÀÏÀÓÇßÀ¸¹Ç·Î ¹æ¼Û»ç´Â ºê·ÎÄ¿¿Í °Å·¡¸¦ ÇØ µî·ÏÇÔÀ¸·Î½á ºê·ÎÄ¿¸¦ ÅëÇØ ±â»óûÀÇ Á¤º¸¸¦ Á¦°ø¹Þ°Ô µÈ´Ù. À̸¦ ÄÚµå·Î ³ªÅ¸³»¸é ´ÙÀ½°ú °°´Ù. ¸ÕÀú Broadcasting Company Ŭ·¡½º¸¦ ´ÙÀ½°ú °°ÀÌ »õ·Î ¸¸µç´Ù.
// ¹æ¼Û»ç
class BroadcastingCompany
{
// ¹æ¼Û»ç¿¡¼ ¹æ¼Û º¸µµ
public static void Broadcast( int temparature,
int humidity, string nephanalysis)
{
Console.WriteLine(¡°[¹æ¼Û º¸µµ] ¿Âµµ:{0}, ½Àµµ:{1}, ±¸¸§ºÐÆ÷:{2}¡±,
temparature, humidity, nephanalysis);
}
}
±× ´ÙÀ½ ºê·ÎÄ¿¿¡ ´ÙÀ½°ú °°ÀÌ Ãß°¡ÇÏ¸é µÈ´Ù.
broker += new Information(BroadcastingCompany.Broadcast);
°á°ú´Â ´ÙÀ½°ú °°´Ù.
=== ¼¼¹ø° ¿¹Á¦ ===
[½Å¹®»ç ÃâÆÇ] ¿Âµµ : 25, ½Àµµ : 60, ±¸¸§ºÐÆ÷ : ±¸¸§ ¾øÀ½
[¹æ¼Û º¸µµ] ¿Âµµ : 25, ½Àµµ : 60, ±¸¸§ºÐÆ÷ : ±¸¸§ ¾øÀ½
¿©±â¼´Â ´Ü¼øÈ÷ += ¿¬»êÀÚ¸¦ ÀÌ¿ëÇß´Ù. C#¿¡¼´Â ¿¬»êÀÚ ¿À¹ö·ÎµùÀ» Áö¿øÇϱ⠶§¹®¿¡ += ¿¬»êÀÚ´Â ½ÇÁúÀûÀ¸·Î ¸Þ½îµå¸¦ È£ÃâÇÏ´Â °ÍÀÌ´Ù. ±×·¯¸é ±× ¸Þ½îµå°¡ ¹«¾ùÀÎÁö ILDASMÀ» ÅëÇØ È®ÀÎÇØ º¸ÀÚ. <ȸé 10>À» º¸¸é CombineÀ̶ó´Â ¸Þ½îµå°¡ È£ÃâµÊÀ» º¼ ¼ö ÀÖ´Ù.
±âº»ÀûÀ¸·Î µ¨¸®°ÔÀÌÆ® ŸÀÔÀº Muticastdelegate¸¦ »ó¼Ó¹ÞÀ¸¹Ç·Î ÇϳªÀÇ callback ¸Þ½îµå°¡ ¾Æ´Ñ ´Ù¼öÀÇ callback ¸Þ½îµå¸¦ °¡Áú ¼ö ÀÖ´Ù. ¾ÕÀÇ ½Ã³ª¸®¿À¿¡¼ º¸µíÀÌ ¾î¶² »ç°Ç¿¡ ÀÇÇØ ´Ù¼ö°¡ ±× ¿µÇâÀ» ¹Þ´Â °æ¿ì°¡ Àֱ⠶§¹®¿¡ ÀÌ·¯ÇÑ ±â´ÉÀ» Áö¿øÇÏ´Â °ÍÀÌ´Ù. µ¨¸®°ÔÀÌÆ® ³»ºÎÀûÀ¸·Î´Â ÀÌ°ÍÀ» linked-list·Î À¯Áö¸¦ ÇÑ´Ù. linked-list·Î À¯ÁöÇϱ⠶§¹®¿¡ ¾ÕÀÇ ¸µÅ©¸¦ °¡¸®Å°´Â _prev Çʵ尡 ÇÊ¿äÇÑ °ÍÀÌ´Ù. À̸¦ ±×¸²À¸·Î ³ªÅ¸³»¸é <±×¸² 4>¿Í °°´Ù.
|
<±×¸² 4> ºê·ÎÄ¿ÀÇ linked-list |
ÀÌ ±×¸²À» º¸¸é ÇÑ °¡Áö Àǹ®Á¡ÀÌ µé °ÍÀÌ´Ù. ¿ì¼± ºê·ÎÄ¿°¡ óÀ½¿¡ µî·ÏÇß´ø ½Å¹®»ç¸¦ °¡¸®Å°´Â °ÍÀÌ ¾Æ´Ï°í ³ªÁß¿¡ µî·ÏÇÑ ¹æ¼Û»ç¸¦ °¡¸®Å²´Ù´Â °Í°ú ÀϹÝÀûÀÎ linked-list¿¡¼´Â _next Çʵå·Î ´ÙÀ½ ¿ÀºêÁ§Æ®¸¦ °¡¸®Å°´Â µ¥ ºñÇØ ¿©±â´Â _prevÇʵ带 ½á¼ ¾ÕÀÇ ¿ÀºêÁ§Æ®¸¦ °¡¸®Å²´Ù´Â °ÍÀÌ´Ù. ±× ÀÌÀ¯´Â ¸®ÅÏ °ª ¶§¹®¿¡ ±×·¸´Ù. ¸¸¾à callback ¸Þ½îµå¿¡ ¸®ÅÏ °ªÀÌ ÀÖ´Ù¸é ¾î¶»°Ô ÇÒ °ÍÀΰ¡? ¿¹¸¦ µé¾î ´ÙÀ½°ú °°Àº °æ¿ìÀÌ´Ù.
delegate int Information(int temparature, int humidity,
string nephanalysis);
ÀÌ¿Í °°ÀÌ ¸®ÅÏ °ªÀÌ ÀÖ´Â °æ¿ì ºê·ÎÄ¿¿¡ µî·ÏµÈ callback ¸Þ½îµå°¡ ÇÑ °³¶ó¸é º° ¹®Á¦°¡ ¾øÁö¸¸, ¿©·¯ °³¶ó¸é ¾î¶»°Ô ÇÒ±î? ¸ÕÀú C#¿¡¼´Â ¿©·¯ °³ÀÇ callback ¸Þ½îµåÁß ´Ü ÇÑ°³ÀÇ ¸®ÅÏ °ª¸¸ ¹Þ¾Æ ¿Ã ¼ö ÀÖ´Ù. ±× ¿©·¯ °³ÀÇ ¸®ÅÏ °ªÀ» ´Ù ¹Þ¾Æ¿À·Á¸é ´Ù¸¥ ¹æ¹ýÀ» ÃëÇØ¾ß Çϴµ¥ ±× ¹æ¹ýÀº ³ªÁß¿¡ ¼Ò°³ÇÒ °ÍÀÌ´Ù. ÀÏ´Ü ÀϹÝÀûÀÎ »óȲ¿¡¼´Â ¸®ÅÏ °ªÀ» Çϳª¸¸ ÃëÇÑ´Ù.
±×·¯¸é ¾î¶² ¸®ÅÏ °ªÀ» ÃëÇÒ °ÍÀΰ¡? »ó½ÄÀûÀ¸·Î »ý°¢ÇØ º¸¸é °¡Àå ÃÖ±Ù¿¡ È£ÃâµÈ callback ¸Þ½îµåÀÇ ¸®ÅÏ °ªÀÌ °¡Àå °¡Ä¡ÀÖ´Ù°í »ý°¢µÉ °ÍÀÌ´Ù. ±×·¡¼ °¡Àå ³ªÁß¿¡ È£ÃâµÈ ¸®ÅÏ °ªÀÌ ÇÊ¿äÇϱ⠶§¹®¿¡ _next Çʵ带 ¾È ¾²°í À§·Î °Å½½·¯ ¿Ã¶ó°¡¼ È£ÃâÇÏ´Â °ÍÀÌ´Ù. _next¸¦ ¾´ °æ¿ì¿Í _prev¸¦ ¾´ °æ¿ì¸¦ ±×¸²À¸·Î ºñ±³ÇØ º¸ÀÚ. ¿¹¸¦ µé¾î f1, f2, f3¸¦ ºê·ÎÄ¿¿¡ µî·ÏÇß´Ù°í Çϸé <±×¸² 5>¿Í °°Àº È£Ãâ °úÁ¤À» º¼ ¼ö ÀÖ´Ù.
|
<±×¸² 5> _prev¿Í _nextÀÇ Â÷ÀÌÁ¡ |
±×·¯¸é Á÷Á¢ È£ÃâÀ» ´ã´çÇÏ´Â Invoke ¸Þ½îµå¿¡ ´ëÇÑ °¡»ó Äڵ带 ¸¸µé¾î º¸ÀÚ.
class Information : Multicastdelegate
{
public int virtual Invoke(int temparature, int humidity,
string nephanalysis)
{
// ¾ÕÀ¸·Î °Å½½·¯ ¿Ã¶ó°£´Ù.
if ( _prev != null ) _prev.Invoke(temparature,
humidity,
nephanalysis);
// °á±¹ ¸Ç ³ªÁß¿¡ È£ÃâµÈ callback ¸Þ½îµåÀÇ ¸®ÅÏ °ªÀÌ ¸®ÅϵȴÙ.
return _target.methodPtr ( temparature, humidity,
nephanalysis);
}
}
±×·³ ÀÌÁ¦ _prev¸¦ »ìÆìºÃÀ¸´Ï, Combine ¸Þ½îµå°¡ ³»ºÎÀûÀ¸·Î ¾î¶»°Ô ÀÌµé ¿¬°áÀ» ¸¸µå´ÂÁö º¸ÀÚ. <¸®½ºÆ® 3>Àº µ¨¸®°ÔÀÌÆ® Ŭ·¡½ºÀÇ Combine ¸Þ½îµåµéÀÌ´Ù. Combine ¸Þ½îµå´Â µÎ °³ÀÇ µ¨¸®°ÔÀÌÆ®¸¦ ÀÎÀÚ·Î ¹Þ´Âµ¥, ¸ÕÀú delegate´Â ÇÑ ¹ø »ý¼ºµÇ¸é immutableÇϱ⠶§¹®¿¡ _prev Çʵ带 ¸¶À½´ë·Î º¯°æÇÒ ¼ö°¡ ¾ø´Ù. ±×·¡¼ CombineÀ» ÇÒ ¶§¿¡´Â second¿Í °°Àº »õ·Î¿î µ¨¸®°ÔÀÌÆ® ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÏ°í, À̶§ _prev ÇÊµå °ªÀ» first·Î ¼³Á¤ÇØ ÁØ´Ù.
|
<¸®½ºÆ® 3> µ¨¸®°ÔÀÌÆ®ÀÇ ¸Þ½îµå | |
| |
class System.delegate { // first¿Í second¸¦ ¿¬°áÇÑ ÈÄ¿¡ second¸¦ ¸®ÅÏÇÑ´Ù. public static delegate Combine(delegate first, delegate second); // ¹è¿¿¡ ÀÇÇÑ µ¨¸®°ÔÀÌÆ®¸¦ ¿¬°á½ÃÄÑ ÁØ´Ù. public static delegate Combine(delegate[] delegateArray); // µ¨¸®°ÔÀÌÆ®¸¦ chain¿¡¼ Á¦°Å public static Remove(delegate source, delegate value); }
| |
|
±×·¸´Ù¸é À̸¦ ÀÌ¿ëÇؼ Combine ¸Þ½îµå°¡ Á¤¸» »õ·Î¿î ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇؼ ¸®ÅÏÇÏ´ÂÁö ´ÙÀ½°ú °°Àº Äڵ带 º¸ÀÚ. ´ÙÀ½ °á°ú¸¦ º¸¸é False°¡ ³ª¿Â´Ù. Combine ¸Þ½îµå°¡ »õ·Î¿î µ¨¸®°ÔÀÌÆ®¸¦ »õ·Î »ý¼ºÇؼ ¸®ÅÏÇϱ⠶§¹®ÀÌ´Ù.
Information broker1 =
new Information(NewspaperCompany.Publish);
Information broker2 = (Information) delegate.Combine(broker1,
broker1);
Console.WriteLine( (object) broker1 == (object) broker2 );
µ¨¸®°ÔÀÌÆ®¿¡ Combine½ÃÅ°´Â ¹æ¹ýÀÌ ÀÖÀ¸´Ï Remove½ÃÅ°´Â ¹æ¹ýµµ ÀÖÀ» °ÍÀÌ´Ù. ´ÙÀ½°ú °°Àº °æ¿ì¸¦ º¸ÀÚ.
broker -= new Information(NewspaperCompany.Publish);
MeteorologicalOffice.Report(broker);
¾Õ¿¡¼ ºê·ÎÄ¿¿¡°Ô ½Å¹®»ç¿Í ¹æ¼Û»ç¸¦ ´Ù µî·Ï½ÃÄ״µ¥ À̹ø¿¡´Â ½Å¹®»ç¸¦ Á¦°ÅÇØ ºÃ´Ù. ÀÌ -= ¿¬»êÀÚ ¶ÇÇÑ ½ÇÁ¦·Î´Â Remove ¸Þ½îµå¸¦ ³ªÅ¸³½´Ù. ÀÌ´Â <¸®½ºÆ® 3>¿¡¼ º¸µíÀÌ µÎ °³ÀÇ ÀÎÀÚ¸¦ ÃëÇϴµ¥, ù ¹ø°´Â linked-list¸¦ ÀÌ·ç°í ÀÖ´Â µ¨¸®°ÔÀÌÆ®ÀÇ Çìµå¸¦ °¡¸®Å°¸ç, µÎ ¹ø°´Â »èÁ¦ÇÒ µ¨¸®°ÔÀÌÆ®¸¦ °¡¸®Å²´Ù. ±×·±µ¥ ¿Ö Áö¿ì´Âµ¥ ¿ÀºêÁ§Æ®¸¦ »õ·Î »ý¼ºÇÒ±î? linked-list¿¡¼ ¿øÇÏ´Â °ÍÀ» ã¾Æ¼ Áö¿ö¾ß Çϴµ¥, À̸¦ ºñ±³ÇÏ´Â ¹æ¹ý¿¡ ±× ¿øÀÎÀÌ ÀÖ´Ù.
¿ì¸®°¡ Á¤È®È÷ ã°íÀÚ ÇÏ´Â °ÍÀº NewspaperCompany. Publish·Î À̸¦ ºñ±³Çؾ߸¸ ÇÏ´Â °ÍÀÌ´Ù. ±×·±µ¥ ¾Õ¼¼ µ¨¸®°ÔÀÌÆ® Ŭ·¡½º¿¡¼ »ý¼ºÀÚ·Î ³Ñ°ÜÁÖ´Â °ÍÀ¸·Î _target°ú _method PtrÀÌ ÀÖ¾ú´Ù. Áï instance/staticÀÌ³Ä ÇÏ´Â °Í°ú, ¸®ÅÏ °ª°ú ÀÎÀÚÇü¿¡ µû¶ó Ŭ·¡½º¸¦ ±¸ºÐÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ±×·¸±â ¶§¹®¿¡ µ¨¸®°ÔÀÌÆ®¿¡¼´Â µ¿µî ºñ±³¸¦ ÇÏ´Â µ¥ ÀÖ¾î _target°ú _methodPtrÀ» ÀÌ¿ëÇÑ´Ù. ´ÙÀ» ½ÇÇàÇϸé TRUE¸¦ ¸®ÅÏÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù.
Information broker3 =
new Information(NewspaperCompany.Publish);
Information broker4 =
new Information(NewspaperCompany.Publish);
Console.WriteLine(broker3.Equals(broker4));
ÀÌÁ¦ µ¨¸®°ÔÀÌÆ®¿¡ ´Ù¸¥ µ¨¸®°ÔÀÌÆ®¸¦ ½±°Ô Ãß°¡/»èÁ¦ÇÒ ¼ö ÀÖ°Ô µÆ´Ù. ±×·¯³ª ¾Õ¼ ¾ê±âÇßµíÀÌ µ¨¸®°ÔÀÌÆ®ÀÇ linked-list È£Ãâ ±¸Á¶´Â ÇÑ °¡Áö ´ÜÁ¡À» Áö´Ï°í ÀÖ´Ù. Áß°£ÀÇ ¸®ÅÏ °ªµéÀ» ¹«½ÃÇÑ´Ù´Â °ÍÀÌ´Ù. °Ô´Ù°¡ ¸¸¿¡ Çϳª ¸®½ºÆ®µé Áß¿¡¼ exceptionÀÌ ÀϾµç°¡ ºí·¯Å·(blocking)µÇ±â¶óµµ Çϸé, µÚ¿¡ µþ·Á ÀÖ´Â ¸®½ºÆ®µéÀº ¸ðµÎ È£ÃâµÇÁö ¸øÇÏ°í ¸ØÃç¹ö¸°´Ù.
ÀÌ·² ¶§¿¡´Â ¾Ë¾Æ¼ È£ÃâÇÏ°Ô ³öµÎÁö ¸»°í »ç¿ëÀÚ°¡ Á÷Á¢ ÇϳªÇϳª üũÇØ °¡¸é¼ È£ÃâÇÏ¸é µÈ´Ù. C#¿¡¼´Â ÀÌ¿Í °°Àº ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ GetInvoca tionList()¶ó´Â ÇÔ¼ö¸¦ Á¦°øÇÏ°í ÀÖ´Ù. À̸¦ ÀÌ¿ëÇϸé linked-listÀÇ °¢ ±¸¼º¿øÀ» ¶È°°ÀÌ º¹»çÇÑ ¹è¿·Î ¸®ÅϹÞÀ» ¼ö ÀÖ´Ù. ´Ü À̶§ _prev Çʵå´Â ÇÊ¿ä¾ø±â ¶§¹®¿¡ null·Î ¼ÂÆÃÀÌ µÈ´Ù.
delegate[] arraydelegates = broker.GetInvocationList();
foreach(Information agent in arraydelegates)
{
Console.WriteLine(agent.Method);
}
À̺¥Æ® Çڵ鷯·Î ÀÓ¸íÇÕ´Ï´Ù~ ÀÌÁ¦ ¸¶Áö¸·À¸·Î À̺¥Æ®¿¡ ´ëÇØ ¾Ë¾Æ º¸ÀÚ. À̺¥Æ®´Â ÇÑ ¿ÀºêÁ§Æ®¿¡¼ ¾î¶² ÀÏÀÌ ÀϾ¼ ±× ÀÏÀ» ´Ù¸¥ ¿ÀºêÁ§Æ®¿¡°Ô ¾Ë·ÁÁÙ ¶§ ÀÌ¿ëÇÑ´Ù. ÀÌ´Â µ¨¸®°ÔÀÌÆ®¿Íµµ ¸¹ÀÌ À¯»çÇѵ¥, ½ÇÁ¦·Îµµ µ¨¸®°ÔÀÌÆ®¸¦ ÀÌ¿ëÇϹǷΠÀ̺¥Æ®´Â µ¨¸®°ÔÀÌÆ®ÀÇ Æ¯º°ÇÑ ¿ëµµ¶ó°í »ý°¢ÇÏ¸é µÈ´Ù. ¿¹¸¦ µé¾î ¾Õ¼ Á¤ÀÇÇÑ ±â»óÁ¤º¸ ½Ã½ºÅÛÀ» À̺¥Æ®·Î ¸¸µé¾î º¸ÀÚ. À̶§ À̺¥Æ®¶ó´Â Àǹ̿¡ Á»´õ Ãæ½ÇÇϱâ À§ÇØ ±â»ó Ưº¸¸¦ ±â»óû¿¡¼ ¹ß·ÉÇÑ´Ù°í °¡»óÇØ º¸¾Ò´Ù. À̶§ ±â»óû¿¡¼´Â ÀÚ½ÅÀÇ À̺¥Æ®¿¡ µî·ÏµÈ ½Å¹®»ç¿¡°Ô ÅëÁöÇØ ÁØ´Ù. <¸®½ºÆ® 4>¸¦ º¸ÀÚ.
|
namespace MeteorologicalSystem2 { // ±â»óû class MeteorologicalOffice { // À̺¥Æ® ÀÎÀÚ Á¤ÀÇ public class SpecialReportEventArgs : EventArgs { public SpecialReportEventArgs(string nephanalysis) { this.nephanalysis = nephanalysis; } // À̺¥Æ® ÀÎÀÚ ³»¿¡¼ ¾µ ¸ñ·Ï public readonly string nephanalysis; } // À§ÀÓÇü ¼±¾ð public delegate void SpecialReportEventHandler( object sender , SpecialReportEventArgs args); // À̺¥Æ® Á¤ÀÇ public event SpecialReportEventHandler SpecialReport; // À̺¥Æ®¸¦ ¹ß»ý½ÃÅ°´Â ÇÔ¼ö protected virtual void OnSpecialReport(SpecialReportEventArgs e) { if ( SpecialReport != null ) { SpecialReport(this,e); } } // À̺¥Æ® ¹ß»ýÀ» À§ÇØ Å×½ºÆ®¿ëÀ¸·Î ¸¸µç ÇÔ¼ö public void SimulateEvent(string nephanalysis) { SpecialReportEventArgs e = new SpecialReportEventArgs (nephanalysis); OnSpecialReport(e); } } // ½Å¹®»ç class NewspaperCompany { public NewspaperCompany( MeteorologicalOffice mm) { mm.SpecialReport += new MeteorologicalOffice. SpecialReportEventHandler(Publish); } // ½Å¹®»ç¿¡¼ ½Å¹®À» ¹ß°£ public static void Publish( object sender , MeteorologicalOffice. SpecialReportEventArgs e) { Console.WriteLine(¡°[½Å¹®»ç Ưº¸] ±¸¸§ºÐÆ÷:{0}¡±, e.nephanalysis); } } // Class2¿¡ ´ëÇÑ ¿ä¾à ¼³¸í class Class2 { // ÇØ´ç ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ÁÖ ÁøÀÔÁ¡ [STAThread] static void Main(string[] args) { // TODO: ¿©±â¿¡ ÀÀ¿ë ÇÁ·Î±×·¥À» ½ÃÀÛÇÏ´Â Äڵ带 Ãß°¡ MeteorologicalOffice office = new MeteorologicalOffice(); NewspaperCompany company = new NewspaperCompany(office); office.SimulateEvent(¡°ÅÂdz ºÏ»ó¡±); // À̺¥Æ®¸¦ ³Ö¾îÁÜ } } }
| |
|
À̺¥Æ® ÀÌ¿ë¿¡´Â ¸î °¡Áö °ü·Ê°¡ ÀÖ´Ù. ¸ÕÀú ÀϹÝÀûÀÎ µ¨¸®°ÔÀÌÆ®¿¡¼´Â ÀÎÀÚ¿¡ Á¦ÇÑÀÌ ¾øÁö¸¸ À̺¥Æ®¿¡¼´Â µÎ °³ÀÇ ÀÎÀÚ¸¦ »ç¿ëÇÑ´Ù. ±× µÎ °³´Â º¸³»´Â ÀÌ°¡ ´©±¸ÀÎÁö ³ªÅ¸³»´Â objectÇü°ú System.EventArgs¿¡¼ »ó¼Ó¹ÞÀº Ŭ·¡½º¸¦ ÀÎÀÚ·Î ¹Þ´Â °ÍÀÌ ÀÖ´Ù. ¸ÕÀú ¹Þ´Â »ç¶÷ÀÌ ¿©·¯ »ç¶÷ÀÇ À̺¥Æ®¿¡ µî·ÏÇØ µÎ¸é ´©°¡ º¸³Â´ÂÁö ¾Ë ¼ö ¾øÀ¸¹Ç·Î ´©°¡ º¸³Â´ÂÁö ¾Ë±â À§ÇØ Ã¹ ¹ø° ÀÎÀÚ·Î objectÇü ÀÎÀÚ¸¦ ¹Þ´Â´Ù.
¿¹¸¦ µé¸é ½Å¹®»ç´Â Á¤º¸¸¦ ±â»óûÀ¸·ÎºÎÅÍ µéÀ» ¼öµµ ÀÖÁö¸¸ ¼Ò½ÄÀÌ µé¾î¿À´Â °æ·Î´Â ¿©·¯ ±ºµ¥ÀÏ °ÍÀÌ´Ù. ´©°¡ ±× Á¤º¸¸¦ º¸³Â´ÂÁö ¾Ë¾Æ¾ß ÇÒ ¶§°¡ Àֱ⠶§¹®¿¡ ÀÌ·± ¹æ¹ýÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. µÎ ¹ø° ÀÎÀÚ´Â EventArgs¸¦ »ó¼Ó¹ÞÀº Ŭ·¡½ºÀε¥ À̸¦ »ç¿ë¸é Á»´õ ±ò²ûÇÏ°Ô ÀÎÀÚ °ü¸®¸¦ ÇÒ ¼ö ÀÖ´Ù(±×·¯³ª ¿©±â¼´Â ÆíÀǸ¦ À§Çؼ ´Ü¼øÇÏ°Ô ÇϳªÀÇ ÀÎÀÚ¸¸ ½è´Ù).
À̺¥Æ®¿¡¼´Â À̸§À» Á¤ÇÏ´Â µ¥ À־µ ¸î °¡Áö °ü·Ê°¡ ÀÖ´Ù. ¸ÕÀú System.EventArgs¸¦ »ó¼Ó¹Þ´Â Ŭ·¡½º´Â ±× À̸§ ³¡¿¡ EventArgs¸¦ ºÙ¿©ÁØ´Ù. ¶ÇÇÑ µ¨¸®°ÔÀÌÆ®¸¦ ¼±¾ð½Ã¿¡µµ À̸§ µÚ¿¡ EventHandler¸¦ ºÙ¿©ÁØ´Ù. ¸¶Áö¸·À¸·Î À̺¥Æ®¸¦ ¹ß»ý½ÃÅ°´Â ¸Þ½îµå´Â À̸§ ¾Õ¿¡ OnÀ» ºÙ¿©ÁØ´Ù. <¸®½ºÆ® 4>¸¦ º¸¸é ±×³É À̺¥Æ® Å°¿öµå¾øÀÌ °ü·Ê¸¸ µû¶óÁÖ¸é À̺¥Æ®°¡ µÇÁö ¾Ê´À³Ä°í ¹°À» ¼ö Àִµ¥ »ç½Ç À̺¥Æ®´Â ³»ºÎÀûÀ¸·Î ¶Ç ´Ù¸¥ ÀÏÀ» ÇÏ°í ÀÖ´Ù. ¹«½¼ ÀÏÀ» ³»ºÎÀûÀ¸·Î ²Ù¹Ì´ÂÁö ¾Ë±â À§ÇØ ILDASMÀ¸·Î È®ÀÎÇØ º¸ÀÚ.
|
<ȸé 11> À̺¥Æ®°¡ µé¾î°£ Ŭ·¡½º |
<ȸé 11>À» º¸¸é »ý¼ºÇÏÁö ¾Ê¾Ò´ø µÎ °³ÀÇ ÇÔ¼ö°¡ Ãß°¡µÇ¾î ÀÖ´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù. °Ô´Ù°¡ ¿ì¸®´Â SpecialReport¸¦ publicÀ¸·Î ¼±¾ðÀ» Çߴµ¥ privateÀ¸·Î µÇ¾î ÀÖ´Ù. À̸¦ °¡»ó ÄÚµå·Î ³ªÅ¸³» º¸ÀÚ.
private SpecialReportEventHandler SpecialReport = null;
// À̺¥Æ® µî·Ï ¸Þ½îµå
[MethodImpAttribute(MethodImplOption.Synchronized)]
public void add_SpecialReport(SpecialReportEventHandler handler)
{
SpecialReport = (SpecialReportEventHandler)
delegate.Combine
(SpecialReport, handler);
}
// À̺¥Æ® µî·ÏÇØÁ¦ ¸Þ½îµå
[MethodImpAttribute(MethodImplOption.Synchronized)]
public void remove_SpecialReport(SpecialReportEventHandler handler)
{
SpecialReport = (SpecialReportEventHandler)
delegate.Remove
(SpecialReport, handler);
}
¸ÕÀú ¿ì¸®°¡ publicÀ¸·Î ¼±¾ðÇÑ SpecialReport°¡ privateÀ¸·Î µÇ¾î ÀÖÀ¸¸é¼ null·Î ÃʱâȵǾî ÀÖ´Ù. ÀÌ´Â À̺¥Æ®¶ó´Â °ÍÀ» ¿ÜºÎ¿¡¼ ÇԺηΠÁ¢±ÙÇÏÁö ¸øÇÏ°Ô ¸·±â À§ÇÔÀÌ´Ù. ¿¹¸¦ µé¾î ÅÂdzÀÌ ¿À´Â ±×·± ±Þ¹ÚÇÑ »óȲ¿¡¼¸¸ À̺¥Æ®°¡ ¹ß»ýÇØ¾ß Çϴµ¥ À̸¦ publicÀ¸·Î µÑ °æ¿ì ¿ÜºÎ¿¡¼ ¸¶À½´ë·Î ÅëÁ¦Çϰųª, ¹Ù¶÷ÀÌ ºÒ¾îµµ ±â»ó Ưº¸¸¦ ¹ß·ÉÇÏ´Â ¿ì¸¦ ¹üÇÒ ¼ö°¡ Àֱ⠶§¹®ÀÌ´Ù. ±×·¡¼ À̺¥Æ®´Â ±× À̺¥Æ®¸¦ ¼ÒÀ¯ÇÑ Å¬·¡½º ³»¿¡¼¸¸ ¹ß»ý½Ãų ¼ö ÀÖ°Ô Çϱâ À§ÇØ private Çʵå·Î µÎ´Â °ÍÀÌ´Ù.
¶ÇÇÑ add_£ª¿Í remove_*¶ó´Â µÎ°³ÀÇ ¸Þ½îµå°¡ Ãß°¡µÆ´Âµ¥, ÀÌ´Â ¸Þ½îµå¸í¿¡¼ ¾Ë ¼ö ÀÖµíÀÌ À̺¥Æ®¿¡ µî·ÏÀÚ(listener)µéÀ» µî·Ï/ÇØÁ¦ÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. +=¿Í -=¿¬»êÀÚ¸¦ ¾²¸é add_*³ª remove_*·Î ÄÄÆÄÀÏ·¯°¡ ¹Ù²ã ÁØ´Ù. CombineÀ̳ª Remove¸¦ ¾´ °æ¿ì¿Í ´Ù¸£Áö ¾Ê°Ô º¸ÀÏ ¼ö ÀÖÀ¸³ª, ÀÚ¼¼È÷ º¸¸é ¸Þ½îµå À§¿¡ ¾ÖÆ®¸®ºäÆ®°¡ ÀÖ´Ù.
ÀÌ´Â ¸Þ½îµå¸¦ µ¿±âȽÃÄѼ ¾²·¹µå¿¡ ´ëÇÑ ¾ÈÁ¤¼ºÀ» º¸ÀåÇØ ÁØ´Ù. ¿¹¸¦ µé¸é µÎ °³ÀÇ ¸®½º³Ê°¡ µ¿½Ã¿¡ À̺¥Æ®¿¡ µî·Ï/ÇØÁ¦Çصµ linked-list°¡ ±úÁöÁö ¾Ê°í ¿Ã¹Ù·Î À¯ÁöµÈ´Ù(<ȸé 12>). °á·ÐÀûÀ¸·Î À̺¥Æ®´Â °á±¹ µ¨¸®°ÔÀÌÆ®ÀÇ Æ¯º°ÇÑ ÄÉÀ̽ºÀε¥ º¸´Ù º¸¾È°ú ¾ÈÁ¤¼º¿¡ ÁßÁ¡À» µÐ ÄÉÀ̽º¶ó°í ÇÒ ¼ö ÀÖ´Ù.
|
<ȸé 12> µ¿±âÈµÈ ¸Þ½îµå |
´ÙÀ½ ±Û¿¡¼´Â ºñµ¿±â ÇÁ·Î±×·¡¹ÖÀ»
À̹ø ±Û¿¡¼´Â ¼¹ö ±¸ÃàÇÏ´Â µ¥ ÀÖ¾î ÇʼöÀÎ ºñµ¿±â ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö¿¡ ¾Õ¼, ºñµ¿±â ÇÁ·Î±×·¡¹ÖÀÇ ±âº»ÀÎ µ¨¸®°ÔÀÌÆ®¿¡ ´ëÇÏ ¾Ë¾ÆºÃ°í, µ¨¸®°ÔÀÌÆ®ÀÇ Æ¯º°ÇÑ ÄÉÀ̽ºÀÎ À̺¥Æ®¿¡ ´ëÇؼµµ ¾Ë¾ÆºÃ´Ù. ´ÙÀ½ ¿¬Àç¿¡¼´Â ºñµ¿±â ÇÁ·Î±×·¡¹ÖÀÇ ¿ø¸®¿Í »ç¿ë ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æ º¼ °ÍÀÌ´Ù. @
¢º Àüü ¼Ò½º ´Ù¿î·Îµå