¿£ÅÍÇÁ¶óÀÌÁî ¾ÖÇø®ÄÉÀ̼ǿ¡¼ º¸¾ÈÀº ÇʼöÀûÀÎ ¿ä¼ÒÀÌ´Ù. À̹ø È£¿¡¼´Â Ç÷¡½ÃÀÇ º¸¾È À̽´¿Í XML À¥ ¼ºñ½º¸¦ ÀÌ¿ëÇÏ´Â ¶Ç ´Ù¸¥ °·ÂÇÑ ¹æ¹ýÀÎ Ç÷¡½Ã ¸®¸ðÆÃ¿¡ ´ëÇØ »ìÆìº»´Ù.
Áö³ È£¿¡¼ ¿ì¸®´Â Ç÷¡½Ã¿¡¼ XMLÀ» ¾î¶»°Ô ´Ù·ç°í XML Åë½ÅÀ» ¾î¶»°Ô ÇÏ´ÂÁö¿¡ ´ëÇØ »ìÆìºÃ´Ù. ÇÏÁö¸¸ °£ÆíÇϸ鼵µ ÈξÀ °·ÂÇÑ ¹æ¹ýÀÌ Á¦°øµÇ´Âµ¥ ±×°ÍÀÌ ¹Ù·Î ¡®Ç÷¡½Ã ¸®¸ðÆÃ(Flash Remoting)¡¯ÀÌ´Ù.
Ç÷¡½Ã ¸®¸ðÆÃÀº ÁÖ·Î XML À¥ ¼ºñ½º¸¦ ÀÌ¿ëÇϱâ À§ÇØ ç¿ëÇÏÁö¸? ´å³Ý ¸®¸ðÆÃ(.NET Remoting)À̳ª ÀÚ¹Ù RMI¿Í ºñ½ÁÇÏ´Ù. Áï, ¸®¸ðÆÃÀ» ÅëÇØ ¿ø°Ý(¼¹ö »çÀ̵å)¿¡ ÀÖ´Â ¸Þ½îµå¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. ³»ºÎÀûÀ¸·Î´Â SWF(Ç÷¡½Ã Ç÷¹À̾¼ ¼öÇàµÇ´Â Ç÷¡½Ã ÆÄÀÏÀ» °¡¸®Å´)ÀÇ Åë½Å ±â´ÉÀ» Ç÷¡½Ã ¸®¸ðÆÃ ÄÄÆ÷³ÍÆ®¸¦ ÅëÇØ È®ÀåÇÑ °ÍÀ¸·Î, Åë½Å ÇÁ·ÎÅäÄÝ ÀÚü´Â Ç÷¡½ÃÀÇ °íÀ¯ÇÑ ¹æ¹ýÀ¸·Î ±¸ÇöµÇ¾î ÀÖ´Ù.
 |
| <±×¸² 1> Ç÷¡½Ã ¸®¸ðÆÃ °³³ä |
Ç÷¡½Ã ¸®¸ðÆÃ
Ç÷¡½Ã ¸®¸ðÆÃÀº SOAP ±â¹ÝÀÇ À¥ ¼ºñ½º¸¦ ÅëÇÕÇϱâ À§ÇÑ ¼¹öÃø µµ±¸(½ÇÁ¦·Î À¥ ¼¹ö¿ë ÇÊÅÍ·Î µ¿ÀÛÇÑ´Ù)ÀÌ´Ù(<±×¸² 1> ÂüÁ¶). ÄݵåÇ»Àü MX, ´å³Ý, ÀÚ¹Ù ¹öÀüÀÌ °¢°¢ µû·Î ÀÖÀ¸¸ç, EJB ±¸ÃàµÈ ¼ºñ½º, ´å³Ý ¼¹ö, ÄݵåÇ»Àü µîÀ¸·Î ±¸ÃàµÈ À¥ ¼ºñ½º¸¦ Ç÷¡½Ã¿¡¼ ±×´ë·Î ÀÌ¿ëÇÒ ¼ö ÀÖµµ·Ï Çϱ⠶§¹®¿¡ À¥ ¼ºñ½º¸¦ ÀÌ¿ëÇÏ´Â Ç÷¡½Ã ¾ÖÇø®ÄÉÀ̼ÇÀ» ½±°Ô ±¸ÃàÇÒ ¼ö ÀÖ´Ù. Áï, ºñÁî´Ï½º ·ÎÁ÷Àº ¼¹öÃø¿¡ À¥ ¼ºñ½º·Î ±¸ÃàÇϰí Ŭ¶óÀ̾ðÆ®Ãø UI Ç÷¡½Ã·Î °³¹ßÇÏ·Á´Â °æ¿ì¿¡ °¡Àå ÁÁ´Ù°í ÇÒ ¼ö ÀÖ´Ù. ¼¹öÃø °³¹ßÀÚ´Â ¡®Flash Remoting MX¡¯¸¦ ¼³Ä¡ÇÏ´Â °Í ¿Ü¿¡ Ãß°¡ÀûÀÎ Äڵ带 ÀÛ¼ºÇØ¾ß ÇÏ´Â ÀÏÀº ¾ø´Ù.
ASP.NET À¥ ¼ºñ½º¸¦ ¸¸µé°í Ç÷¡½Ã¿¡¼ ÀÌ À¥ ¼ºñ½º¸¦ È£ÃâÇÏ´Â °úÁ¤À» °£´ÜÇÏ°Ô »ìÆìº¸ÀÚ. ASP.NET ¼¹öÃø¿¡ ¡®Flash Remoting MX for Microsoft .NET¡¯ÀÌ ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù(Flash Remoting MX´Â »ó¿ë Á¦Ç°ÀÌÁö¸¸, ¸ÅÅ©·Î¹Ìµð¾î »çÀÌÆ®¿¡¼ Æò°¡ÆÇÀ» ¹Þ¾Æ ÃæºÐÈ÷ Å×½ºÆ®ÇØ º¼ ¼ö ÀÖ´Ù). ÀϹÝÀûÀ¸·Î ´ÙÀ½ Æú´õ¿¡ ¼³Ä¡µÈ´Ù.
C:\Inetpub\wwwroot\flashremoting
Ç÷¡½Ã ¸®¸ðÆÃÀ» »ç¿ëÇϴ Ŭ¶óÀÌ¾ðÆ® SWF¸¦ °³¹ßÇϱâ À§Çؼ´Â Ç÷¡½Ã¿¡ ¸®¸ðÆÃ ÄÄÆ÷³ÍÆ®(Flash Remoting Components)¸¦ ¼³Ä¡ÇØ¾ß ÇÑ´Ù(È¥µ·ÇÏÁö ¸»¾Æ¾ß ÇÑ´Ù. Remoting MX´Â ¼¹öÃø¿¡ ¼³Ä¡µÇ´Â ¿ä¼ÒÀ̸ç, ÀÚ¹Ù, ´å³Ý, ÄݵåÇ»Àü µîÀÇ ¹öÀüÀÌ µû·Î ÀÖ´Ù. Remoting ÄÄÆ÷³ÍÆ®´Â Ç÷¡½Ã¿¡ Ãß°¡·Î ¼³Ä¡µÇ´Â Ç÷¡½Ã Ŭ¶óÀÌ¾ðÆ® °³¹ß¿ë ÄÄÆ÷³ÍÆ®ÀÌ´Ù). ¸®¸ðÆÃ ÄÄÆ÷³ÍÆ®°¡ ¼³Ä¡µÇ¸é <ȸé 1>ó·³ ¡®Remoting¡¯À̶õ ÄÄÆ÷³ÍÆ®°¡ ¼³Ä¡µÇ°í, ÀÌÇÏ¿¡ ¡®NetServices¡¯µîÀÇ °´Ã¼°¡ »ý±â´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù.
 |
