µðÀÚÀÎ ÆÐÅÏ(6) - ¿¬¶ôÁÖ¼¼¿ä


À̽ÂÀÏ
E-mail:gaialee@icu.ac.kr
Çѱ¹Á¤º¸Åë½Å´ëÇпø´ëÇб³
Homepage:http://www.icu.ac.kr/


 

Áö³­ È£±îÁö´Â °´Ã¼ »ý¼º¿¡ ´ëÇÑ ÇϳªÀÇ ¹®Á¦¿¡ ´ëÇÏ¿© ´Ù¾çÇÑ °¢µµ¿¡¼­ÀÇ ÇØ°áÃ¥À» Á¦½ÃÇÏ´Â ¿©·¯ °¡Áö ÆÐÅÏ¿¡ ´ëÇؼ­ ¾Ë¾Æº¸¾Ò´Ù. µðÀÚÀÎ ÆÐÅÏÀ» ´Ù·ç°í ÀÖ´Â °Å°³ÀÇ Ã¥µéÀº À̵é ÆÐÅÏÀ» ¹­¾î¼­ Creational patterns[1][2]ÀÇ ¹üÁÖ¿¡ ³Ö´Â´Ù(´º½º·¹ÅÍ 5È£ÀÇ Object Lifecycle Manager ÆÐÅÏÀº ±âÁ¸ÀÇ °´Ã¼ »ý¼º ÆÐÅÏÀ» º¸¿ÏÇÑ´Ù´Â °üÁ¡¿¡¼­ Creational patternsÀÇ ¹üÁÖ¿¡ ³ÖÀ» ¼ö ÀÖ´Ù°í »ý°¢ÇÑ´Ù). 

ÀÌ ¹øÈ£ºÎÅÍ´Â Á»´õ ´Ù¸¥ °¢µµ¿¡¼­ ¹®Á¦¸¦ ã¾Æ ÇØ°áÇÏ°í ÀÖ´Â µðÀÚÀÎ ÆÐÅÏ¿¡ ´ëÇؼ­ À̾߱âÇØ º¸·Á°í ÇÑ´Ù. ¾Æ¸¶ °´Ã¼ »ý¼ºº¸´Ùµµ ´õ Àç¹ÌÀÖ´Â À̾߱Ⱑ µÉ °ÍÀ¸·Î »ý°¢µÈ´Ù.
 
 

1.  »ý¼ºµÈ °´Ã¼µé »çÀÌÀÇ °ü°è

¾î¶² ½Ã½ºÅÛÀ» °´Ã¼ÁöÇâÀûÀ¸·Î µðÀÚÀÎ ÇÑ´Ù´Â °ÍÀº ¹«¾ùÀ» ÀǹÌÇϴ°¡? Grady Booch³ª James Rumbaugh¿Í °°Àº °´Ã¼ÁöÇâ ¹æ¹ý·Ð(methodology)ÀÇ ´ë°¡µéÀÌ ¸¸µé¾î ³õÀº ÀÌ·ÐÀ» µû¸£Áö ¾Ê´õ¶óµµ, Á÷°üÀûÀ¸·Î ¾î´À Á¤µµ´Â ´©±¸³ª ½±°Ô »ý°¢ÇØ º¼ ¼ö ÀÖ´Â ¼ö¼øÀÌ ÀÖ´Ù. ¸ÕÀú, Ç®°íÀÚ ÇÏ´Â ¹®Á¦¸¦ ºÐ¼®ÇÏ°í À̸¦ ¹ÙÅÁÀ¸·Î ÇÊ¿äÇÑ °´Ã¼¸¦ ã¾Æ³½ ÈÄ¿¡ ÀÌµé °´Ã¼ »çÀÌÀÇ °ü°è(association)¸¦ Á¤¸³ÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¶§, °´Ã¼µé »çÀÌÀÇ °ü°è´Â ÇØ´ç ½Ã½ºÅÛÀÇ ÇàÀ§(behavior)¸¦ °áÁ¤Áþ°Ô µÈ´Ù.  °Å²Ù·Î À̾߱â Çؼ­, ¾î¶² ±â´ëµÇ´Â ÇàÀ§¸¦ ÇÏ´Â ½Ã½ºÅÛÀ» ¼³°èÇϱâ À§Çؼ­´Â ºÐ¼® °úÁ¤À» ÅëÇؼ­ ÇÊ¿äÇÏ´Ù°í ÆǴܵǴ °´Ã¼µé »çÀÌ¿¡ ¾î¶² °ü°è°¡ ¼º¸³µÇ¾î¾ß Çϴ°¡¸¦ Á¤È®ÇÏ°Ô ¸í½ÃÇØ ÁÖ¾î¾ß ÇÑ´Ù. ÀÌ °ÍÀÌ À߸øµÇ¸é, ¾û¶×ÇÑ ÇàÀ§¸¦ ÇÏ´Â ½Ã½ºÅÛÀ» ź»ý½Ãų ¼ö ÀÖÀ» °ÍÀÌ´Ù. 

»ç½Ç Áö±Ý±îÁö À̾߱âµÇ¾î ¿Ô´ø Creational patternsÀÇ ¹üÁÖ¿¡ µé¾îÀÖ´Â ÆÐÅϵ鵵 °´Ã¼ »ý¼ºÀ̶ó´Â ÇàÀ§¸¦ Çϱâ À§Çؼ­ ¿©·¯ °³ÀÇ °´Ã¼µéÀÌ ¾î¶² Ưº°ÇÑ °ü°è¸¦ °¡Áö°í ±¸¼ºµÇ¾î ÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù. µðÀÚÀÎ ÆÐÅÏ Áß¿¡´Â (ÇÊÀÚ°¡ ÆÇ´ÜÇϱ⿡) ÇàÀ§ ÀÚüÀÇ Á߿伺À¸·Î ÀÎÇؼ­ Behavioral patterns¶ó´Â ¹üÁÖ¿¡ µé¾îÀÖ´Â °ÍµéÀÌ ÀÖ´Ù. µµ´ëü ¾î¶² ÇàÀ§¸¦ Çϱ淡 ¹üÁÖ ÀÚüÀÇ À̸§ÀÌ ¡®ÇàÀ§¡¯¶ó´Â °Í¿¡ Æ÷ÇÔ½ÃÄÑ ³õ¾ÒÀ»±î¶ó´Â Àǹ®À» Á¦±âÇØ º¼ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. ÀÌ ¹øÈ£ºÎÅÍ´Â Behavioral patterns ¹üÁÖ¿¡ µé¾î ÀÖ´Â µðÀÚÀÎ ÆÐÅϵ鿡 ´ëÇؼ­ À̾߱⸦ ÇØ º¸·Á°í ÇÑ´Ù. ±× ù¹ø°·Î Observer ÆÐÅÏÀ» ¼±ÅÃÇÏ¿© º¸¾Ò´Ù.
 
 

