• ÇÁ¸®Ä«¿îÅÍ
  • Ç÷¡½ÃºÏ
  • ÇÁ¸®º¸µå
  • Àü±¤ÆÇ
  • À¥°øºÎ¹æ
  • Ä¿¹Â´ÏƼ
[C#°ú Ç÷¡½Ã·Î ¿Â¶óÀÎ °ÔÀÓ ¸¸µé±â] ¨ç µ¨¸®°ÔÀÌÆ® ÀÌÇØ 2006.11.16 13:26
±Û¾´ÀÌ : ¾â¸®È¨¼îÇÎ Á¶È¸ : 3514 Ãßõ : 0

[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>°ú °°´Ù.

<Ç¥ 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);
}

<Ç¥ 2> µ¨¸®°ÔÀÌÆ®ÀÇ Private Çʵå

 
Çʵå ŸÀÔ ¼³ ¸í
_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>¸¦ º¸ÀÚ.

 <¸®½ºÆ® 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> µ¿±âÈ­µÈ ¸Þ½îµå


´ÙÀ½ ±Û¿¡¼­´Â ºñµ¿±â ÇÁ·Î±×·¡¹ÖÀ»
À̹ø ±Û¿¡¼­´Â ¼­¹ö ±¸ÃàÇÏ´Â µ¥ ÀÖ¾î ÇʼöÀÎ ºñµ¿±â ¼ÒÄÏ ÇÁ·Î±×·¡¹Ö¿¡ ¾Õ¼­, ºñµ¿±â ÇÁ·Î±×·¡¹ÖÀÇ ±âº»ÀÎ µ¨¸®°ÔÀÌÆ®¿¡ ´ëÇÏ ¾Ë¾ÆºÃ°í, µ¨¸®°ÔÀÌÆ®ÀÇ Æ¯º°ÇÑ ÄÉÀ̽ºÀÎ À̺¥Æ®¿¡ ´ëÇؼ­µµ ¾Ë¾ÆºÃ´Ù. ´ÙÀ½ ¿¬Àç¿¡¼­´Â ºñµ¿±â ÇÁ·Î±×·¡¹ÖÀÇ ¿ø¸®¿Í »ç¿ë ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æ º¼ °ÍÀÌ´Ù. @

¢º Àüü ¼Ò½º ´Ù¿î·Îµå

 

¸ñ·Ï À­±Û ¾Æ·§±Û
³»¾Ë FREECOUNT.NET ÇÁÄ«³Ý »ý±ä³¯ 2003.12.20 Ȩ | Ä«¿îÅÍ | Ç÷¡½ÃºÏ | ÇÁ¸®º¸µå | Àü±¤ÆÇ | À¥°øºÎ¹æ | Ä¿¹Â´ÏƼ | ÂÊÁöÇÔ