| <ȸé 1> Ç÷¡½Ã ¸®¸ðÆÃ ÄÄÆ÷³ÍÆ® ¼³Ä¡ È®ÀÎ |
¸ÕÀú ASP.NETÀ¸·Î °£´ÜÇÑ À¥ ¼ºñ½º¸¦ ¸¸µé¾î º¸ÀÚ. ºñÁÖ¾ó ½ºÆ©µð¿À ´å³ÝÀ» ½ÃÀÛÇÏ°í ¡®HelloFlash¡¯¶õ À̸§À¸·Î À¥ ¼ºñ½º ÇÁ·ÎÁ§Æ®¸¦ ¸¸µç´Ù(<ȸé 2> ÂüÁ¶). ±×¸®°í, HelloWorld ¸Þ½îµåÀÇ ÁÖ¼®À» Á¦°ÅÇØ ºôµåÇÑ´Ù. <¸®½ºÆ® 1>ó·³ °¡Àå °£´ÜÇÑ À¥ ¼ºñ½º¸¦ ¸¸µé°í ´ÙÀ½°ú °°ÀÌ WSDLÀ» È®ÀÎÇØ º¸ÀÚ.
http://localhost/HelloFlash/Service1.asmx?WSDL
ÀÌ WSDLÀº HelloFlash ÇÁ·ÎÁ§Æ®¿¡¼ ³ëÃâµÇ´Â À¥ ¼ºñ½º¿¡ ´ëÇÑ ¼³¸íÀ» ´ã°í ÀÖ´Ù(Ç÷¡½ÃÃø¿¡¼ ÀÌ WSDLÀÌ »ç¿ëµÈ´Ù).
 |
| <ȸé 2> À¥ ¼ºñ½º ÇÁ·ÎÁ§Æ® ¸¸µé±â |
|
<¸®½ºÆ® 1> Hello World À¥ ¼ºñ½º | |
| |
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Web; using System.Web.Services; namespace HelloFlash { public class Service1 : System.Web.Services.WebService { public Service1() { InitializeComponent(); } [WebMethod] public string HelloWorld() { return "Hello World"; } } }
| |
 |