2.  µµ´ëü ¹«¾ùÀ» °üÂûÇÑ´Ù´Â °ÍÀΰ¡?

Observer ÆÐÅÏÀÇ À̸§¿¡¼­ À¯ÃßÇØ º¼ ¼ö ÀÖµíÀÌ ÀÌ ÆÐÅÏÀº ÇϳªÀÇ °´Ã¼°¡ ´Ù¸¥ °´Ã¼¸¦ °üÂûÇÏ´Â °ÍÀÌ´Ù. ±×·³ ¹«¾ùÀ» °üÂûÇÑ´Ù´Â °ÍÀ̸ç, ¿Ö °üÂûÇÏ´Â °ÍÀΰ¡? 

¾î¶² ½Ã½ºÅÛÀ» µðÀÚÀÎÇÏ´Ù º¸¸é, ¾î¶² °´Ã¼ÀÇ ÇàÀ§°¡ ´Ù¸¥ °´Ã¼ÀÇ »óÅ º¯È­¿¡ ÀÇÁ¸ÇÏ´Â °æ¿ì°¡ ¸¹ÀÌ ÀÖ´Ù. ¿¹¸¦ µé¾î¼­, ¿ì¸®°¡ ÀϹÝÀûÀ¸·Î ¸¹ÀÌ »ç¿ëÇÏ°í ÀÖ´Â ³×Æ®¿÷ äÆà ½Ã½ºÅÛÀÇ °æ¿ì¸¦ º¸´õ¶óµµ, äÆà Ŭ¶óÀ̾ðÆ®´Â äÆà ¼­¹ö¿¡ »õ·Î¿î ¸Þ½ÃÁö°¡ µµÂøÇß´ÂÁöÀÇ ¿©ºÎ¸¦ Áö¼ÓÀûÀ¸·Î °üÂûÇÏ°í ÀÖ´Ù°¡, »õ·Î¿î ¸Þ½ÃÁö°¡ µµÂøÇØ ÀÖÀ¸¸é, äÆÃÀ» ÇÏ°í ÀÖ´Â »ç¶÷¿¡°Ô »õ·Î¿î ¸Þ½ÃÁö¸¦ ´©°¡ ŸÀÌÇÎÇß´ÂÁö¸¦ ¾Ë·ÁÁÖ´Â ±â´ÉÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ·± ¿¹¸¦ µéÁö ¾Ê¾Æµµ, °æÇèÀÌ ¸¹Àº ÇÁ·Î±×·¡¸ÓµéÀº ÀÌ·± Á¾·ùÀÇ ÇàÀ§°¡ ¾ó¸¶³ª ÀÚÁÖ ½Ã½ºÅÛ ³»¿¡¼­ ÇÊ¿äÇÑÁö ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. ±×·³ ÀÌ·± ±â´ÉÀ» ¾î¶² ½ÄÀ¸·Î µðÀÚÀÎÇØ¾ß Àß Çß´Ù°í ¼Ò¹®ÀÌ ³¯±î?
 
 
 

3.  ¼¼ °¡Áö ¹æ¹ý 

ÇÑ °´Ã¼°¡ ´Ù¸¥ °´Ã¼ÀÇ »óÅÂÀÇ º¯È­¸¦ °üÂûÇÏ¿© ¾î¶² ±â´ëÇÏ°í ÀÖ´Â º¯È­°¡ ÀϾ¸é ¾î¶² ÇàÀ§¸¦ ÇÏ´Â ÀÌ·± Á¾·ùÀÇ ÇàÀ§´Â µðÀÚÀÎ °üÁ¡¿¡¼­ Å©°Ô ¼¼ °¡ÁöÀÇ ¹æ¹ýÀ» »ý°¢ÇØ º¼ ¼ö ÀÖ´Ù. Polling, µ¿±â½Ä(syncronous) ¹æ¹ý, ºñµ¿±â½Ä(asyncronous) ¹æ¹ýÀÌ ±×°ÍÀÌ´Ù. 

°¢°¢ÀÇ ¹æ¹ýÀÌ ¹«¾ùÀ» ÀǹÌÇÏ´ÂÁö ¾Ë¾Æº¸±â À§Çؼ­ À§¿¡¼­ ¿¹·Î µé¾ú´ø äÆà ½Ã½ºÅÛÀÇ °æ¿ì¸¦ °¡Áö°í À̾߱âÇØ º¸°Ú´Ù. äÆà Ŭ¶óÀ̾ðÆ®´Â äÆü­¹ö¿¡ ÀÚ½ÅÀÌ Âü¿©ÇÏ°í Àִ äÆà ±×·ì ³»ÀÇ ¾î¶² äÆà Ŭ¶óÀ̾ðÆ®·ÎºÎÅÍ »õ·Î¿î ¸Þ½ÃÁö°¡ µµÂøÇß´ÂÁö¸¦ È®ÀÎÇؼ­, µµÂøÇßÀ¸¸é ±× »õ·Î¿î ¸Þ½ÃÁö¸¦ äÆÃÀ» ÇÏ°í ÀÖ´Â »ç¿ëÀÚ¿¡°Ô º¸¿©ÁÖ´Â ÇàÀ§°¡ ±âº»ÀûÀ¸·Î ÇÊ¿äÇÏ´Ù. ÀÌ·± ±â´É¿¡ ´ëÇÑ µðÀÚÀÎÀ¸·Î °¡Àå ½±°Ô »ý°¢ÇØ º¼ ¼ö ÀÖ´Â °ÍÀº äÆà Ŭ¶óÀ̾ðÆ®°¡ ÁÖ±âÀûÀ¸·Î äÆà ¼­¹ö¿¡ Á¢¼ÓÇؼ­ ¼ÓÇØ Àִ äÆà ±×·ì³»ÀÇ ´©±º°¡°¡ »õ·Î¿î ¸Þ½ÃÁö¸¦ ŸÀÌÇÎÇß´ÂÁö¸¦ È®ÀÎÇØ º¸´Â °ÍÀÌ´Ù. ÀÌ·± ¹æ¹ýÀ» pollingÀ̶ó°í ºÎ¸¥´Ù. °æ¿ì¿¡ µû¶ó¼­, pollingÀ» »ç¿ëÇؼ­ ½Ã½ºÅÛÀ» µðÀÚÀÎ ÇØ¾ß ÇÒ °æ¿ì°¡ ÀÖÁö¸¸, °æÇèÀûÀ¸·Î´Â ±×¸® ÁÁÀº ¹æ¹ýÀº ¾Æ´Ï´Ù. ÀÌ ¿¹ÀÇ °æ¿ì¸¦ º¸´õ¶óµµ, äÆà Ŭ¶óÀ̾ðÆ®´Â äÆà ¼­¹ö¿¡ »õ·Î¿î ¸Þ½ÃÁö°¡ µé¾î¿Í ÀÖ´ø ±×·¸Áö ¾Ê´ø °£¿¡ ÁÖ±âÀûÀ¸·Î ¼­¹ö¸¦ Á¡°ËÇÏ´Â ÇàÀ§¸¦ Çϴµ¥ °á°úÀûÀ¸·Î´Â ºÒÇÊ¿äÇÑ ³×Æ®¿÷ Æ®·¡ÇÈÀ» À¯¹ß½ÃÅ°¸ç ½Ã½ºÅÛÀÇ ÀÚ¿øÀ» ³²¿ëÇÏ´Â ¹®Á¦¸¦ ¾ß±â½Ãų ¼ö ÀÖ´Ù. 

