|
ÀÌ ¹øÈ£¿¡ ´Ù·ç·Á°í ÇÏ´Â µðÀÚÀÎ ÆÐÅÏÀº Composite ÆÐÅÏ[1]ÀÌ´Ù. ÀÌ ÆÐÅÏÀº ½Ã½ºÅÛ µðÀÚÀÎ °úÁ¤¿¡¼ Ç×»ó »ý°¢ÇÏ°Ô µÇ´Â ÀÎÅÍÆäÀ̽º(interface) ¼³°è ¹®Á¦¿Í °ÅÀÇ ´ëºÎºÐÀÇ ½Ã½ºÅÛ ±¸Á¶¿¡¼ µîÀåÇÏ´Â °´Ã¼°£ÀÇ tree ±¸Á¶¸¦ ¸Úµå·¯Áö°Ô ÇØ°áÇÑ´Ù´Â Á¡¿¡¼ ±× Á߿伺À» °¡Áø´Ù°í º¼ ¼ö ÀÖ´Ù°í »ý°¢Çؼ, ÀÌ ¹øÈ£ÀÇ À̾߱⠰Ÿ®·Î »ï¾Ò´Ù. ±×·³ À̾߱⸦ ½ÃÀÛÇغ¸ÀÚ. ÀÎÅÍÆäÀ̽º(Interface) ½Ã½ºÅÛÀ» µðÀÚÀÎÇÏ´Ù º¸¸é Ç×»ó »ý°¢ÇÏ°Ô µÇ´Â ¹®Á¦ ÁßÀÇ Çϳª°¡ ÀÎÅÍÆäÀ̽º(Interface)ÀÌ´Ù.¿©±â¼ ÀÎÅÍÆäÀ̽º¶õ Graphic User Interface¸¦ ÀǹÌÇÏ´Â °ÍÀÌ ¾Æ´Ï°í ¼ÒÇÁÆ®¿þ¾î ¸ðµâ(module)¿¡¼ ¿ÜºÎ¿¡ ¼ºñ½º(service)¸¦ Á¦°øÇϱâ À§ÇÑ Ã¢±¸(?) ¿ªÇÒÀ» ÇÏ´Â °ÍÀ» ÀǹÌÇÑ´Ù. ÇÊÀÚ´Â ÀÎÅÍÆäÀ̽º¸¸ Àß ¼³°èÇصµ Àüü ½Ã½ºÅÛÀÇ Àý¹Ý Á¤µµ´Â ¼º°øÇÑ °ÍÀ̶ó´Â »ý°¢À» °¡Áö°í ÀÖ´Ù. ±× ÀÌÀ¯´Â ÁÁÀº ÀÎÅÍÆäÀ̽º¸¦ ÅëÇؼ ÇϳªÀÇ ½Ã½ºÅÛÀ» ±¸¼ºÇÏ´Â ¿©·¯ ¸ðµâ°£ÀÇ ÀÇÁ¸¼º(dependency)À» ÁÙÀÏ ¼ö ÀÖÀ¸¸ç, ¶ÇÇÑ ÇØ´ç ¸ðµâÀÇ Åõ¸í¼º(transparency)À» ³ôÀÏ ¼ö ÀÖ´Ù. °á°úÀûÀ¸·Î´Â ½Ã½ºÅÛÀÇ °¢ ¸ðµâÀÇ Àç»ç¿ë¼ºÀ» ³ôÀÌ°í µçµçÇϸç, À¯Áö º¸¼ö°¡ ÁÁÀº ½Ã½ºÅÛÀ» ¼³°èÇÏ°Ô µÉ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ÀÌ·± À̾߱â´Â ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ °³ÀÎÀûÀÎ »ý°¢À̶ó±âº¸´Ù´Â ÀÎÅÍÆäÀ̽º¿¡ ´ëÇؼ À̾߱Ⱑ ³ª¿À¸é ´©±¸³ª À̾߱âÇÏ´Â ±×·± ³»¿ëÀÌ´Ù. ÇÏÁö¸¸, ÀÌ·± Á߿伺¿¡µµ ºÒ±¸ÇÏ°í, ½Ã½ºÅÛ ¼³°èÇÒ ¶§, ÀÎÅÍÆäÀ̽º¸¦ ¼ÒÈêÀÌ ÇÏ´Â °æÇâÀ» °æÇèÀ¸·Î ¸¹ÀÌ º¸¾Æ¿Ô´Ù. »ç½Ç ¸í½ÃÀûÀ¸·Î ¾ð±ÞÀ» ÇÏÁö´Â ¾Ê¾ÒÁö¸¸, Áö±Ý±îÁö ÇÊÀÚ°¡ ½á¿Â µðÀÚÀÎ ÆÐÅÏ°ü·Ã ±ÛÀÇ ³»¿ë¿¡´Â ¾Ë°Ô ¸ð¸£°Ô ÀÎÅÍÆäÀ̽º¿¡ °ü·ÃµÈ ³»¿ëÀÌ Æ÷ÇԵǾî ÀÖ´Ù. ´õ±¸³ª, ÇÊÀÚ°¡ µðÀÚÀÎ ÆÐÅÏ ±Û¿¡¼ »ç¿ëÇÏ°í ÀÖ´Â Java ÇÁ·Î±×·¡¹Ö ¾ð¾î¿¡´Â ÀÌ¹Ì ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ °³³äÀÌ Àß ¹Ý¿µµÇ¾î ÀÖ´Ù´Â °ÍÀ» ¡®interface¡¯¶ó´Â ¿¹¾à¾î(keyword)¸¦ ÅëÇؼ ¸í½ÃÀûÀ¸·Î ¹ß°ßÇÒ ¼ö ÀÖ´Ù. ÀÌ ¹øÈ£¿¡¼´Â ±× µ¿¾È ¸»¾øÀÌ »ç¿ëÇØ ¿Ô´ø ÀÎÅÍÆäÀ̽º¶ó´Â °³³äÀ» Composite ÆÐÅÏÀ» ÅëÇؼ ¾ÆÁÖ Á¶±Ý µå·¯³» ³õ°í »ý°¢ÇØ º¸·Á°í ÇÏ´Â °ÍÀÌ´Ù(»ç½Ç ÇÊÀÚ°¡ °´Ã¼ÁöÇâ ´º½º·¹ÅÍ 2È£¿¡¼ ÀÎÅÍÆäÀ̽º¿Í °ü·ÃÇÑ ³»¿ëÀ» Á¤¸®ÇÏ°í ½Í´Ù´Â À̾߱⸦ Çß¾ú´Âµ¥.. ÇÊÀÚÀÇ »çÁ¤À¸·Î ±×·¯ÇÏÁú ¸øÇß´Ù^(^). ´ÙÀ½ Àý¿¡¼ºÎÅÍ´Â ÆÄÀÏ ½Ã½ºÅÛ(file system)ÀÇ ¿¹¸¦ ÅëÇØ Composite ÆÐÅÏÀÌ ¾î¶»°Ô Àû¿ëµÉ ¼ö ÀÖÀ¸¸ç, ÀÌ ¶§ ÀÌ ÆÐÅÏÀÌ ÀÎÅÍÆäÀ̽º¿Í °ü·ÃÇÏ¿© ¾î¶² À̾߱âµéÀÌ ³íÀǵǾî Áú ¼ö ÀÖ´ÂÁö¸¦ »ý°¢ÇØ º¸·Á°í ÇÑ´Ù. ±×·³ À̾߱⸦ ½ÃÀÛÇØ º¸ÀÚ. ÆÄÀÏ ½Ã½ºÅÛ(file system) Composite ÆÐÅÏÀ» ¼³¸íÇϱâ À§Çؼ ÄÄÇ»Å͸¦ »ç¿ëÇÏ´Â ¸ðµç »ç¶÷µé¿¡°Ô Àͼ÷ÇÑ(¸ÅÀÏ »ç¿ëÇÏ´Â ½Ã½ºÅÛÀ̴ϱî..) ÆÄÀÏ ½Ã½ºÅÛ(file systems)ÀÇ ¿¹¸¦ µé¾î ¼³¸íÇÏ°Ú´Ù. »ç½Ç ÀÌ ÀýÀÇ ³»¿ëÀº John Vlissides°¡ ÀÚ½ÅÀÇ Ã¥ Pattern Hatching[3]¿¡¼ ÆÐÅÏÀ» »ç¿ëÇؼ ½Ã½ºÅÛÀ» µðÀÚÀÎ ÇÑ´Ù´Â °ÍÀÌ ¹«¾ùÀ» ÀǹÌÇÏ´ÂÁö¸¦ º¸À̱â À§Çؼ »ç¿ëÇÑ ¿¹¸¦ ÇÊÀÚ°¡ ¿©±â¼ ±ØÈ÷ ÀϺκи¸ º» ±ÛÀÇ Àǵµ¿¡ ¸ÂÃß¾î¼ ¼öÁ¤ÇÏ¿© ´Ù·é °ÍÀÌ´Ù. (ÆÐÅÏ¿¡ °ü½ÉÀ» °¡Áö°í ÀÖ´Â µ¶ÀÚ´Â Pattern HatchingÀÇ 2ÀåÀ» ²À ÀÐ¾î º¸±â¸¦ ±ÇÇÑ´Ù. ÆÐÅÏÀÇ Á߿伺(¶Ç´Â À¯¿ë¼º)À» ±Ø¸íÇÏ°Ô µé¾î³»ÁÖ´Â ±Û·Î ¾ÆÁÖ ÀλóÀûÀÌ´Ù. ¿äÁò ÇÊÀÚ´Â °³ÀÎÀûÀÎ ÇÁ·ÎÁ§Æ®ÀÇ ¾ÆÀ̵ð¾î¸¦ ¾ò°íÀÚ JohnÀÇ ±ÛÀ» ´Ù½Ã ²Ä²ÄÈ÷ Àаí Àִµ¥, ±× ³»¿ë¿¡ ´Ù½Ã Çѹø °¨µ¿ ¹Þ°í ÀÖ´Ù.) ±×·³ ÀÌÁ¦ º»°ÝÀûÀÎ ³íÀÇ·Î µé¾î°¡ÀÚ. »ç¶÷µéÀÌ ÄÄÇ»Å͸¦ »ç¿ëÇÒ ¶§, ¾Ë°Ô ¸ð¸£°Ô Ç×»óÇÏ°í ÀÖ´Â ÀÛ¾÷ ÁßÀÇ Çϳª°¡ µð·ºÅ丮(directory) ¶Ç´Â ÆÄÀÏ(file)ÀÇ »ý¼º, »èÁ¦, º¹»ç, À̵¿, ¼öÁ¤¿¡ °üÇÑ ÀÛ¾÷ÀÏ °ÍÀÌ´Ù. ÄÄÇ»Å͸¦ ±×³É Å°°í ²ô±â¸¸ Çصµ ÇØ´ç ½Ã½ºÅÛ¿¡ ¼³Ä¡µÇ¾î ÀÖ´Â ¿î¿µÃ¼Á¦(Operating System)°ü·Ã ÆÄÀÏ Áß¿¡¼ ÀÌ¿Í °ü·ÃµÈ ÆÄÀÏ¿¡´Â Á¶±×¸¶ÇÑ º¯È°¡ °¡ÇØÁú °ÍÀÌ´Ù. ÀÌó·³ Çö´ë ÄÄÇ»ÅÍ ½Ã½ºÅÛÀÇ °³³ä¿¡¼ ÆÄÀÏ ½Ã½ºÅÛÀÇ Á߿伺Àº ¾öû³ °ÍÀÌ´Ù. ´Ù½Ã ¸»Çؼ, ÆÄÀÏ ½Ã½ºÅÛ ¾ø´Â ÄÄÇ»ÅÍ ½Ã½ºÅÛÀº »ý°¢ÇÒ ¼ö ¾ø´Ù. ±×·¯³ª, ±× Á߿伺¿¡µµ ºÒ±¸ÇÏ°í ³Ê¹«µµ ÈçÇÑ ÀÛ¾÷À̶ó, ÄÄÇ»ÅÍ ½Ã½ºÅÛÀ» »ç¿ëÇÏ°í ÀÖ´Â »ç¶÷µé Áß¿¡¼ ±× Á߿伺À» ÀνÄÇÏ°í ÀÖ´Â »ç¶÷Àº °ÅÀÇ ¾ø´Â °Í °°´Ù. ¸¶Ä¡ ¿ì¸®°¡ »ì¾ÆÀÖÀ¸¸é¼ °ø±âÀÇ Á߿伺À» ¸Á°¢ÇÏ°í ÀÖµíÀÌ.. ¾î¶µç, ÀÌ·¸°Ô Áß¿äÇÑ ÆÄÀÏ ½Ã½ºÅÛÀ» ¿ì¸®°¡ ÇÑ ¹ø µðÀÚÀÎ ÇÑ´Ù°í »ý°¢ÇØ º¸ÀÚ. ÀÚ ±×·³, ÀÌÁ¦ ¹«¾ùºÎÅÍ »ý°¢À» ÇØ¾ß ÇÒ±î? ¿©±â¼´Â »õ·Î¿î °³³äÀÇ ÆÄÀÏ ½Ã½ºÅÛÀ» µðÀÚÀÎÇÑ´Ù´Â °Í º¸´Ù´Â ±âÁ¸ÀÇ ÆÄÀÏ ½Ã½ºÅÛÀÇ °³³äÀ» ¹ÙÅÁÀ¸·Î ³ª¸§´ë·Î ±× ³»ºÎ¸¦ µðÀÚÀÎ ÇÑ´Ù´Â °ÍÀ» °¡Á¤ÇÑ´Ù. ÀÌ·± °¡Á¤ÇÏ¿¡¼ ¿ì¸®°¡ ÆÄÀÏ ½Ã½ºÅÛÀ» ¸Ó¸® ¼Ó¿¡ ¶°¿Ã¸± ¶§, ½±°Ô »ý°¢ÇÒ ¼ö ÀÖ´Â °ÍÀº ÆÄÀÏ ½Ã½ºÅÛÀº µð·ºÅ丮¿Í ÆÄÀÏÀ̶ó´Â Å©°Ô µÎ °³ÀÇ ¿ä¼Ò·Î ±¸¼ºµÇ¾î ÀÖ´Ù´Â °ÍÀÌ´Ù. µû¶ó¼, ÀÌ·± ±¸Á¶¸¦ °¡Áö´Â ½Ã½ºÅÛÀ» µðÀÚÀÎ ÇØ º¸¶ó°í ÇÏ¸é ¾Æ¸¶ ´ëºÎºÐÀÇ °³¹ßÀÚ³ª ½Ã½ºÅÛ µðÀÚÀ̳ʴ °¢ ¿ä¼Ò¸¦ ÇϳªÀÇ °´Ã¼·Î ³ªÅ¸³»¾î ±×¸² 1°ú °°ÀÌ µðÀÚÀÎ ÇÒ °ÍÀ¸·Î »ý°¢ÀÌ µç´Ù(À̾߱⸦ ÁøÇà½ÃÅ°±â À§ÇÑ fiction.. ^(^). ±×¸² 1. ÆÄÀÏ ½Ã½ºÅÛ µðÀÚÀÎ #1 ±×¸² 1°ú °°Àº µðÀÚÀεµ º° ¹®Á¦´Â ¾ø¾î º¸ÀδÙ. Directory °´Ã¼´Â ¿©·¯ ÆÄÀÏ Å¸ÀÔ¿¡ »ó°ü¾øÀÌ µ¿ÀÏÇÑ ¡°File¡± interface¸¦ ÅëÇؼ ¿©·¯ ŸÀÔÀÇ File°´Ã¼µéÀ» ÀÏ°ü¼º(uniformity)À» °¡Áö°í ´Ù·ê ¼ö ÀÖÀ» »Ó¸¸ ¾Æ´Ï¶ó, ÀڽŰú °°Àº ŸÀÔÀÇ °´Ã¼(Directory)¸¦ Æ÷ÇÔ½Ãų ¼ö ÀÖ°Ô µÇ¾î ÀÖ´Ù. µð·ºÅ丮¿Í ÆÄÀÏ°£ÀÇ °ü°è¸¸ º¸¸é ÆÄÀÏ ½Ã½ºÅÛ ±¸Á¶ ÀÚü¿¡ ´ëÇؼ ¹«¸®°¡ ¾ø´Â µðÀÚÀÎÀ¸·Î º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ÇÏÁö¸¸, »ý°¢À» Á» ´õ ³ÐÇô º¸ÀÚ. ½ÇÁúÀûÀ¸·Î µð·ºÅ丮¿Í ÆÄÀÏÀ» ´Ù·ç´Â Ŭ¶óÀ̾ðÆ®(client)ÀÇ ÀÔÀå¿¡¼ »ý°¢ÇØ º¸ÀÚ. ´Ù½Ã ¸»Çؼ, µð·ºÅ丮¿Í ÆÄÀÏÀ» »ý¼º, ¼öÁ¤, À̵¿ µîÀÇ ÀÏÀ» Çϴ Ŭ¶óÀ̾ðÆ®ÀÇ ÀÔÀå¿¡¼´Â ±×¸² 1°ú °°Àº µðÀÚÀÎÀÌ ¾î¶»°Ô º¸Àϱ »ý°¢ÇØ º¸¾Æ¾ß ÇÒ °ÍÀÌ´Ù. ±×¸² 1°ú °°Àº µðÀÚÀÎÀ¸·Î ±¸ÇöµÇ¾î ÀÖ´Â ÆÄÀÏ ½Ã½ºÅÛÀ» ÀÌ¿ëÇϴ Ŭ¶óÀ̾ðÆ®¸¦ ±¸ÇöÇÑ´Ù°í °¡Á¤ÇØ º¸ÀÚ. ÀÌ Å¬¶óÀ̾ðÆ®¿¡¼ µð·ºÅ丮ÀÇ À̸§°ú ÆÄÀÏÀÇ À̸§À» ÀÐ¾î µéÀÌ´Â °Í°ú °°Àº ÀÛ¾÷À» ±¸ÇöÇϱâ À§Çؼ´Â ¾î¶»°Ô ÇØ¾ß Çϴ°¡? ´ë»óÀÌ µÇ´Â °´Ã¼ÀÇ Å¸ÀÔÀÌ DirectoryÀÎÁö FileÀÎÁö¸¦ ¸ÕÀú ±¸ºÐÇØ¾ß ÇÏ´Â ÀÛ¾÷À» ÇØ¾ß ÇÒ °ÍÀÌ´Ù. ±× ÀÌÀ¯´Â °¢°¢ÀÇ °´Ã¼°¡ ¼·Î ´Ù¸¥ ¿ÜºÎÀÇ ÀÀ¿ëÇÁ·Î±×·¥µé¿¡°Ô Á¦°øÇÏ´Â µ¿ÀÏÇÑ ÀÎÅÍÆäÀ̽º (getName())°¡ ¾ø±â ¶§¹®ÀÌ´Ù. ´Ù½Ã ¸»Çؼ, Directory ŸÀÔÀÌ °´Ã¼´Â pubic visibility¸¦ °¡Áö´Â Àڽſ¡ ¼ÓÇÑ methodÀÎ getName()À» ÅëÇÏ°í, File ŸÀÔÀÇ °´Ã¼´Â FileÀ̶ó´Â interfaceÀÇ getName()À» ÅëÇؼ ¿ÜºÎ¿¡ ÇØ´ç °´Ã¼ÀÇ À̸§ Á¤º¸¸¦ ´ã°í ÀÖ´Â attributeÀÇ °ªÀ» º¼ ¼ö ÀÖ´Â ¼ºñ½º¸¦ Á¦°øÇÏ°í ÀÖ´Â °ÍÀÌ´Ù. °á°ú´Â ¼Ò½º 1°ú ÇÑ ±¸Çö ¿¹´Ù. Class AClient
{ ¼Ò½º 1 ¼Ò½º 1À» º¸¸é rootDir_¿¡ Æ÷ÇԵǾî ÀÖ´Â Directory¿Í File °´Ã¼¿¡ µû¶ó¼ ¼·Î ´Ù¸¥ method(fileList(), dirList())¸¦ µÎ¾î ±¸ÇöµÇ¾î ÀÖ´Ù. ÀÌ·¸°Ô ÇØ´ç ÀÛ¾÷À» ÇϱâÀ§Çؼ µÎ °³ÀÇ method·Î ±¸Áö ±¸ºÐÇÒ ÇÊ¿ä´Â ¾øÁö¸¸, ¾Õ¿¡¼ À̾߱âÇßµíÀÌ Directory¿Í FileÀ̶ó´Â ŸÀÔÀ» ¾î¶² ÇüÅÂ·Îµç ¼Ò½º¿¡¼ staticÇÏ°Ô ±¸ºÐÇØ ÁÖ¾î¾ß¸¸ ÇÑ´Ù. Áï, ±×¸² 1°ú °°Àº µðÀÚÀÎÀ» »ç¿ëÇÒ °æ¿ì´Â ÀÌ·± ÆÄÀÏ ½Ã½ºÅÛÀ» »ç¿ëÇϴ Ŭ¶óÀ̾ðÆ®ÀÇ ¼Ò½º°¡ º¹ÀâÇØÁö´Â °ÍÀ» ÇÇÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. ±×·³ ´Ù¸¥ ´ë¾ÈÀ» ¾ø´Â °ÍÀΰ¡? Composite ÆÐÅÏ ±×¸² 1°ú °°Àº µðÀÚÀÎÀÇ ¹®Á¦Á¡À¸·Î »ý°¢µÇ´Â °ÍÀº Directory¿Í File °´Ã¼°¡ ¼·Î ´Ù¸¥ ÀÎÅÍÆäÀ̽º¸¦ °¡Áö°í ÀÖ´Ù´Â °ÍÀÌ´Ù. ±×·¸´Ù¸é ±×¸² 1ÀÇ µðÀÚÀÎÀÌ ¹ß»ý½ÃÅ°´Â Ŭ¶óÀ̾ðÆ®ÀÇ º¹À⼺À» ÁÙÀ̱â À§Çؼ µÎ °´Ã¼°¡ µ¿ÀÏ ÀÎÅÍÆäÀ̽º¸¦ °¡Áö°Ô ÇÏ¸é ¾î¶³±î? ±×¸² 2´Â ±×¸² 1ÀÇ µðÀÚÀÎÀÇ ´ë¾ÈÀ¸·Î Directory¿Í File µÎ °´Ã¼°¡ Node¶ó´Â µ¿ÀÏÇÑ ÀÎÅÍÆäÀ̽º¸¦ °¡Áö´Â ±¸Á¶·Î µÇ¾î ÀÖ´Ù. ±×¸² 2. Composite ÆÐÅÏÀ» Àû¿ëÇÑ ÆÄÀÏ ½Ã½ºÅÛ µðÀÚÀÎ ±×¸² 2ÀÇ µðÀÚÀÎÀº Composite ÆÐÅÏ(¾Æ·¡ ±×¸² 3)À» Àû¿ëÇÑ °ÍÀ¸·Î tree ±¸Á¶¸¦ °¡Áö´Â °´Ã¼µéÀ» Ç¥ÇöÇÒ ¶§ ¾ÆÁÖ À¯¿ëÇÏ°Ô Àû¿ëÇÒ ¼ö ÀÖ´Â ÆÐÅÏÀÌ´Ù. ÀÌ ±ÛÀÇ ¿¹¿¡¼´Â FileÀÌ tree ±¸Á¶ÀÇ leaf¿ªÇÒÀ» ÇÏ°í Directory´Â ¶Ç ´Ù¸¥ Directory³ª File °´Ã¼¸¦ Æ÷ÇÔÇÏ´Â compositeÀÇ ±â´ÉÀ» °¡Áö´Â internal nodeÀÇ ¿ªÇÒÀ» ÇÏ°í Àֱ⠶§¹®¿¡, Composite ÆÐÅÏÀ» ¿©±â¼ÀÇ ¿¹¿¡ Àû¿ëÇÏ¸é ±×¸² 2°ú °°ÀÌ ±¸¼ºµÉ ¼ö ÀÖ´Â °ÍÀÌ´Ù (tree±¸Á¶¸¦ À̾߱âÇÒ ¶§ »ç¿ëµÇ´Â leaf, internal node¿Í °°Àº ¿ë¾î¸¦ Ȥ½Ã ¸ð¸£´Â µ¶ÀÚ°¡ ÀÖ´Ù¸é ÀڷᱸÁ¶ Ã¥À» ²À º¸±â ¹Ù¶õ´Ù. ÇÁ·Î±×·¥À» Â¥´Â »ç¶÷ÀÌ tree ±¸Á¶¸¦ ¸ð¸¥´Ù´Â °ÍÀº ÀüÇô ¸»ÀÌ µÇÁö ¾Ê±â ¶§¹®ÀÌ´Ù). ±×¸² 3. Composite ÆÐÅÏ ±×¸² 2ÀÇ µðÀÚÀÎÀ» »ìÆ캸ÀÚ. ÀÌ µðÀÚÀÎÀº ±×¸² 1ÀÇ µðÀÚÀο¡¼ ¹®Á¦Á¡À¸·Î »ý°¢µÇ´ø °ÍÀ» º¸¿ÏÇϱâ À§Çؼ Directory¿Í FileÀÌ Node¶ó´Â µ¿ÀÏÇÑ ÀÎÅÍÆäÀ̽º¸¦ ¿ÜºÎ¿¡ Á¦°øÇϵµ·Ï µÇ¾î ÀÖ´Ù. µû¶ó¼, ÇØ´ç ÆÄÀÏ ½Ã½ºÅÛÀ» »ç¿ëÇϴ Ŭ¶óÀ̾ðÆ®´Â Directory¿Í FileÀ» ±¸ºÐÇÏÁö ¾Ê°í µ¿ÀÏÇÏ°Ô ´ë»ó Node¿¡ ´ëÇؼ ¿©·¯ °¡Áö ÀÛ¾÷À» ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. ±×¸¸Å ÇØ´ç ÆÄÀÏ ½Ã½ºÅÛÀ» »ç¿ëÇϴ Ŭ¶óÀ̾ðÆ®ÀÇ º¹À⼺ÀÌ »ç¶óÁø´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. ÀÌ¿Ü¿¡µµ Directory°¡ ´Ù½Ã Directory³ª FileÀ» Æ÷ÇÔÇÏ´Â ±¸Á¶¸¦ ³ªÅ¸³»±â À§Çؼ Directory°¡ Node¸¦ aggregateÇϵµ·Ï ÇÏ¿´´Ù. ±¸Ã¼ÀûÀ¸·Î Ŭ¶óÀ̾ðÆ®ÀÇ ¼Ò½º 1Àº ¼Ò½º 2¿Í °°ÀÌ ´Ü¼ø鵃 ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¼Ò½º 2¿¡ º¸¸é Ŭ¶óÀ̾ðÆ®¿¡°Ô´Â ÇØ´ç Node°¡ DirectoryÀÎÁö FileÀÎÁö ÀüÇô µå·¯³ª ÀÖÁö ¾Ê´Ù. ÇÏÁö¸¸, Ŭ¶óÀ̾ðÆ®´Â ¼Ò½º 1¿¡¼¿Í ¸¶Âù°¡Áö·Î rootDir_°¡ Æ÷ÇÔÇÏ°í ÀÖ´Â Directory¿Í File °´Ã¼ÀÇ À̸§À» ³ªÅ¸³»´Â attribute¸¦ ¿ÜºÎ¿¡ Á¦°øÇÏ´Â ¼ºñ½º¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Áï, Ŭ¶óÀ̾ðÆ®°¡ Directory¿Í File¿¡ ´ëÇؼ °¡Áö´Â ÀÎÅÍÆäÀ̽º´Â Node ÇϳªÀ̹ǷΠŬ¶óÀ̾ðÆ®´Â Directory¿Í File¿¡ »ó°ü¾øÀÌ µ¿ÀÏÇÑ ¸Þ¼Òµå(getChild())¸¦ »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ °ÍÀÌ´Ù. Class AClient
{ ¼Ò½º 2 À§¿¡¼ µÎ °³ÀÇ µðÀÚÀÎÀ» ºñ±³ÇÏ¿© º¸¾Ò´Ù. ù ¹ø° µðÀÚÀÎÀº °¢°¢ÀÇ °´Ã¼°¡ ¼·Î ´Ù¸¥ ÀÎÅÍÆäÀ̽º¸¦ ¿ÜºÎ¿¡ Á¦°øÇÔÀ¸·Î½á, ÇØ´ç ÆÄÀÏ ½Ã½ºÅÛÀ» »ç¿ëÇϴ Ŭ¶óÀ̾ðÆ®°¡ °¢°¢ÀÇ °´Ã¼ ŸÀÔÀ» ±¸ºÐÇÏ¿© ÇØ´ç °´Ã¼ÀÇ ¼ºñ½º¸¦ ÀÌ¿ëÇϵµ·Ï µÇ¾î ÀÖ´Ù. ¹Ý¸é¿¡ µÎ ¹ø° µðÀÚÀÎÀº µÎ °´Ã¼°¡ µ¿ÀÏÇÑ ÀÎÅÍÆäÀ̽º¸¦ ¿ÜºÎ¿¡ Á¦°øÇÔÀ¸·Î½á ÀÌ·¸°Ô µðÀÚÀÎµÈ ÆÄÀÏ ½Ã½ºÅÛ¿¡ ´ëÇÑ Å¬¶óÀ̾ðÆ®°¡ ÇØ´ç °´Ã¼ÀÇ Å¸ÀÔÀ» °í·ÁÇÏÁö ¾Ê°í, Áï, ½Ã½ºÅÛÀÌ Åõ¸í¼º(transparency)À» Á¦°øÇÏ¿©, ¼ºñ½º¸¦ ÀÏ°ü¼º(uniformity) ÀÖ°Ô ÀÌ¿ëÇÒ ¼ö ÀÖ°Ô µÇ¾î ÀÖ´Ù. ¾î´À µðÀÚÀÎÀÌ ÁÁ´Ù°í »ý°¢µÇ¾î Áö´Â°¡? ´äÀº µðÀÚÀÎ ÇÏ°í ÀÖ´Â ½Ã½ºÅÛÀÇ ¼º°Ý¿¡ µû¶ó ´Ù¸£´Ù´Â °ÍÀÌ´Ù. ±× ÀÌÀ¯´Â ÀÌ·¸´Ù. ¸ÕÀú ù ¹ø° µðÀÚÀÎÀÇ °æ¿ì¿¡´Â Ŭ¶óÀ̾ðÆ®°¡ º¹ÀâÇØÁö´Â ¹®Á¦°¡ ÀÖÁö¸¸, staticÇÏ°Ô Å¸ÀÔÀ» °áÁ¤ÇÒ ¼ö Àֱ⠶§¹®¿¡, Á» ´õ ¾ÈÁ¤ÀûÀÎ ½Ã½ºÅÛÀ» óÀ½ºÎÅÍ ±¸ÇöÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡ÀÌ ÀÖ´Ù. ÀÌ¿Í ¹Ý´ë·Î µÎ ¹ø° µðÀÚÀÎÀº ¾Õ¿¡¼ À̾߱âÇÑ´ë·Î ÇØ´ç °´Ã¼ÀÇ Å¸ÀÔÀÌ runtime¿¡ °áÁ¤µÊÀ¸·Î½á ŸÀÔ ¿À·ù·Î ÀÎÇÑ ¿Àµ¿ÀÛÀ» À¯¹ßÇÒ ¼ö ÀÖ´Â ¼ÒÁö¸¦ ³²±â°Ô µÈ´Ù. ÀÌ °ÍÀº ½Ã½ºÅÛ¿¡ Åõ¸í¼ºÀ» Á¦°øÇÏ´Â °Í¿¡ ´ëÇÑ ´ë°¡ÀÎ °ÍÀÌ´Ù. (´«Ä¡ ÀÖ´Â µ¶ÀÚ´Â ±×¸² 3ÀÇ Composite ÆÐÅÏ¿¡¼ method »ç¿ëÀÇ ÀÌ»óÇÑ Á¡À» ¹ß°ßÇßÀ» °ÍÀ¸·Î »ý°¢µÇ´Âµ¥..) »ç½Ç ¾ÈÁ¤¼ºÀÌ ¸ÕÀú³Ä, ¾Æ´Ï¸é Åõ¸í¼ºÀÌ ¸ÕÀú³Ä ÇÏ´Â °Í¿¡ ´ëÇÑ °áÁ¤Àº Composite ÆÐÅÏ ³»¿¡¼ add, remove, getChild °°Àº leaf¿¡°Ô´Â ÀÇ¹Ì ¾ø´Â method¸¦ component¿¡ ³Ö´À³Ä, ¾Æ´Ï¸é composite¿¡ ³Ö´À³Ä¸¦ °áÁ¤ÇÏ´Â °÷¿¡¼µµ ÇØ¾ß ÇÑ´Ù. ¿Ö ±×·±°¡? add, remove, getChildÀÇ method¸¦ component¿¡ ³Ö°Ô µÇ¸é Åõ¸í¼ºÀÌ Á¦°øµÇÁö¸¸, leaf¿¡¼´Â ÀÇ¹Ì ¾ø´Â method¿¡ ´ëÇÑ ±¸Çö ÀÛ¾÷À» ÇØ¾ß ÇÏ°í, ÀÌ methodµéÀ» composite¿¡ ³ÖÀ¸¸é Åõ¸í¼ºÀº ÀÒ¾î¹ö¸®Áö¸¸, staticÇÏ°Ô Å¸ÀÔÀÌ °áÁ¤µÇ°í leaf¿¡¼ ÀÇ¹Ì ¾ø´Â method¿¡ ´ëÇÑ ±¸Çö ÀÛ¾÷À» ÇÒ Çʿ伺ÀÌ ¾ø¾îÁö±â ¶§¹®ÀÌ´Ù. °á·ÐÀûÀ¸·Î ±×¸² 1ÀÇ µðÀÚÀΰú ±×¸² 2ÀÇ µðÀÚÀÎÀÇ Â÷ÀÌ´Â ÆÄÀÏ ½Ã½ºÅÛÀÌ ¿ÜºÎ¿¡ Á¦°øÇÏ´Â ÀÎÅÍÆäÀ̽º¿¡ ´ëÇÑ Â÷À̶ó°í º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. »ç½Ç ÀÌ ¹®Á¦°¡ º° °Í ¾Æ´Ñ °Íó·³ º¸ÀÎ´Ù°í »ý°¢ÇÏ´Â µ¶ÀÚµµ ÀÖÀ» ¼ö ÀÖÁö¸¸, ±×°ÍÀº ÀÌ ±Û¿¡¼ ´Ù·ç°í ÀÖ´Â ¿¹ÀÇ ³»¿ëÀÌ ´Ü¼øÇϱ⠶§¹®¿¡ ±×·¸°Ô º¸ÀÌ´Â °Í »ÓÀÌ´Ù. ½ÇÀçÀÇ º¹ÀâÇÑ ½Ã½ºÅÛ¿¡¼´Â ÀÎÅÍÆäÀ̽ºÀÇ ¼³°è°¡ Àüü ½Ã½ºÅÛÀÇ ¼º°ø¿©ºÎ¸¦ °áÁ¤ÁöÀ» ¼ö ÀÖ´Â Áß¿äÇÑ ¿ä¼Ò·Î ÀÛ¿ëÇÒ ¼ö ÀÖ´Ù. Composite ÆÐÅÏ¿¡ ´ëÇؼµµ À̾߱âÇÏ°í, À̸¦ ÅëÇؼ ÀÎÅÍÆäÀ̽º¶ó´Â ÁÖÁ¦¿¡ ´ëÇؼµµ Á¶±Ý À̾߱⸦ ÇØ º¸·Á´Â ¿å½ÉÀ» °¡Áö°í ±ÛÀ» ½è´Âµ¥.. ³Ê¹« µÎ¼ ¾ø´Â ±ÛÀÌ µÇ¾î ¹ö¸° °Í °°´Ù. ÀÎÅÍÆäÀ̽º¸¦ ÀÌ ¹øÈ£¿¡¼ ¸í½ÃÀûÀ¸·Î ¾ð±ÞÇßÀ¸´Ï±î, ¾ÕÀ¸·Î ±âȸ°¡ µÉ ¶§¸¶´Ù ³íÀÇÇØ º¸·Á°í ÇÑ´Ù. Àß µÉÁö ¸ð¸£°Ú´Ù. ^(^ Áö³ È£¿¡¼¿Í ¸¶Âù°¡Áö·Î GoFÃ¥ ÀúÀÚµéÀÌ ¹àÈ÷°í ÀÖ´Â Composite ÆÐÅÏÀÇ Àǵµ¸¦ Á¤¸®ÇÏ´Â °ÍÀ¸·Î ÀÌ ¹ø ±ÛÀ» ¸¶¹«¸® Áþ°Ú´Ù. Àǵµ(Intent) Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly Composite ÆÐÅÏÀº °´Ã¼°£ÀÇ Á¸ÀçÇÏ´Â ºÎºÐ-ÀüüÀÇ °èÃþ ±¸Á¶¸¦ tree ÇüÅ·Π³ªÅ¸³»ÁÖ¸ç, Ŭ¶óÀ̾ðÆ®°¡ °¢°¢ÀÇ °´Ã¼¿Í °´Ã¼¸¦ Æ÷ÇÔÇÏ´Â °´Ã¼(composite)¸¦ ÀÏ°üµÇ°Ô ´Ù·ê ¼ö ÀÖ°Ô ÇØ ÁØ´Ù. °ü·Ã ÆÐÅÏ ÀÌ ÆÐÅÏÀÇ ÀúÀÚµéÀÌ °ü·ÃÆÐÅÏÀ̶ó°í ¾ð±ÞÇÑ ÆÐÅÏÀº Responsibility, Decorator, Flyweight, Iterator, VisitorÀÌ´Ù[1]. Áö±Ý±îÁö ´Ù·ç¾î¿Ô´ø ÆÐÅϵ麸´Ù ±× ¼ö°¡ ¸¹Àº ÀÌÀ¯´Â Composite ÆÐÅÏÀº ±× ÀÚü°¡ ¾ÆÁÖ ±âº»ÀûÀÎ tree ±¸Á¶¸¸À» ³ªÅ¸³»°í Àֱ⠶§¹®¿¡ µðÀÚÀο¡ µû¶ó¼ ±¸Á¶¿¡ °ü°èµÈ ´Ù¸¥ ÆÐÅÏÀ̳ª ÇàÀ§¿Í °ü·ÃµÈ ´Ù¸¥ ÆÐÅÏ°ú À¯±âÀûÀ¸·Î ¿«¾îÁú ¼ö ÀÖ´Â °¡´É¼ºÀÌ ¾ÆÁÖ ¸¹±â ¶§¹®ÀÌ ¾Æ´Ñ°¡ »ý°¢ÇØ º»´Ù. ¸ÎÀ½¸» ÀÌ ¹øÈ£¿¡¼ ´Ù·é Composite ÆÐÅÏ ¶ÇÇÑ Å¬·¡½º ¼¼ °³·Î ÀÌ·ç¾îÁø ¾ÆÁÖ ´Ü¼øÇÑ ±¸Á¶ÀÌ´Ù. ÇÏÁö¸¸, ÀÌ ÆÐÅÏÀ» °¡Áö°íµµ »ý°¢ÇÒ °ÍµéÀº ¾ÆÁÖ ¸¹´Ù. ÀÌ ±Û¿¡¼´Â ±× Áß¿¡¼ ÀÎÅÍÆäÀ̽º Ãø¸é¿¡¼ ºÎ°¢À» ½ÃÅ°·Á°í ½ÃµµÇØ º¸¾Ò´Âµ¥ Àß µÇ¾ú´ÂÁö ¸ð¸£°Ú´Ù. ´Ù¸¥ °Íµµ ¸¶Âù°¡Áö¶ó°í »ý°¢ÇÏÁö¸¸, ÄÄÇ»ÅÍ ¼ÒÇÁÆ®¿þ¾î ½Ã½ºÅÛ¿¡¼ ÀÎÅÍÆäÀ̽º°¡ ¿Ö ±×·¸°Ô Áß¿äÇÑÁö´Â °æÇèÇØ º¸Áö ¾Ê°í´Â ÀÌÇØÇϱâ Èûµç µðÀÚÀÎ ¿ä¼ÒÁßÀÇ Çϳª¶ó´Â »ý°¢ÀÌ µç´Ù. °³ÀÎÀûÀ¸·Î´Â ÀÌ ±ÛÀÌ °æÇèÀÌ ¸¹Àº µ¶ÀÚ¿¡°Ô´Â µðÀÚÀÎ ÆÐÅÏÀÇ Á߿伺À» ÀνĽÃų ¼ö ÀÖ´Â °ÍÀÌ µÇ°í, °æÇèÀÌ ÀûÀº µ¶ÀÚ¿¡°Ô´Â Composite ÆÐÅÏÀ» ÅëÇؼ ±× µ¿¾È °¡º±°Ô ºÁ¿Ô´ø ÀÎÅÍÆäÀ̽º¿¡ ´ëÇؼ ±íÀÌ ÀÖ°Ô »ý°¢ÇÒ ¼ö ÀÖ´Â ±âȸ°¡ µÇ¾úÀ¸¸é ÇÏ´Â ¹Ù¶÷À» °¡Áø´Ù. Âü°í ¹®Çå [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] John Vlissides, Pattern Hatching: Design Patterns Applied, Addison-Wesley, 1998 |
oonewsletter - 2000/10/16 |