ÀÌÁ¦ ´ÙÀ½°ú °°Àº ¼ö¼øÀ¸·Î ÀÛ¾÷ÇØ HelloFlash Æú´õ¸¦ Ç÷¡½Ã ¸®¸ðÆÃÀÌ °¡´ÉÇϵµ·Ï Áغñ¸¦ ÇÑ´Ù.
1 Ç÷¡½Ã ¸®¸ðÆÃ Æú´õ(flashremoting)¿¡ ÀÖ´Â flashgateway.dll ÆÄÀÏÀ» HelloFlash/bin Æú´õ¿¡ º¹»çÇÑ´Ù.
2 HelloFlash Æú´õ µî·ÏÁ¤º¸¿¡¼ º¸¾È ÅÇÀ» ´©¸£°í, ASPNET °èÁ¤À» Ãß°¡ÇÏ°í ¾²±â(Write) ±ÇÇÑÀ» Ãß°¡ÇÑ´Ù.
3 ºó apsx ÆäÀÌÁö¸¦ ¸¸µç´Ù(¿©±â¼´Â default.aspx ÆäÀÌÁö¸¦ ¸¸µé¾ú´Ù).
4 web.config¿¡ ´ÙÀ½ÀÇ ³»¿ëÀ» Ãß°¡ÇÑ´Ù.
<httpModules>
<add name="GatewayController"
type="FlashGateway.Controller.GatewayController,flashgateway"/>
</httpModules>
HelloFlash Æú´õ°¡ Ç÷¡½Ã ¸®¸ðÆÃ¿¡ »ç¿ëµÉ ¼ö ÀÖ°Ô ÁغñµÆ´Ù. ÀÌÁ¦ Ç÷¡½Ã¸¦ ½ÃÀÛÇϰí, ù ÇÁ·¹ÀÓ¿¡ <¸®½ºÆ® 2>¿Í °°ÀÌ ¾×¼Ç½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇÑ´Ù. getService() ¸Þ½îµå´Â ¡®http://localhost/HelloFlash/Service1.asmx?wsdl¡¯¿¡ ±â¼úµÈ WSDL ³»¿ëÀ» °¡Áö°í ÇÁ·Ï½Ã °´Ã¼¸¦ »ý¼ºÇÑ´Ù. »ý¼ºµÈ serv °´Ã¼¸¦ ÅëÇØ ´ÙÀ½°ú °°ÀÌ ¸Þ½îµå¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù.
serv.HelloWorld();
À¥ ¸Þ½îµå¸¦ È£ÃâÇÏ¸é ¡°¸Þ½îµå À̸§_Result()¡±, ¡°¸Þ½îµå À̸§_Status()¡±ÀÇ ÄݹéÀÌ È£ÃâµÈ´Ù. ÀÌ ÄݹéÀ» ÅëÇØ ¸®ÅÏ °ªÀ» ¾òÀ» ¼ö ÀÖ´Ù.
function HelloWorld_Result(result)
{
trace( result );
}
¼öÇà °á°ú´Â ¡°Hello, World¡±¶ó°í Ãâ·ÂµÇÁö¸¸ XML À¥ ¼ºñ½º¸¦ °£´ÜÇÑ ¾×¼Ç½ºÅ©¸³Æ® ÄÚµå·Î ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù´Â Á¡¿¡¼ ¸®¸ðÆÃÀº ¹«Ã´ °·ÂÇÑ ¹æ¹ýÀÌ µÈ´Ù(ATL/COMÀ¸·Î ¾î·Æ°Ô ¾×ƼºêX ÄÁÆ®·ÑÀ» ±¸ÇöÇÏ´Â °Í¿¡ ºñÇØ ÈξÀ ÀûÀº ºñ¿ëÀ¸·Î ºü¸£°Ô Ŭ¶óÀÌ¾ðÆ®¸¦ °³¹ßÇÒ ¼ö ÀÖ´Ù).
|
<¸®½ºÆ® 2> XML À¥ ¼ºñ½º¸¦ È£ÃâÇÏ´Â ¾×¼Ç½ºÅ©¸³Æ® | |
| |
#include "NetServices.as" #include "NetDebug.as" if (inited == null) { inited = true; NetServices.setDefaultGatewayURL("http://localhost/HelloFlash/default.aspx") gateway = NetServices.createGatewayConnection(); serv = gateway.getService("http://localhost/HelloFlash/Service1.asmx?wsdl", this); } serv.HelloWorld(); function HelloWorld_Result(result) { trace( result ); } function HelloWorld_Status(result) { trace( error.descript-xion ); trace( result ); }
| |
 |
³¯¾¾, Áõ±Ç, »óǰ Á¶È¸ µî º¯ÈÇÏ´Â µ¥ÀÌÅ͸¦ Á¶È¸Çϰųª ¼¹ö¿Í »óÈ£ÀÛ¿ëÀ» ÇÏ´Â ¼ºñ½º¸¦ ±¸¼ºÇÒ ¶§ Ç÷¡½Ã ¸®¸ðÆÃÀº ¸Å¿ì À¯¿¬Çϸ鼵µ °·ÂÇÑ ¹æ¹ýÀÌ µÈ´Ù. Ç÷¡½Ã ¸®¸ðÆÃÀº ADO¿Í ¿¬°áµÇ¾î ¼¹ö ÃøÀÇ µ¥ÀÌÅ͸¦ ó¸®Çϰųª ¼¹ö ÃøÀÇ ¾î¼Àºí¸®¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. ÀÌ·± ±â´Éµµ À¥ ¼ºñ½º¸¦ ÀÌ¿ëÇÏ´Â °Í ¸øÁö¾Ê°Ô ´Ù¾çÇÑ ÀÀ¿ëÀÌ °¡´ÉÇÏ°Ô ÇÑ´Ù.
Ç÷¡½Ã º¸¾È : SWF´Â HTMLÀ̳ª ÀÚ¹Ù½ºÅ©¸³Æ®¿Í ´Ù¸£Áö ¾Ê´Ù?
¿£ÅÍÇÁ¶óÀÌÁî ¾ÖÇø®ÄÉÀ̼ǿ¡¼ º¸¾ÈÀº »©³õÀ» ¼ö ¾ø´Â À̾߱âÀÌ´Ù. ¾ÖÇø®ÄÉÀ̼ÇÀÌ °ø°³ÀûÀ¸·Î ¹èÆ÷µÇ´Â ÀÎÅÍ³Ý È¯°æ¿¡¼´Â ´õ´õ¿í ±×·¸´Ù. Ç÷¡½Ã °ü·Ã º¸¾È À̽´ Áß °¡Àå ¸ÕÀú ¶°¿À¸£´Â °ÍÀÌ ¹Ù·Î SWF µðÄÄÆÄÀÏ·¯(decompiler) - SWF ÆÄÀÏ¿¡¼ ¸®¼Ò½º¿Í ¾×¼Ç½ºÅ©¸³Æ®¸¦ ÃßÃâÇÏ´Â µµ±¸¿¡ ´ëÇÑ °ÍÀÌ´Ù.
<ȸé 3>Àº ´ëÇ¥ÀûÀÎ SWF µðÄÄÆÄÀÏ·¯(Sothink)ÀÇ ¼öÇà ȸéÀÌ´Ù. ¸®¼Ò½º´Â ¹°·Ð ¾×¼Ç½ºÅ©¸³Æ®¸¦ ¿Ïº®ÇÏ°Ô µðÄÄÆÄÀÏÇÑ´Ù. º¸¾ÈÀÇ °üÁ¡¿¡¼ º¼ ¶§ SWF´Â HTMLÀ̳ª ÀÚ¹Ù½ºÅ©¸³Æ®¿Í ´Ù¸£Áö ¾Ê´Ù. ¾×¼Ç½ºÅ©¸³Æ®¸¦ Æ÷ÇÔÇØ SWF°¡ °¡Áö°í ÀÖ´Â ³»¿ëÀº ¸ðµÎ ºÐÇØµÇ°í ÇØÃ¼µÉ ¼ö ÀÖ´Ù. SWF ÆÄÀÏ Æ÷¸ËÀÌ °ø°³µÇ¾î Àֱ⠶§¹®Àε¥, ¿øÃµÀûÀ¸·Î À̸¦ ¹æÁöÇÒ ¹æ¹ýÀº ¾ø´Ù(¹Ý¸é¿¡ FLA ÆÄÀÏÀº Æ÷¸ËÀÌ °ø°³µÇ¾î ÀÖÁö ¾Ê±â ¶§¹®¿¡ SWF¸¦ FLA·Î µðÄÄÆÄÀÏÇØ ÁÖ´Â µµ±¸´Â ¾ø´Ù).
 |