¼­¹ö¿¡ »õ·Î¿î ¸Þ½ÃÁö°¡ µµÂøÇß´ÂÁöÀÇ ¿©ºÎ¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Â polling¿ÜÀÇ ¶Ç ´Ù¸¥ ¹æ¹ýÀ¸·Î´Â  »õ·Î¿î µµÂø ¸Þ½ÃÁö Á¦°øÀ» ¸ñÀûÀ¸·Î ¼­¹ö¿¡¼­ Á¦°øÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ Ŭ¶óÀ̾ðÆ®¿¡¼­ µ¿±âÀûÀ¸·Î È£ÃâÇÏ´Â °ÍÀÌ´Ù. ÀÌ °æ¿ì¿¡´Â ÀÌ ÀÎÅÍÆäÀ̽º¸¦ È£ÃâÇÑ Å¬¶óÀ̾ðÆ®´Â ¼­¹ö¿¡ »õ·Î¿î ¸Þ½ÃÁö°¡ µµÂøÇؼ­ ±× ¸Þ½ÃÁö¸¦ ¸®ÅÏÇØ ÁÖ±â Àü±îÁö´Â °è¼Ó ÇØ´ç ÀÎÅÍÆäÀ̽ºÀÇ È£Ãâ¿¡ ¹­¿© ÀÖ°Ô µÈ´Ù. Áï, Ŭ¶óÀ̾ðÆ®´Â ¼­¹ö¿¡ »õ·Î¿î ¸Þ½ÃÁö°¡ µµÂøÇؼ­ È£ÃâÇÑ ÀÎÅÍÆäÀ̽º°¡ ¸®ÅϵDZâ Àü±îÁö´Â ´Ù¸¥ ÀÏÀ» ÇÒ ¼ö ¾ø´Â »óÅ¿¡ ºüÁ® ÀÖ°Ô µÈ´Ù. µû¶ó¼­, ÀÌ ¹æ¹ýµµ ±×¸® È¿°úÀûÀÎ ¹æ¹ýÀº ¾Æ´Ï´Ù. 

´Ù¸¥ ¹æ¹ýÀ¸·Î´Â Ŭ¶óÀ̾ðÆ®°¡ ¼­¹ö¿¡ Á¢¼ÓÇÑ ÈÄ¿¡ °°Àº äÆà ±×·ì¿¡ ¼ÓÇØ ÀÖ´Â »ç¶÷ÀÌ ¸Þ½ÃÁö¸¦ ¼­¹ö¿¡ º¸³»¸é, ³ª¿¡°Ôµµ ±× ¸Þ½ÃÁö¸¦ º¸³»´Þ¶ó°í ¿äûÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù. ÀÌ ¹æ¹ýÀº ¼­¹ö¿¡¼­ ÀÌ·± ¸ñÀûÀ¸·Î Á¦°øÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ ºñµ¿±âÀûÀ¸·Î È£ÃâÇÔÀ¸·Î½á ÀÌ·ç¾îÁö¸ç, ÀÌ ¹æ¹ýÀº callback À̶ó°í ºÒ¸®¿öÁö°í ÀÖ´Ù. ±× ÀÌÀ¯´Â ³»°¡ callÀ» Çߴµ¥, Áö±Ý ´çÀåÀº ¸Þ½ÃÁö°¡ ¾øÀ¸´Ï, ³ªÁß¿¡ ¸Þ½ÃÁö°¡ µµÂøÇϸé, ³ª¿¡°Ô ¾Ë·Á´Þ¶ó°í ³ªÀÇ ¿¬¶ôó¸¦ ³²±â´Â °úÁ¤À̶ó°í Çؼ­ callbackÀ̶ó°í À̸§À» ºÙ¿´´Ù°í ÇÑ´Ù. callbackÀº ¸¹ÀÌ »ç¿ëµÇ°í ÀÖ´Â ¹æ¹ýÀ¸·Î ÇÁ·Î±×·¡¹Ö¾ð¾î¸¦ ¼³¸íÇÏ´Â °Å°³ÀÇ Ã¥µéÀº º°µµÀÇ ¼½¼ÇÀ» ¸¶·ÃÇؼ­ ÇØ´ç ÇÁ·Î±×·¡¹Ö¾ð¾î·Î callbackÀ» ¾î¶»°Ô ±¸ÇöÇÒ ¼ö ÀÖ´ÂÁö  ¼³¸íÇÏ°í ÀÖ´Â Á¤µµÀÌ´Ù. ÆÐÅÏ ÀúÀÚµéÀÌ ÀÌ·± callbackÀ» °¡¸¸È÷ ³õ¾ÆµÎ¾úÀ»¸®°¡ ¾ø´Ù. µðÀÚÀÎ ÆÐÅÏ¿¡¼­´Â callbackÀ» Observer ÆÐÅÏÀ̶ó°í À̸§ ºÙ¿©¼­ Á¤¸®ÇØ ³õ¾Ò´Ù. 

µÎ ¹ø° ¹æ¹ýÀº ´Ü¼øÈ÷ ¼­¹ö¿¡¼­ Á¦°øÇÏ´Â ÀÎÅÍÆäÀ̽º¸¦ µ¿±âÀûÀ¸·Î È£ÃâÇÏ´Â °ÍÀ̹ǷΠƯº°È÷ À̾߱âÇÒ °ÍÀº ¾ø´Ù. ´ÙÀ½ Àý¿¡¼­´Â callbackÀ» ÆÐÅÏÀ¸·Î Á¤¸®ÇÑ observer ÆÐÅÏÀ» polling°ú ºñ±³ÇÏ¿© À̾߱âÇϱ⠺¸°Ú´Ù.
 

4.  Polling 

Âü°í¹®Çå [3]¿¡´Â pollingÀÌ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.
 

"Polling" describes a situation in which a client repeatedly, usually in a loop, invokes a method on another object to see if anything has changed.
¾î¶² Ŭ¶óÀ̾ðÆ®°¡ (º¸ÅëÀº ·çÇÁ¸¦ ÀÌ¿ëÇؼ­) Áö¼ÓÀûÀ¸·Î ´Ù¸¥ °´Ã¼ÀÇ »óÅ º¯È­¸¦ ¾Ë¾Æº¸·Á´Â ¸ñÀû¿¡¼­ ±× °´Ã¼°¡ Á¦°øÇÏ´Â ¸Þ¼Òµå¸¦ Áö¼ÓÀûÀ¸·Î È£ÃâÇÏ´Â °ÍÀ» pollingÀ̶ó ÇÑ´Ù. 


À§¿¡¼­ ¿¹·Î µé¾ú´ø äÆà ½Ã½ºÅÛÀ» °¡Áö°í polling¿¡ ´ëÇؼ­ Á»´õ ±¸Ã¼ÀûÀ¸·Î ¾Ë¾Æº¸ÀÚ. äÆà Ŭ¶óÀ̾ðÆ®´Â ¸Þ¼¼Áö¸¦ ¼­¹ö¿¡ º¸³»°í ¹ÞÀ» ¼ö ÀÖ¾î¾ß ÇÏÁö¸¸, À̾߱⸦ ´Ü¼øÈ­ ½ÃÅ°±â À§Çؼ­ º» ±ÛÀÇ ¸ñÀû»ó ¸Þ¼¼Áö¸¦ ¼­¹ö¿¡¼­ ¹Þ´Â ±â´É¿¡ ´ëÇؼ­¸¸ À̾߱âÇÏ·Á ÇÑ´Ù. ´ÙÀ½Àº pollingÀ» ÀÌ¿ëÇؼ­ äÆà ½Ã½ºÅÛÀ» ±¸ÇöÇÑ °£´ÜÇÑ ÀÚ¹Ù ¼Ò½ºÀÌ´Ù.
 

public class Message {
   ...
}

public class ChatServer {
   ...
   private boolean newMsg = false;
   private Message msg;
   ...
   public boolean isNewMsg() {
      return newMsg;
   }
   ...
   public Message getMsg() {
      return msg;
   }
}

public class ChatClientGet implements Runnable {
   ...
   private Message msg_;
   private ChatServer chatServer_;
   ...
   public ChatClientGet(ChatServer cs) {
     chatServer_ = cs;
   }
   ...
   public void run() {
      while(true) {
      boolean isNewMsg = chatServer_.isNewMsg();
      if(isNewMsg) {
         msg_ = chatServer_.getMsg();
         // do something..
      }
   }
}


½Ç·ÂÀÖ´Â ÇÁ·Î±×·¡¸Ó¶ó¸é À§ÀÇ ¼Ò½º°¡ ¸¹Àº ¹®Á¦¸¦ °¡Áö°í ÀÖ´Ù´Â °ÍÀ» ±Ý¹æ ¾Ë¾ÆÂ÷·ÈÀ» °ÍÀÌ´Ù. ¿ì¼± ¸¹Àº ¹®Á¦Á¡À» µÚ·Î ÇÑä polling¿¡¸¸ ÃÊÁ¡À» ¸ÂÃ߾ À§ÀÇ ¼Ò½º¸¦ º¸ÀÚ. 

À§ÀÇ ¼Ò½º¸¦ º¸¸é äÆü­¹ö ChatServer´Â isNewMsg()¶ó´Â ÀÎÅÍÆäÀ̽º¸¦ µÎ¾î¼­ äÆà ¼­¹ö¿¡°Ô »õ·Î¿î ¸Þ¼¼Áö°¡ ¼­¹ö¿¡ µµÂøµÇ¾î ÀÖ´ÂÁö¿¡ ´ëÇÑ Á¤º¸¸¦ Á¦°øÇÏ°í ÀÖ°í, getMsg()¶ó´Â ÀÎÅÍÆäÀ̽º¸¦ ÅëÇؼ­´Â ¼­¹ö¿¡ ÀÖ´Â ¸Þ¼¼Áö¸¦ Ŭ¶óÀ̾ðÆ®¿¡°Ô Àü´ÞÇÏ°í ÀÖ´Ù. äÆà Ŭ¶óÀ̾ðÆ® ChatClientGetÀº ¼­¹ö¿¡¼­ Á¦°øÇÏ°í ÀÖ´Â µÎ °³ÀÇ ÀÎÅÍÆäÀ̽º¸¦ ÅëÇؼ­ »õ·Î¿î ¸Þ¼¼Áö°¡ ¼­¹ö¿¡ µµÂøµÇ¾î ÀÖ´ÂÁö¸¦ È®ÀÎÇÑ ÈÄ¿¡, »õ·Î¿î ¸Þ¼¼Áö°¡ ÀÖÀ¸¸é ±× ÇØ´ç ¸Þ¼¼Áö¸¦ ¹Þ¾Æ¿Â´Ù. ¼Ò½º¸¦ ÀüüÀûÀ¸·Î ´Ù½Ã º¸¸é, polling ¹æ¹ýÀ» ÀÌ¿ëÇßÀ» °æ¿ì¿¡ »õ·Î¿î ¸Þ¼¼Áö°¡ ¼­¹ö¿¡ µµÂøµÈ ÈÄ¿¡ ¸ðµç ÇàÀ§ÀÇ Ã¥ÀÓÀÌ Å¬¶óÀ̾ðÆ®¿¡ ÁýÁߵǾî ÀÖ´Ù. ¼­¹ö´Â ´ÜÁö »õ·Î¿î ¸Þ¼¼Áö°¡ µµÂøµÇ¾î ÀÖ´Ù´Â »óÅ Á¤º¸¿Í ÇØ´ç ¸Þ¼¼Áö¸¦ Ŭ¶óÀ̾ðÆ®°¡ ¹Þ¾Æ°¥¶§±îÁö ÀúÀåÇÏ´Â ±â´É¸¸À» °¡Áö°í ÀÖ°í, »õ·Î¿î ¸Þ¼¼Áö°¡ µµÂøµÇ¾î ÀÖ´Ù´Â Á¤º¸¸¦ Ŭ¶óÀ̾ðÆ®¿¡ Àü´ÞÇÏ´Â ±â´É°ú ÇØ´ç ¸Þ½ÃÁö¸¦ Ŭ¶óÀ̾ðÆ®¿¡ Àü´ÞÇÏ´Â ±â´ÉÀÌ ¸ðµÎ Ŭ¶óÀ̾ðÆ®ÀÇ Ã¥ÀÓÀ¸·Î µÇ¾î ÀÖ´Ù. Áï, polling ¹æ¹ýÀ» »ç¿ëÇÑ´Ù´Â °ÍÀº ´Ù¸¥ °´Ã¼ÀÇ »óÅ¿¡ ÀÇÁ¸ÇÏ°í ÀÖ´Â ¾î¶² °´Ã¼ÀÇ ºÎ´ãÀ» Å©°Ô ÇÏ´Â ¹æ¹ýÀÌ´Ù. ÀÌ·± ÀÌÀ¯·Î Çؼ­, polling ¹æ¹ýÀ» ÀÌ¿ëÇؼ­ ¾î´À Á¤µµ ¿øÈ°ÇÏ°Ô µ¹¾Æ°¡´Â äÆà ½Ã½ºÅÛÀ» µðÀÚÀÎÇϱâÀ§Çؼ­´Â °í·ÁÇØÁÖ¾î¾ß ÇÒ °ÍÀÌ ¾ÆÁÖ ¸¹¾ÆÁö°í ½Ã½ºÅÛÀº ±×¸¸Å­ º¹ÀâÇØ Áø´Ù. ¿¹¸¦ µé¾î, polling¹æ¹ýÀ» ÀÌ¿ëÇÏ¿© ±¸ÇöµÇ¾î ÀÖ´Â À§ÀÇ ¼Ò½º°¡ ¾î´À Àß(?) µ¹¾Æ°¡°Ô ¸¸µé·Á¸é Àû¾îµµ ´ÙÀ½°ú °°Àº °ÍµéÀÌ °í·ÁµÇ¾î¾ß ÇÒ °ÍÀÌ´Ù. 
 