| <ȸé 3> SWF µðÄÄÆÄÀÏ·¯ ¼öÇà ȸé |
ÀÏ´Ü, Ç÷¡½Ã °³¹ßÀÚ ÀÔÀå¿¡¼ º¼ ¶§ ¾Ö½á ÀÛ¼ºÇØ ³õÀº Äڵ峪 ¸®¼Ò½º°¡ ³ëÃâµÈ´Ù´Â Ãø¸é¿¡¼ ¸Å¿ì ¾ÈŸ±î¿ï ¼ö ÀÖ´Ù. Ç÷¡½Ã Àü¹®°¡µéÀº ÀÚ½ÅÀÇ Äڵ带 º¸È£ÇϰíÀÚ ÇÒ °æ¿ì ¹«ºñŬ¸³À» ³ª´©¾î µ¿ÀûÀ¸·Î ·ÎµåÇϵµ·Ï ±Ç°íÇϰí ÀÖÁö¸¸, ÀÌ ¹æ¹ý ¶ÇÇÑ µðÄÄÆÄÀÏÀ» ¾î·Æ°Ô ÇÒ »Ó µðÄÄÆÄÀÏ ÀÚü¸¦ ¿øÃµÀûÀ¸·Î ¸·À» ¼ö´Â ¾ø´Ù.
À̺¸´Ù ´õ ¹®Á¦°¡ µÇ´Â °ÍÀº ¾×¼Ç½ºÅ©¸³Æ®¿¡ Æ÷ÇԵǾî ÀÖ´Â ·ÎÁ÷À̳ª µ¥ÀÌÅͰ¡ ³ëÃâµÈ´Ù´Â Á¡ÀÌ´Ù. ¼¹ö¿¡¼ ÀÎÁõÀ» ¹Þ´Â SWF³ª ¼¹ö¿Í »óÈ£ ÀÛ¿ëÀ» ÇÏ´Â °ÔÀÓÀ» Ç÷¡½Ã·Î Á¦ÀÛÇÒ ¶§´Â ¹Ýµå½Ã ÀÌ·± Á¡À» °í·ÁÇØ¾ß ÇÑ´Ù(¼¹ö¿Í Åë½ÅÇÏ´Â ÇÁ·ÎÅäÄÝÀÌ ¸ðµÎ ³ëÃâµÈ´Ù). SWF ¾È¿¡ Áß¿äÇÑ µ¥ÀÌÅͳª ÆÐ½º¿öµå °°Àº ³»¿ëÀ» ³Ö¾î¼´Â ¾È µÈ´Ù. ÀÌ ±Û¿¡¼ ¼³¸íÇϰí ÀÖ´Â Ç÷¡½Ã Åë½ÅÀÇ ´Ù¾çÇÑ ¹æ¹ýµéÀÌ Áß¿äÇÑ ÀÌÀ¯ Áß Çϳª°¡ ¿©±â¿¡ ÀÖ´Ù. Áï, Áß¿äÇÑ ¾Ë°í¸®ÁòÀº ¼¹ö¿¡ ±¸ÇöÇÔÀ¸·Î¼ ¾ÇÀÇÀûÀÎ °ø°Ý¿¡ ´ëºñÇØ¾ß Çϸç, ÇÁ·ÎÅäÄÝ ³ëÃâÀ» °í·ÁÇØ ¼¹ö¸¦ ¾ÈÀüÇÏ°Ô º¸È£ÇÒ ¹æ¹ýÀ» ¸¶·ÃÇØ¾ß ÇÑ´Ù.
Ç÷¡½Ã Åë½Å º¸¾È°ú SSL
¿ì¸®°¡ »ç¿ëÇÏ´Â ÀÎÅÍ³Ý »óÀÇ Åë½ÅÀº ¿±¼¿Í °°´Ù. Áï, ¿±¼°¡ Áö³ª´Â ±æ¿¡ ÀÖ´Ù¸é ´©±¸³ª ¿±¼¿¡ ¾²¿©Áø ³»¿ëÀ» º¼ ¼ö ÀÖ´Ù. HTMLÀ̳ª SWF, ¸ÞÀÏ ¸ðµÎ ¸¶Âù°¡ÁöÀÌ´Ù(½ÉÁö¾î ´ëºÎºÐÀÇ ÀÎÅÍ³Ý »çÀÌÆ®¿¡¼ ÀÔ·ÂÇÏ´Â ¾ÆÀ̵ð¿Í ÆÐ½º¿öµåµµ ÀüÇô ¾ÏȣȵÇÁö ¾ÊÀº ä µ¹¾Æ´Ù´Ñ´Ù). ¼¹ö¿Í Ŭ¶óÀÌ¾ðÆ® »çÀÌ¿¡¼ ´©±º°¡ ¸¶À½¸¸ ¸ÔÀ¸¸é ¼Õ½±°Ô µ¥ÀÌÅ͸¦ º¼ ¼ö ÀÖ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ´Â °ÍÀÌ SSL(Secure Socket Layer)ÀÌ´Ù. SSLÀº º°µµÀÇ Ãß°¡ÀûÀÎ °³¹ß ¾øÀÌ ¿ÏÀüÇÑ º¸¾ÈÀ» ±¸ÇöÇÑ´Ù(Áï, º¸³»´Â Ãø°ú ¹Þ´Â Ãø »çÀÌ¿¡¼ µ¥ÀÌÅ͸¦ Áß°£¿¡ º¼ ¼ö ÀÖ´Ù ÇÏ´õ¶óµµ ÀüÇô ÇØµ¶ÇÒ ¼ö ¾ø´Ù).
Ç÷¡½Ã´Â HTTPS(HTTP + SSL)¸¦ Áö¿øÇÑ´Ù. »ç½Ç Ç÷¡½Ã ÀÚü°¡ SSLÀ» Áö¿øÇѴٱ⺸´Ù´Â ºê¶ó¿ìÀú°¡ Á¦°øÇÏ´Â SSLÀ» ÀÌ¿ëÇÑ´Ù°í ÇÏ´Â ÆíÀÌ ¸ÂÀ» °ÍÀÌ´Ù. ¿©·¯ºÐÀÌ SSLÀÌ Àû¿ëµÈ À¥ ÆäÀÌÁö¿¡¼ SWF¸¦ ¹Þ¾Ò´Ù¸é ±×°ÍÀº SWF¿Í µ¥ÀÌÅÍ Àüü°¡ ¾ÏȣȵŠÀü¼ÛµÆÀ½À» ÀǹÌÇÑ´Ù. ÁÖÀÇÇÒ °ÍÀº SWF°¡ Àü¼Û Áß¿¡´Â ¾Ïȣȵȴٴ Á¡ÀÌ´Ù. Áï, SWF µðÄÄÆÄÀÏÀ» ¸·´Â °Í°ú SSLÀº ¾Æ¹«·± »ó°üÀÌ ¾ø´Ù.
SSLÀº °¡Àå ¾ÈÀüÇÑ Åë½Å º¸¾È ¹æ¹ýÀÌ´Ù. ´ëºÎºÐÀÇ ºê¶ó¿ìÀú°¡ 128ºñÆ® SSL ¾Ïȣȸ¦ Á¦°øÇϰí ÀÖ¾î ÃæºÐÈ÷ ¾ÈÀüÇÏ´Ù°í ÇÒ ¼ö ÀÖ´Ù. À¥ ¼¹öÀÎ IIS(Internet Information Server)°¡ HTTPS¸¦ »ç¿ëÇÏ°Ô ÇÏ·Á¸é <ȸé 4>¿Í °°ÀÌ °øÀÎ ÀÎÁõ±â°üÀ¸·ÎºÎÅÍ °øÀÎ ÀÎÁõ¼¸¦ ¹Þ¾Æ¼ IIS¿¡ ¼³Ä¡Çϰí, <ȸé 5>ó·³ SSLÀ» »ç¿ëÇϵµ·Ï ¼³Á¤ÇÏ¸é µÈ´Ù(SSL ¼³Á¤Àº ÀÌ ±ÛÀÇ ¹üÀ§¸¦ ¹þ¾î³ª¹Ç·Î ÀÚ¼¼ÇÑ ¹æ¹ýÀº º£¸®»çÀΰú °°Àº °øÀÎ ÀÎÁõ±â°ü »çÀÌÆ®¸¦ Âü°íÇ϶ó).
 |