  • Ŭ¶óÀ̾ðÆ®ÀÇ polling ÇàÀ§ »çÀÌ¿¡ ¿©·¯ °³ÀÇ ¸Þ¼¼Áö°¡ µµÂøÇÒ ¼ö ÀÖ´Ù´Â °Í.
  • ¼¼¸í ÀÌ»óÀÇ »ç¶÷ÀÌ Ã¤ÆÃÀ» ÇÒ °æ¿ì¿¡ °¢ ¸Þ¼¼Áö°¡ ÇØ´ç ±×·ìÀÇ ¸ðµç »ç¶÷¿¡°Ô Àü´ÞµÇ¾ú´ÂÁö¿¡ ´ëÇÑ Á¤º¸ °ü¸®°¡ ¼­¹öÃø¿¡ ÇÊ¿äÇÏ´Ù´Â °Í. 
  • Ŭ¶óÀ̾ðÆ® Ãø¿¡¼­´Â ¹Ù·Î Àü¿¡ ¾î¶² ¸Þ¼¼Áö±îÁö ¹Þ¾Ò´ÂÁö¿¡ ´ëÇÑ Á¤º¸ °ü¸®
  • µîµî... 


¾î¶²°¡? pollingÀ» ÀÌ¿ëÇؼ­ µðÀÚÀÎµÈ Ã¤Æà ½Ã½ºÅÛÀ» ±¸ÇöÇÒ ¼ö´Â ÀÖÁö¸¸, °á°úÀûÀ¸·Î ±«¹°(?)°ú °°Àº ½Ã½ºÅÛÀÌ Åº»ýÇÒ °ÍÀÌ ºÐ¸íÇÏ´Ù. ´ÙÀ½¿¡´Â äÆà ½Ã½ºÅÛÀ» Á» ´õ ´Ü¼øÇÏ°Ô µðÀÚÀÎ ÇÒ ¼ö ÀÖ°Ô ÇØ ÁÖ´Â Observer ÆÐÅÏ¿¡ ´ëÇؼ­ ¾Ë¾Æº¸°Ú´Ù. ¾Õ¿¡¼­µµ À̾߱â ÇßµíÀÌ Observer ÆÐÅÏÀº callback ¹æ¹ýÀ» ÆÐÅÏÈ­ ½ÃŲ °ÍÀÌ´Ù.
 
 

5.  Observer ÆÐÅÏ

¸ÕÀú ObserverÆÐÅÏÀÌ ¾î¶»°Ô »ý°å´ÂÁö º¸ÀÚ. ±×¸² 1Àº Grand[2]°¡ GoF Ã¥ÀÇ Observer ÆÐÅÏÀ» Á¶±Ý ¼öÁ¤ÇÑ °ÍÀÌ´Ù. °³ÀÎÀûÀ¸·Î´Â GoFÃ¥¿¡ ÀÖ´Â °Íº¸´Ù ´õ Àǹ̰¡ ºÐ¸íÇÑ °Í °°¾Æ¼­ GrandÀÇ °ÍÀ» Observer ÆÐÅÏÀ¸·Î ¿©±â¿¡ ¼Ò°³ÇÑ´Ù. ±×¸² 1À» º¸¸é Áö±Ý±îÁö ºÁ¿Ô´ø ´Ù¸¥ ¿©´ÀÀÇ ÆÐÅϵéó·³ ±× ±¸Á¶°¡ º¹ÀâÇÏÁö ¾Ê´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.


 


±×¸² 1. Observer ÆÐÅÏ

ÀÌ ÆÐÅÏÀÇ ÁÖ¿ä °´Ã¼´Â Observer¿Í ObservableÀÌ´Ù. Áö³­ È£µé¿¡¼­ ´©´©È÷ À̾߱âÇØ ¿ÔµíÀÌ ÀÌ µÎ °´Ã¼´Â ¼­·ÎÀÇ ÀÇÁ¸¼ºÀ» ÁÙÀ̱â À§Çؼ­, ObserverIF¿Í ObservalbleIF¶ó´Â À̸§ÀÇ  interfaceµéÀ» »çÀÌ¿¡ µÎ¾î ¼­·ÎÀÇ °ü°è¸¦ ¸Î°í ÀÖ´Ù. Observer °´Ã¼°¡ Observable °´Ã¼¿¡°Ô Á¦°øÇÏ°í ÀÖ´Â ÀÎÅÍÆäÀ̽º·Î notify()°¡ ÀÖ°í, Observable°´Ã¼°¡ Observer °´Ã¼¿¡°Ô Á¦°øÇÏ°í ÀÖ´Â ÀÎÅÍÆäÀ̽º·Î´Â addObserver()¿Í removeObserver()°¡ ÀÖ´Ù.  Observer°¡ ObservableÀÌ Á¦°øÇÏ°í ÀÖ´Â addObserver() ÀÎÅÍÆäÀ̽º¸¦ ÅëÇؼ­ ÀÚ½ÅÀÌ °üÂûÇÏ°íÀÚ ÇÏ´Â °´Ã¼¿¡ »óź¯È­½Ã¿¡ ¾Ë·Á´Þ¶ó´Â ¿äû(call)À» ÇÑ´Ù. ±×·¯¸é, Observable °´Ã¼´Â ÀÚ½ÅÀÇ »óÅ º¯È­°¡ »ý±æ¶§, Observer°¡ Á¦°øÇÑ notify() ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇؼ­ ¿äûÇÑ Observer¿¡°Ô ±× »ç½ÇÀ» ¾Ë·ÁÁÖ´Â °ÍÀÌ´Ù(callback). Áï, callbackÀ» Ç¥ÇöÇÏ´Â µðÀÚÀÎ ÆÐÅÏÀÌ´Ù. ±×·¯³ª, ±×¸² 1¿¡ º¸¸é ObserverÀÇ µî·Ï°ú notificationÀÇ ÀÏÀº Observable °´Ã¼°¡ ÇÏ°í ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó, Observable °´Ã¼´Â ÀÌ ÀÏÀ» Muticaster¶ó´Â °´Ã¼¿¡ À§ÀÓ(delegation)ÇÏ°í ÀÖ´Ù. »ç½Ç Observable °´Ã¼°¡ ÇÒ ÀÏÀ» ´Ù¸¥ °´Ã¼¿¡ ±¸Áö À§ÀÓÇÒ Çʿ伺Àº ¾øÁö¸¸, ÀÌ·¸°Ô ÇÔÀ¸·Î½á ¾òÀ» ¼ö ÀÖ´Â ÀåÁ¡ÀÌ ÀÖ´Ù. ±× ÀåÁ¡Àº ObservableIF¸¦ ±¸ÇöÇÏ°í ÀÖ´Â ¸ðµç Observable°´Ã¼µéÀÌ ±× Äڵ带 Àç»ç¿ëÇÒ ¼ö Àִٴµ¥ ÀÖ´Ù. Observable °´Ã¼¿¡ µî·ÏÇÑ Observer°´Ã¼°¡ µÑ ÀÌ»óÀÎ °æ¿ì¿¡ À̵é Observer°´Ã¼µé¿¡°Ô Observable°´Ã¼°¡ ¸Þ½ÃÁö¸¦ º¸³»´Â ÇüÅ´ multicasting ÇüÅÂÀ̹ǷΠObservable °´Ã¼ÀÇ ÇÒ ÀÏÀ» À§ÀÓ¹ÞÀº °´Ã¼ÀÇ À̸§À» Multicater¶ó°í ÁöÀº °ÍÀÌ°í, ÀÌ·± ÀÌÀ¯·Î ObserverÆÐÅÏÀº multicast callbackÀ» ÆÐÅÏÈ­ ÇÑ °ÍÀ̶ó°í À̾߱âµÇ¾î Áø´Ù.

±×·³ ÀÌ ÆÐÅÏÀ» ÀÌ¿ëÇϸé À§¿¡¼­ ¿¹·Î µé¾î ¼³¸íÇØ ¿Ô´ø äÆà ½Ã½ºÅÛÀÌ ¾î¶»°Ô µðÀÚÀÎµÇ°í ±¸ÇöµÉ ¼ö ÀÖ´ÂÁö À̾߱âÇØ º¸°Ú´Ù. ¿ì¼± Observer ÆÐÅÏÀ» Àû¿ëÇÑ´Ù¸é °£´ÜÇÑ Ã¤ÆýýºÅÛÀ» ±×¸² 2¿Í °°Àº  Ŭ·¡½º ´ÙÀ̾î±×·¥À¸·Î Ç¥ÇöÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
 


 


±×¸² 2. multicast callbackÀ» Àû¿ëÇÑ Ã¤ÆýýºÅÛÀÇ Å¬·¡½º ´ÙÀ̾î±×·¥



±×¸² 2ÀÇ Observer ÆÐÅÏÀ» »ç¿ëÇÑ µðÀÚÀÎÀ» º¸¸é pollingÀ» ½Ã½ºÅÛ µðÀÚÀο¡ Àû¿ëÇßÀ» °æ¿ì¿Í ºñ±³Çؼ­ ±× Â÷ÀÌ°¡ ¸¹ÀÌ ³ªÅ¸³ª°í ÀÖ´Ù. pollingÀ» Àû¿ëÇßÀ» ¶§¿Í´Â ´Þ¸® callbackÀ» Àû¿ëÇÑ °æ¿ì¿¡´Â Ŭ¶óÀ̾ðÆ®´Â ¸Þ¼¼Áö ¼ö¿ë¿¡ À־ ¼öµ¿ÀûÀÌ µÈ´Ù. Áï, ¼­¹ö¿¡ ÀÚ½ÅÀ» µî·Ï½ÃÄѳõÀº ÀÌÈÄ¿¡´Â ¼­¹ö¿¡¼­ »õ·Î¿î ¸Þ¼¼Áö¸¦ Àü´ÞÇØÁÙ ¶§, ±× ÇØ´ç ¸Þ¼¼Áö¸¦ Àü´Þ¹ÞÀ»»Ó, ¼­¹ö¿¡ »õ·Î¿î ¸Þ¼¼Áö°¡ µµÂøµÇ¾î ÀÖ³ª È®ÀÎÇÏ´Â ÀÏ·ÃÀÇ ÀÛ¾÷À» ÇÏÁö ¾Ê°í ÀÖ´Ù. µû¶ó¼­, Ŭ¶óÀ̾ðÆ®´Â ¼­¹ö·ÎºÎÅÍÀÇ »õ·Î¿î ¸Þ¼¼Áö µµÂø¿©ºÎ¿¡ »ó°ü¾øÀÌ ´Ù¸¥ ÀÏÀ» ÇÏ°í ÀÖ´Ù°¡ ¼­¹ö·ÎºÎÅÍ »õ·Î¿î ¸Þ¼¼Áö°¡ µµÂøÇß´Ù´Â ¸Þ¼¼Áö  notity(Message)¸¦ ¹ÞÀ¸¸é ÀÌ¿¡ »óÀÀÇÏ´Â ÀÏÀ»ÇÏ¸é µÈ´Ù. °á°úÀûÀ¸·Î Observer ÆÐÅÏÀ¸·Î µðÀÚÀÎµÈ ½Ã½ºÅÛÀº ¸Þ½ÃÁö Àü´Þ¿¡ ´ëÇÑ Ã¥ÀÓÀÌ Å¬¶óÀ̾ðÆ®·ÎºÎÅÍ ¼­¹öÂÊÀ¸·Î ³Ñ¾î°¬À¸¸ç, pollingÀÇ °æ¿ì¿¡ ¹®Á¦°¡ µÇ¾ú´ø ¼­¹ö·ÎºÎÅÍ ¹ÞÀº ¸Þ¼¼Áö ¸®½ºÆ® Á¤º¸¸¦ ÀÏÀÏÀÌ ÀúÀåÇÏ¿© ºñ±³ÇÏ´Â ºÒÇÕ¸®ÇÑ Á¡µéÀÌ ¸ðµÎ »ç¶óÁö°Ô µÈ´Ù. °á°úÀûÀ¸·Î Observer ÆÐÅÏÀ» »ç¿ëÇÏ¸é ´Ù¸¥ °´Ã¼ÀÇ »óÅ¿¡ ´ëÇÑ ÀÇÁ¸¼ºÀ» °¡Áö´Â °´Ã¼µéÀÇ ÇàÀ§¸¦ °£´ÜÇÏ°Ô µðÀÚÀÎÇÏ°í ±¸ÇöÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. 

±×¸² 2ó·³ µðÀÚÀÎµÈ Ã¤ÆýýºÅÛÀÇ °£´ÜÇÑ ±¸Çö ¼Ò½º´Â ´ÙÀ½°ú °°ÀÌ µÉ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
 

pubic interface ChatObserver {
   pubic void notify(Message msg);
}
 

public class ChatClientGet implements ChatObserver {
   ...
   private Message msg_;
   ...
   public void notify(Message msg) {
      msg_ = msg;
   }
   ...
}
 

public interface ChatObservable {
   public void addObserver(ChatObserver co);
   public void removeObserver(CharObserver co);
}
 

public class ChatServer implements ChatObservable 
   extends Thread {
   ...
   private Multicaster mCaster_;
   ...
   public ChatServer() {
      ...
      mCaster_ = new Multicaster();
      ...
   }

   public void addObserver(ChatObserver co) {
      mCaster_.addObserver(co);
   }

   public void removeObserver(ChatObserver co) {
      mCaster_.removeObserver(co);
   }
   ...
   public void run() {
      while(true) { 
         // ¸Þ¼¼Áö µµÂø ¿©ºÎ¸¦ ¸ð´ÏÅ͸µÇÑ´Ù.
         // »õ·Î¿î ¸Þ¼¼Áö°¡ µµÂøÇϸé notify() ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù.
         mCaster_.notify(msg);
      }
   }
}
 

public class Multicaster {
   ...
   private ArraySet observers_ = new ArraySet();
   ...
   public void addObserver(ChatObserver co) {
      observers_.add(co);
   }