| <ȸé 4> IIS¿¡ ¼¹ö ÀÎÁõ¼ ¼³Ä¡ |
 |
| <ȸé 5> IIS¿¡ 128ºñÆ® SSL ¼³Á¤ |
Ç÷¡½Ã ¾ÏÈ£È Åë½Å
SSLÀ» »ç¿ëÇÒ ¼ö ¾øÀ» ¶§ ÃÖ¼ÒÇÑ µ¥ÀÌÅ͸¦ ¾ÏÈ£ÈÇØ º¸³»¾ß ÇÑ´Ù. ÀÎÁõ(authentication) °úÁ¤À» ¿¹·Î µé¾î »ìÆìº¸ÀÚ. ÆÐ½º¿öµå¿Í °°ÀÌ Áß¿äÇÑ µ¥ÀÌÅ͸¦ ±×´ë·Î Àü¼ÛÇØ¼´Â ¾È µÈ´Ù. <ȸé 6>Àº MD5¸¦ ±¸ÇöÇÑ ¿¹ÀÌ´Ù. ÇØ½Ã´Â µ¥ÀÌÅÍ Àüü¸¦ ¾ÏÈ£ÈÇÏ´Â °ÍÀº ¾Æ´ÏÁö¸¸ ¾ÏÈ£ÈµÈ °á°ú¸¦ °¡Áö°í ¿øº»À» ¾Ë ¼ö ¾ø´Ù´Â ´Ü¹æÇ⼺À» °¡Áö°í ÀÖ¾î ÀÎÁõ¿¡ ¸¹ÀÌ »ç¿ëµÈ´Ù(¼Ò½º´Â ¡®ÀÌ´ÞÀÇ µð½ºÄÏ¡¯¿¡ Æ÷ÇԵǾî ÀÖ´Ù).
 |
| <ȸé 6> MD5 ÇØ½Ã ±¸Çö ¿¹ |
ÇØ½Ã ¹æ¹ýÀ» ÀÌ¿ëÇØ ´ÙÀ½°ú °°ÀÌ ÀÎÁõÀ» ÇÒ ¼ö ÀÖ´Ù. ÀÌ ¹æ¹ýÀÇ ÇÙ½ÉÀº ½ÇÁ¦ ÆÐ½º¿öµå¸¦ º¸³»Áö ¾Ê´Â´Ù´Â °ÍÀÌ´Ù.
1 SWF´Â ¼¹ö¿¡ ÀÓÀÇÀÇ ¹®ÀÚ¿ SÀ» ¿äûÇÑ´Ù.
2 SWF´Â ¼ö½ÅµÈ S¿¡ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ ÆÐ½º¿öµå¸¦ ºÙ¿©¼ ÇØ½Ã ¾ÏÈ£ÈÇØ ¹®ÀÚ¿ A¸¦ »ý¼ºÇÑ´Ù.
3 A¸¦ ¼¹ö·Î Àü¼ÛÇÑ´Ù.
4 ¼¹ö´Â SWF·Î º¸³½ S¿Í µ¥ÀÌÅͺ£À̽º¿¡¼ ¾òÀº »ç¿ëÀÚ ÆÐ½º¿öµå¸¦ ºÙ¿©¼ ÇØ½ÃÈÇØ B¸¦ »ý¼ºÇÑ´Ù.
5 ¼¹ö´Â A¿Í B°¡ ÀÏÄ¡ÇÏ´ÂÁö ¿©ºÎ¸¦ È®ÀÎÇÑ´Ù.
Ç÷¡½Ã·Î Á¦ÀÛµÈ ³×Æ®¿öÅ© °ÔÀÓÀÌ ÀÖ´Ù°í ÇÏÀÚ. SWF°¡ µðÄÄÆÄÀÏµÈ´Ù¸é ¼¹ö¿Í Åë½ÅÇÏ´Â ÇÁ·ÎÅäÄÝÀÌ ¸ðµÎ °ø°³µÉ °ÍÀÌ´Ù. ÀÌ ¶§¹®¿¡ °ÔÀÓ ¼¹ö°¡ ÇØÅ·µÈ´Ù¸é À̰ÍÀº ¾öû³ ÀÏÀ» ¾ß±âÇÑ´Ù. µû¶ó¼ Ç÷¡½Ã ¾ÏȣȰ¡ ÇÊ¿äÇÏ´Ù. ´Ù½Ã ¸»ÇØ, ÇÁ·ÎÅäÄÝÀÌ ³ëÃâµÇ´õ¶óµµ ¾ÈÀüÇÏ°Ô Åë½ÅÇÒ ¹æ¹ýÀ» ¸¶·ÃÇØ¾ß Çϴµ¥ ¹Ù·Î ÇØ½Ã ¾ÏÈ£È¿Í °°Àº ¹æ¹ýÀÌ´Ù. ¿¹¸¦ µé¾î, ¼¹ö·ÎºÎÅÍ Æ¯Á¤ÇÑ Å°¸¦ ¹ß±Þ¹Þ¾Æ Ç×»ó ÇØ´ç Ű·Î ¾ÏÈ£ÈµÈ µ¥ÀÌÅ͸¦ ÁÖ°í¹Þ´Â´Ù¸é, Ŭ¶óÀÌ¾ðÆ® ¾ÏÈ£¿Í ¾Ë°í¸®Áò°ú ·ÎÁ÷À» ¾Ë´õ¶óµµ ¼¹öÃø¿¡ ÀÖ´Â ·ÎÁ÷À» ¾Ë¾Æ³»Áö ¸øÇÏ°Ô µÇ¾î °ÔÀÓÀ» ÇØÅ·Çϱâ Èûµé¾îÁø´Ù.
´ÙÀ½Àº SHA1 ¾Ë°í¸®ÁòÀ» Å×½ºÆ®ÇÏ´Â ¾×¼Ç½ºÅ©¸³Æ®ÀÌ´Ù. MD5 ÇØ½Ãº¸´Ù SHA1 ¾Ë°í¸®ÁòÀÌ ÈξÀ ¾ÈÀüÇÑ °ÍÀ¸·Î ¾Ë·ÁÁ® ÀÖ´Ù(MD5 ¾Ë°í¸®Áò°ú SHA1 ¾Ë°í¸®ÁòÀ» ±¸ÇöÇÑ ¾×¼Ç½ºÅ©¸³Æ®´Â ¡®ÀÌ´ÞÀÇ µð½ºÄÏ¡¯¿¡ Æ÷ÇԵǾî ÀÖÀ¸¸ç, Âü°íÀڷḦ ÅëÇØ¼µµ ¾òÀ» ¼ö ÀÖ´Ù).
#include "sha1.as"
trace(b64_sha1("Hello, World"));
¾ÕÀÇ ¼öÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.
kH0U+zrysNTxjC1Gq+iu3OFzZ70
¾ÕÀÇ ¾×¼Ç½ºÅ©¸³Æ®¿Í <¸®½ºÆ® 3>ÀÇ C# ÄÚµåÀÇ ¼öÇà °á°ú´Â ¶È°°´Ù. ÀÌ °á°ú¸¦ ÀÌ¿ëÇØ ¾Õ¼ ¼³¸íÇÑ ÀÎÁõÀ» ±¸ÇöÇÒ ¼ö ÀÖ´Ù. »ç½Ç ¿©±â¿¡´Â Á»´õ °³¼±µÈ ¹æ¹ýÀÌ ÇÊ¿äÇÏ´Ù. ¿¹¸¦ µé¾î, »çÀü(dictionary)¿¡ ÀÇÇÑ °ø°ÝÀ» ¸·±â À§ÇØ ¾ÏÈ£È µ¥ÀÌÅÍ¿¡ salt¸¦ Ãß°¡Çϰųª ÇØ½Ã¸¦ µÎ ¹ø Åë°úÇÏ°Ô ÇÏ´Â ¹æ¹ýµµ ÁÁÀº °³¼± ¹æ¹ýÀÌ´Ù.
|
<¸®½ºÆ® 3> C# SHA1 ¾Ë°í¸®Áò ±¸Çö ÄÚµå | |
| |
using System; using System.Text; using System.Security.Cryptography; class TestSha1 { static void Main(string[] args) { string plainText = "Hello, World"; // SHA1 ÇØ½Ã UTF8Encoding u8e = new UTF8Encoding(); byte[] byteBuffer = u8e.GetBytes(plainText); SHA1 sha = new SHA1CryptoServiceProvider(); byte[] result = sha.ComputeHash(byteBuffer); // ÇØ½Ã °ªÀ» base64 ¹®ÀÚ¿·Î º¯È¯ÇØ Ãâ·Â Console.WriteLine( Convert.ToBase64String( result ) ); } }
| |
 |
´Ù¸¥ º¸¾È À̽´
´Ù¿î·ÎµåµÈ SWF°¡ ´Ù¸¥ ¼¹ö(µµ¸ÞÀÎ)¿Í Åë½ÅÀ» ÇÏ´Â °ÍÀº ¾ÇÀÇÀûÀ¸·Î »ç¿ëµÉ °¡´É¼ºÀÌ ÀÖ¾î¼ À̸¦ ¸øÇÏ°Ô ¸·°í ÀÖ´Ù(À̰ÍÀº ÀÚ¹Ù ¾ÖÇø´µµ ¸¶Âù°¡Áö´Ù). À̰ÍÀ» ±³Â÷ »çÀÌÆ® °ø°Ý(Cross-Site Attack) ¹æÁö¶ó°í Çϴµ¥, SWF´Â ´Ù¿î·ÎµåµÈ ¼¹öÀÇ µµ¸ÞÀÎ ¾È¿¡ ÀÖ´Â ¼¹ö¿Í Åë½ÅÀÌ °¡´ÉÇÏ´Ù. ¿¹¸¦ µé¾î, www.elasticware.com¿¡¼ SWF°¡ ´Ù¿î·ÎµåµÆ´Ù¸é SWF´Â content.elasticware.com°ú Åë½ÅÀÌ °¡´ÉÇÏ´Ù(Áï, ÀÚ½ÅÀÌ ´Ù¿î·ÎµåµÈ ¼¹ö ¹× °°Àº µµ¸ÞÀο¡ ÀÖ´Â ¼¹ö¿Í Åë½ÅÀÌ °¡´ÉÇÏ´Ù).
Ç÷¡½Ã´Â »ç¿ëÀÚÀÇ ÆÄÀÏ ½Ã½ºÅÛ, Ä«¸Þ¶ó, ¸¶ÀÌÅ©·Î Æù¿¡ Á¢±ÙÀÌ °¡´ÉÇÏ´Ù. Á¢±Ù °¡´É ¿©ºÎ´Â »ç¿ëÀÚ ¼³Á¤¿¡ µû¸¥´Ù. »ç¿ëÀÚÀÇ ÆÄÀÏ ½Ã½ºÅÛ¿¡ Á¢±ÙÀº µ¶¸³ÀûÀÎ SWF ´ÜÀ§·Î Á¦ÇѵȴÙ. ÀϹÝÀûÀ¸·Î ¼³Á¤ Á¤º¸³ª »óÅ Á¤º¸¸¦ ÀúÀåÇÏ´Â ¸ñÀûÀ¸·Î »ç¿ëµÇ¸ç, ±âº» ÀúÀå °ø°£Àº 100KÀÌ´Ù. »ç¿ëÀÚ°¡ Å©±â¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ°í(<ȸé 7> ÂüÁ¶), ÀúÀå¼ÒÀÇ Å©±â¿Í ÄíŰ ÀúÀå ¿©ºÎ¿¡ ´ëÇÑ °ÍÀº ºê¶ó¿ìÀú ¼³Á¤°ú ¹«°üÇÏ´Ù.
 |
| <ȸé 7> Ç÷¡½Ã ¼³Á¤ ÀúÀå °ø°£ |
Ŭ¶óÀÌ¾ðÆ®¿¡ µ¥ÀÌÅ͸¦ ÀúÀåÇÏ´Â ¹æ¹ýÀ¸·Î ¾×¼Ç½ºÅ©¸³Æ®¿¡¼ SharedObject °´Ã¼¸¦ »ç¿ëÇÑ´Ù. ´ÙÀ½Àº SharedObject¸¦ »ç¿ëÇØ Ŭ¶óÀÌ¾ðÆ®¿¡ Ä«¿îÅ͸¦ ÀúÀåÇÏ°í ·ÎµåµÉ ¶§¸¶´Ù Áõ°¡½ÃŰ´Â ¿¹ÀÌ´Ù.
sObject = SharedObject.getLocal("counter"); // Àбâ
if( sObject != null )
{
sObject.data.counter++; // ¿¬»ê
_root.savedata = sObject.data.counter;
sObject.flush(); // ÀúÀå
trace(sObject.data.counter);
}
SWF¿¡¼ ÀúÀåÇÑ ³»¿ëÀº ´ÙÀ½ Æú´õ¿¡ ÀúÀåµÇ´Âµ¥, °¢ SWF¸¶´Ù ±×¸®°í SharedObject¿¡¼ ÀúÀåÇÏ´Â °´Ã¼ À̸§À¸·Î ³»¿ëÀ» ´ãÀº ÆÄÀÏÀÌ »ý¼ºµÈ´Ù.
C:\Documents and Settings\Administrator\Application Data\Macromedia\Flash Player
Ç÷¡½Ã º¸¾ÈÀÇ ÇÙ½ÉÀº SSL°ú µ¿ÀûÀÎ ¼¹ö »çÀÌµå ¿¬°á·Î ¿ä¾àÇÒ ¼ö ÀÖ´Ù. Áï, Åë½Å º¸¾ÈÀ» À§ÇØ °¡´ÉÇÑ SSLÀ» »ç¿ëÇϰí, ¾×¼Ç½ºÅ©¸³Æ®°¡ ¿ÏÀüÈ÷ ³ëÃâµÈ´Ù´Â °¡Á¤ÇÏ¿¡ Áß¿äÇÑ ·ÎÁ÷Àº ¼¹öÃø¿¡ ±¸ÇöÇÏ°í µ¥ÀÌÅ͸¦ ¾ÏÈ£ÈÇÏ´Â º°µµÀÇ ·ÎÁ÷À» Ŭ¶óÀÌ¾ðÆ®¿Í ¼¹ö¿¡ µû·Î ±¸ÇöÇÏ´Â °ÍÀ» ÃßõÇÑ´Ù.
¡®Flash.NET¡¯ÀÇ °¡´É¼º
Áö±Ý±îÁö 3ȸ¿¡ °ÅÃÄ ¼¹öÃø(ASP.NET)°ú Ç÷¡½Ã(SWF) »çÀÌÀÇ ´Ù¾çÇÑ Åë½Å ¹æ¹ý°ú °³¹ß À̽´µé¿¡ ´ëÇØ »ìÆìºÃ´Ù. Ç÷¡½Ã´Â ¸®Ä¡ Ŭ¶óÀ̾ðÆ®ÀÇ °¡´É¼º»Ó¸¸ ¾Æ´Ï¶ó »ç½Ç»óÀÇ Ç÷§Æû µ¶¸³¼ºÀ» °®Ãß°í ÀÖ°í, ³ôÀº »ý»ê¼ºÀ» °¡Áö°í ÀÖ´Â ÈǸ¢ÇÑ Å¬¶óÀÌ¾ðÆ® °³¹ß µµ±¸ÀÌ´Ù. Ç÷¡½Ã¿Í ´å³ÝÀÇ ¸¸³²Àº À¯¿¬ÇÏ°í °í °¡¿ë¼ºÀÇ ½Ã½ºÅÛÀ» ±¸ÃàÇÏ´Â µ¥ ¼Õ»öÀÌ ¾øÀ¸¸ç, ƯÈ÷ XML À¥ ¼ºñ½ºÀÇ È°¿ëÀº »ý»ê¼ºÀ» ³ôÀÌ´Â ¾ÆÁÖ ÁÁÀº ¹æ¹ýÀÌ´Ù.
´Ù¸¸, ±× Ȱ¿ëÀÇ À庮Àº ASP.NET °³¹ßÀÚ´Â Ç÷¡½Ã¸¦ ¸ð¸£°í, Ç÷¡½Ã µðÀÚÀ̳ʴ ASP.NET¿¡ Àͼ÷ÇÏÁö ¾ÊÀº ±â¼ú°£ÀÇ ¹®ÅÎÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, µ¥ÀÌÅÍ¿Í ºñÁî´Ï½º ·ÎÁ÷À» SWF¿¡ µÎÁö ¾Ê´Â °Í¸¸À¸·Îµµ ÈξÀ À¯¿¬ÇÑ °³¹ßÀ» ÇÒ ¼ö ÀÖ´Ù. ºñÁÖ¾ó º£ÀÌÁ÷°ú C++, J2EE¿Í ´å³Ý, È£½ºÆ®¿Í À¯´Ð½º ±×¸®°í À¯´Ð½º¿Í NTó·³ ±â¼ú°ú ±â¼ú »çÀÌÀÇ ´Ù¸®°¡ µÇ´Â ±â¼úÀÌ ÈξÀ Áß¿äÇÒ ¶§°¡ ¸¹´Ù. 1+1ÀÌ 2 ÀÌ»óÀÌ µÉ ¼ö ÀÖµíÀÌ Ç÷¡½Ã(Flash)+´å³Ý(.NET) ¿ª½Ã Flash.NET ±× ÀÌ»óÀÌ µÉ °ÍÀÌ´Ù. @
¿ÃÇØ 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); } } // <summary> // Class1¿¡ ´ëÇÑ ¿ä¾à ¼³¸í // </summary> 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> µ¿±âÈµÈ ¸Þ½îµå |
´ÙÀ½ ±Û¿¡¼´Â ºñµ¿±â ÇÁ·Î±×·¡¹ÖÀ»
À̹ø ±Û¿¡¼´Â ¼¹ö ±¸ÃàÇÏ´Â µ¥ ÀÖ¾î ÇʼöÀÎ ºñµ¿±â ¼ÒÄÏ ÇÁ·Î±×·