   public void removeObserver(ChatObserver co) {
      observers_.remove(co);
   }
   ...
   public void notify(Message msg) {
      Iterator it = new observers_.iterator();
      while(it.hasNext()) {
         ((ChatObserver)it.next()).notify(msg);
      }
   }
   ... 
}
 

ÀÌ ÆÐÅÏÀÇ ÀúÀÚµéÀÎ GoF µéÀÌ ÀÌ ÆÐÅÏ¿¡ ´ëÇؼ­ ¹àÈ÷°í ÀÖ´Â Àǵµ(intent)·Î Observer ÆÐÅÏ¿¡ ´ëÇÑ À̾߱⸦ ÁÙÀÌ°Ú´Ù.
 

Àǵµ(intent)
 

    Define a one-to-many dependency between objects so that when one object changes states, all its dependents are notified and updated automatically.

    °´Ã¼µé »çÀÌ¿¡ ÀÏ´ë´Ù ÀÇÁ¸¼ºÀ» ºÎ¿©ÇÒ ¶§ »ç¿ëµÉ ¼ö ÀÖ´Â ÆÐÅÏÀ¸·Î½á ÇϳªÀÇ °´Ã¼ »óÅ°¡ ¹Ù²î¸é ±× °´Ã¼¿¡ ÀÇÁ¸ÇÏ°í ÀÖ´Â ¸ðµç °´Ã¼°¡ ±× »ç½ÇÀ» Å뺸¹Þ°í ±×¿¡ ÇØ´çÇÏ´Â ÇàÀ§¸¦ ÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.
     
     

6.  °ü·Ã ÆÐÅÏ

ÀÌ ÆÐÅÏÀÇ ÀúÀÚµéÀÌ Observer ÆÐÅÏ°ú °ü·ÃÀÌ ÀÖ´Ù°í À̾߱âÇÑ ÆÐÅÏÀ¸·Î Mediator [1]ÆÐÅÏÀÌ ÀÖ´Ù. ±¸Ã¼ÀûÀ¸·Î Mediator ÆÐÅÏÀÌ Observer ÆÐÅÏ°ú ¹«¾ùÀÌ ºñ½ÁÇϸç Â÷ÀÌÁ¡Àº ¹«¾ùÀÎÁö ¾Ë¾Æº¸´Â °Íµµ Àç¹ÌÀÖÀ» °Í °°´Ù. Ưº°È÷ Èï¹Ì·Î¿î °ÍÀÌ ¹ß°ßµÇÁö ¾ÊÀ¸¸é ´ÙÀ½¿¡´Â Mediator ÆÐÅÏ¿¡ ´ëÇؼ­ À̾߱⸦ ÇØ º¼±î ÇÑ´Ù.
 
 

7.  ¸ÎÀ½¸»
 

ÀÌ ¹øÈ£¿¡ ¼Ò°³ÇÑ ObserverÆÐÅÏÀº multicast callbackÀ» ÆÐÅÏÈ­ ÇÑ °ÍÀ¸·Î °æÇèÀÌ ¾î´À Á¤µµ ÀÖ´Â ½Ã½ºÅÛ µðÀÚÀÌ³Ê¿Í ÇÁ·Î±×·¡¸ÓµéÀº ÀÍÈ÷ Àß ¾Ë°í ÀÖ´Â ³»¿ëÀ̾úÀ» °ÍÀ¸·Î »ý°¢µÈ´Ù. ¹Ù²Ù¾î À̾߱âÇϸé, Observer ÆÐÅÏÀº ¾î¶² ½Ã½ºÅÛÀ» µðÀÚÀÎ ÇÒ ¶§ ¾ÆÁÖ À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼öÀÖ´Â ÆÐÅÏ Áß¿¡ ÇϳªÀÌ´Ù. ¹¹, »ç½Ç º° ¾î·Á¿î ³»¿ëÀÌ ¾Æ´ÏÁö¸¸, ÀÌ·± ÀÛÀº °ÍµéÀÌ ¸ð¿©¼­ Àüü ÄÄÇ»ÅÍ ½Ã½ºÅÛÀ» °ß°íÇÏ°í ½Ç¿ëÀûÀÌ°í È®Àå¿¡ Æí¸®ÇÏ°í ¾Æ¸§´ä°Ô(?) ¸¸µå´Â °ÍÀÌ ¾Æ´Ò±î »ý°¢ÇØ º»´Ù. 

¾ó¸¶Àü¿¡ ¾î´À µ¶ÀÚ°¡ ÀÚ½ÅÀÌ °ü½ÉÀ» µÎ°í ÀÖ´Â XML ºÐ¾ß¿¡ ÀÚÁÖ ³ªÅ¸³ª´Â ³»¿ëÀ» ÆÐÅÏÀ¸·Î Á¤¸®ÇÏ°í ½ÍÀºµ¥, ¾î¶»°Ô ÇϸéµÇ´À³Ä°í ÇÊÀÚ¿¡°Ô Áú¹®À» ÇÑ ÀûÀÌ ÀÖ´Ù. ±× ºÐ¿¡°Ô ´äÇϱ⸦ Gerard Meszaros °ú  Jim DobleÀÇ "A Pattern Language for Pattern Writing"À» Àо´Â °ÍÀÌ ÁÁÀ» °Í °°´Ù°í Çߴµ¥, Áö±Ý ÀÌ ±ÛÀ» ÁغñÇϸ鼭 »ý°¢Çغ¸´Ï, ¹Ù·Î Observer ÆÐÅÏÀ» Àо´Â °ÍÀÌ ´õ ÁÁÀº °Í °°´Ù´Â »ý°¢ÀÌ µç´Ù. ¿Ö³ÄÇϸé, ÀϹÝÀûÀ¸·Î ¸¹ÀÌ »ç¿ëµÇ°í ÀÖ´Â callbackÀ» ÆÐÅÏÈ­ ½ÃŲ°ÍÀ̹ǷΠÆÐÅÏ ±Û¾²±â¸¦ ÀÌÇØÇϴµ¥ ´õ ½±°Ô Á¢±ÙÇÒ ¼ö ÀÖÀ» °Å¶õ »ý°¢¿¡¼­ÀÌ´Ù. 
 
 

Âü°í ¹®Çå

[1] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides,     
      Design Patterns, Elements of Resuable Object-Oriented 
      Software,  Addison-Wesley, 1995 

[2] Mark Grand, Patterns in Java, volume 1, Wiley, 1998 

[3] Nigel Warren, Philip Bishop, Java in Practice, Design Styles and 
     Idioms for Effective Java, Addison-Wesley, 1999
 
 

(±Û Èıâ )

PLoP 2000 ÄÁÆÛ·±½º¿¡ Á¦ÃâÇß´ø Á¦ ³í¹®À» °ø°³ÇÑ´Ù Çϸ鼭µµ °è¼Ó ´ÊÀåÀ» ºÎ·È´Âµ¥.. ¿ì¼± Á˼ÛÇÏ´Ù´Â ¸»¾¸À» µå¸³´Ï´Ù. »ç½Ç ¾ÆÁ÷ ÇѱÛÈ­ ÀÛ¾÷Àº ÇÏÁö ¸øÇß½À´Ï´Ù. ÀÌ ±ÛÀ» ¾²±â ¹Ù·Î Àü³¯±îÁöµµ Á¦ ³í¹®¿¡ ´ëÇÑ ¼öÁ¤ÀÌ ÀÖ¾ú±â ¶§¹®ÀÔ´Ï´Ù. ±× ÀÌÀ¯´Â ±â»Ú°Ôµµ Á¦ ³í¹®ÀÌ Ã¤ÅÃÀ̵Ǽ­ final conference copy¸¦ À§ÇÑ ¸¶Áö¸· ¼öÁ¤ ÀÛ¾÷ÀÌ ÀÖ¾ú°Åµç¿ä ±×·¯³ª ´õ ÀÌ»ó ¹Ì·ê ¼ö ¾ø´Ù´Â »ý°¢¿¡¼­ ÇѱÛÈ­µÈ ³í¹®Àº ´ÙÀ½ÀÇ ±âȸ·Î ¹Ì·ç°í, ¿ì¼±Àº ¿µ¹® ³í¹®À» ±×´ë·Î ÀÌ ¹øÈ£ÀÇ °´Ã¼ÁöÇâ´º½º·¹ÅÍ¿¡ °ø°³ÇÕ´Ï´Ù. °ü½ÉÀÖÀ¸½Å ºÐµéÀº ¸¹ÀÌ ÀÐ¾î º¸½Ã°í¿ä, ¸¹Àº commentºÎŹµå¸³´Ï´Ù. ^(^
 
 
 


 oonewsletter - 2000/7/29