µðÀÚÀÎ ÆÐÅÏ(9) - ´õ ÁÁÀº ÀÎÅÍÆäÀ̽º¸¦ À§ÇÏ¿©..


À̽ÂÀÏ
E-mail:
gaialee@icu.ac.kr


Áö³­ È£¿¡ Composite[1] ÆÐÅÏÀ» ÀÎÅÍÆäÀ̽º(Interface)¶ó´Â ÁÖÁ¦¿Í ¿¬°ü Áö¾î¼­ »ý°¢ÇØ º¸¾Ò´Ù. À̾߱Ⱑ ÁøÇàµÇ·Á´Ù ¸¸ °æÇâÀÌ À־ À̹ø È£¿¡¼­´Â VisitorÆÐÅÏ[1]À̶ó´Â °ÍÀ» °¡Áö°í Áö³­È£ÀÇ 2ºÎÂë µÇ´Â À̾߱⸦ ÇØ º¸·Á ÇÑ´Ù.

Áö³­ È£ÀÇ À̾߱⠿¬°á...

Áö³­ È£ÀÇ CompositeÆÐÅÏ¿¡¼­ methodµéÀ» composite¿¡ ÁÖ´Â °Í°ú component¿¡ µÎ´Â °Í°úÀÇ Â÷ÀÌ¿¡¼­ ¹ß»ýÇÏ´Â ¹®Á¦¸¦ Åõ¸í¼º(transparency)°ú ¾ÈÀü¼º(safety)¿¡ ´ëÇÑ °üÁ¡¿¡¼­ ¼­·ÎÀÇ Àå´ÜÁ¡À» »ý°¢ÇØ º¸¾Ò´Ù. µ¶ÀÚµéÀº ÀúÀÚÀÇ À̾߱â ÁøÇàÀ» ¾î¶»°Ô »ý°¢ÇØ º¸¾Ò´ÂÁö ¸ð¸£°Ú´Ù. Áö³­ È£¿¡¼­ ´Ù·ç¾ú´ø µÎ °¡Áö °üÁ¡À» Á»´õ ÀÚ¼¼È÷ »ìÆ캸¸é, ´Ù¸¥ Èï¹Ì·Î¿î ÀÌ¾ß±æ °Å¸®¸¦ ãÀ» ¼ö ÀÖ´Ù. ¸ÕÀú, Åõ¸í¼º¿¡ ´ëÇؼ­ º¸ÀÚ. ÄÄÇ»ÅÍ ½Ã½ºÅÛ µðÀÚÀÌ³Ê ¶Ç´Â ÇÁ·Î±×·¡¹ÖÀ» °øºÎÇß´ø µ¶ÀÚµéÀº º¸¾Æ¿Ô´ø ¸¹Àº Ã¥¿¡¼­ Åõ¸í¼º¿¡ ´ëÇؼ­ À̾߱âÇÏ°í ÀÖ´Â °ÍÀ» ¹ß°ßÇßÀ» °ÍÀÌ´Ù. ¾î¶² ¸ðµâÀÌ ¿ÜºÎ¿¡ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù´Â °ÍÀº ¹«¾ùÀ» ÀǹÌÇϴ°¡? ÀÌ°ÍÀº ÇØ´ç ¸ðµâÀÇ ³»ºÎ ¼Ó»çÁ¤À» µÇµµ·ÏÀÌ¸é ¼û±â·Á´Â ³ë·ÂÀÇ ÀÏȯÀ̶ó°í »ý°¢ÇÒ ¼ö ÀÖ´Ù. °´Ã¼ÁöÇâ °üÁ¡¿¡¼­´Â ÀÌ°ÍÀ» ´Ù¸¥ ¿ë¾î·Î ¡®information hiding¡¯À̶ó°í À̾߱âµÇ¾î Áö±âµµ ÇÑ´Ù. ±×¸®°í, information hidingÀÇ Á» ´õ ±¸Ã¼ÀûÀÎ ¹æ¹ýÀº encapsulation°ú abstractionÀ̶ó°í À̾߱⸦ Çϸ鼭 ¿ì¸®µéÀÇ ¸Ó¸®¼ÓÀ» ¾îÁö·´°Ô ¸¸µç´Ù. encapsulationÀÌ ÀßµÈ ¸ðµâÀº ¿ÜºÎÀÇ Å¬¶óÀ̾ðÆ®¿¡°Ô ÃÖ¼ÒÇÑÀÇ ÀÎÅÍÆäÀ̽º¸¸À» Á¦°øÇϸ鼭 ³»ºÎÀÇ ¼Ó»çÁ¤À» °¡´ÉÇÑ ¾Ë ¼ö ¾ø°Ô ÇÔÀ¸·Î½á Ŭ¶óÀ̾ðÆ®¿ÍÀÇ °ü°è¸¦ ÃÖ¼ÒÈ­ ½ÃÅ°°í, °á±¹ Àß µðÀÚÀÎµÈ ¸ðµâÀ̶ó´Â ¼Ò¸®¸¦ µè´Â´Ù. ¸¹Àº ¹®¼­¿¡¼­ ¾ð±ÞÇϱ⠶§¹®¿¡ Àͼ÷ÇÏÁö¸¸ ÀÌÇØÇϱ⠽±Áö ¾ÊÀº ¿ë¾î·Î´Â À̸¦ ¡®low coupling¡¯À» ½ÇÇö½ÃÅ°°í ÀÖ´Â ¸ðµâÀ̶ó°í ºÒ¸°´Ù. AbstractionÀÌ ÀǹÌÇÏ´Â °Íµµ encapsulation°ú Àǹ̻óÀ¸·Î °ÅÀÇ ºñ½ÁÇÏ°Ô ÀÌÇصǾî Áö°í ÀÖ´Ù[2]. EncapsulationÀÌ °­Á¦ÀûÀ¸·Î ³»ºÎÀÇ ¼Ó»çÁ¤À» Ŭ¶óÀ̾ðÆ®°¡ º¼ ¼ö ¾ø°Ô ¸¸µå´Â °ÍÀ̶ó¸é, abstractionÀº ÀÚ¿¬½º·´°Ô ÀÌ·¯ÇÑ ¸ñÀûÀ» ÀÌ·ç´Â °ÍÀÌ¶ó º¼ ¼ö ÀÖÀ» °Í °°´Ù. ¹æ¹ýÀº ÇØ´ç ¸ðµâÀÌ °¡Áö´Â Àǹ̸¦ ¾ÆÁÖ Àß(?) ÀÎÅÍÆäÀ̽º·Î Ãß»óÈ­ ½ÃÅ´À¸·Î½á Ŭ¶óÀ̾ðÆ®°¡ ÇØ´ç ¸ðµâ¿¡¼­ Á¦°øÇÏ´Â ÀÎÅÍÆäÀ̽º ¿Ü¿¡ ´Ù¸¥ Á¤º¸¸¦ ¾Ë ÇÊ¿ä°¡ ¾ø°Ô ¸¸µå´Â °ÍÀÌ´Ù. Encapsulation¿¡¼­¿Í ¸¶Âù°¡Áö·Î Àß ¾Ë·ÁÁø ¿ë¾î·Î ÀÌ·± ¸ñÀûÀ» ´Þ¼ºÇÑ ¸ðµâÀ» ¡®high cohesion¡¯µÇ¾ú´Ù°í Çϸç, »ó´çÈ÷ µðÀÚÀÎÀÌ Àß µÈ ¸ðµâ·Î Ī¼Û(?)À» ÇÑ´Ù. Á¤¸®Çϸé, ÁÁÀº ½Ã½ºÅÛÀº low coupling°ú high cohesionÀ¸·Î ¹«ÀåµÇ¾î ¿ÜºÎ¿¡ Àǹ̸¦ Àß µå·¯³½ °£°áÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÏ´Â ¸ðµâµé·Î ÀÌ·ç¾îÁø °ÍÀ̶ó°í ¸¹À̵é ÀÌÇØÇÏ°í ÀÖ´Â °Í °°´Ù[2].

»ç½Ç Áö±Ý±îÁöÀÇ À̾߱Ⱑ ³Ê¹« Ãß»óÀûÀÌ´Ù. µµ´ëü ¾î¶»°Ô Çϸé encapsulation°ú abstractionÀÌ ÁÁÀº ¸ðµâÀ» ¼³°èÇÒ ¼ö ÀÖ´Â °ÍÀϱî? ÇÊÀÚÀÇ »ý°¢À¸·Î´Â À̸¦ À§ÇÑ ¾î¶² ¸íÈ®ÇÑ °ø½Ä°ú °°Àº ¹æ¹ý·ÐÀÌ ÀÖ´Â °ÍÀº ¾Æ´Ï°í, ¸¹Àº ½Ã½ºÅÛ µðÀÚÀÎ °æÇ踸ÀÌ ÀÖÀ» »ÓÀÌ´Ù¶ó°í »ý°¢ÇÑ´Ù. ¿Ö³ÄÇϸé, ÃÖÀûÀÇ ÀÎÅÍÆäÀ̽º¶ó´Â °ÍÀº »óȲ¿¡ µû¶ó¼­ ´Þ¶óÁö±â ¶§¹®ÀÌ´Ù. ÀÌ·± Àǹ̿¡¼­, µðÀÚÀÎÆÐÅÏÀº °æÇè ¸¹Àº ´Ù±¹Àû ¼±¹èµéÀÇ ³ëÇÏ¿ì°¡ ½×ÀÎ µðÀÚÀÎ ÇØ´äÀ̱⠶§¹®¿¡ ÈǸ¢ÇÑ ÀÚ¿øÀÌ µÉ ¼ö ÀÖ´Ù. ´Ù½Ã ¸»Çϸé, ¾î¶² ¹®Á¦°¡ ÀÌ·± »óȲ¿¡¼­´Â ÀÌ·¸°Ô ÇØ°áµÇ´Â °ÍÀÌ ÃÖ¼±ÀÌ µÉ ¼ö ÀÖ´Ù¶ó´Â °ËÁõµÈ µðÀÚÀÎÀ¸·Î º¼ ¼ö Àֱ⠶§¹®ÀÌ´Ù.

¾î¶»°Ô ÇÒ±î?

Áö³­ È£¿¡ composite ÆÐÅÏÀ» ÀÌ¿ëÇؼ­ °£´ÜÇÏ°Ô µðÀÚÀÎ Çß´ø ÆÄÀÏ ½Ã½ºÅÛÀ» ´Ù½Ã »ó±â½ÃÄѺ¸ÀÚ[±×¸² 1]. Áö³­ È£¿¡ µðÀÚÀÎ Çß´ø ÆÄÀÏ ½Ã½ºÅÛ¿¡¼­ ¿ÜºÎ¿¡ Á¦°øÇÏ°í ÀÖ´Â ÀÎÅÍÆäÀ̽º¸¦ °¡Áö°í ÇÒ ¼ö ÀÖ´Â ÀÏÀº »õ·Î¿î µð·ºÅ丮³ª ÆÄÀÏ Ã·°¡, »èÁ¦¿Í NodeÀÇ À̸§ º¸±â¸¦ ÇÒ ¼ö ÀÖ´Ù. µû¶ó¼­, ÀÌ ÆÄÀÏ ½Ã½ºÅÛ¿¡¼­ Á¦°øµÇ´Â ÀÎÅÍÆäÀ̽º¸¦ ÀÌ¿ëÇϸé ÆÄÀÏ ½Ã½ºÅÛ¿¡ µé¾îÀÖ´Â ÆÄÀÏ°ú µð·ºÅ丮ÀÇ À̸§º¸±âÀÇ °£´ÜÇÑ ls¿Í °°Àº ÀÀ¿ëÇÁ·Î±×·¥À» ¸¸µé ¼ö ÀÖ´Ù. ³Ê¹« °£´ÜÇÏ´Ù ½Í¾î¼­, µð·ºÅ丮´Â À̸§ µÚ¿¡ ¡°/¡±°¡ Ç¥½ÃµÉ ¼ö ÀÖµµ·Ï ÇÏ°í ½Í´Ù´Â »ý°¢À» Çß´Ù°í °¡Á¤ÇØ º¸ÀÚ. ¾î¶»°Ô ÇØ¾ß ÇÒ±î?

±×¸² 1. Composite ÆÐÅÏÀ» Àû¿ëÇÑ ÆÄÀÏ ½Ã½ºÅÛ µðÀÚÀÎ

ÆÄÀÏÀº ±×´ë·Î À̸§À» Ãâ·ÂÇÏ°í µð·ºÅ丮´Â À̸§ µÚ¿¡ ¡°/¡±°¡ Ãâ·ÂµÇ¾î¾ß ÇÏ´Â ¹®Á¦´Â ÇØ´ç nodeÀÇ Å¸ÀÔ¿¡ µû¶ó¼­ ´Þ¶óÁö°Ô µÈ´Ù. °¡Àå ½±°Ô »ý°¢ÇÒ ¼ö ÀÖ´Â µðÀÚÀÎ ¹æ¹ýÀº File node¿Í Directory nodeÀÇ getName()À» ¼­·Î ´Ù¸£°Ô ±¸ÇöÇÏ´Â °ÍÀÌ´Ù. ³Ê¹« °£´ÜÇÑ°¡? ¿©±â¼­ ¿ì¸®°¡ ÁÖÀÇ ±í°Ô ºÁ¾ß ÇÒ »çÇ×ÀÌ ÀÖ´Ù. ÀÌ ¹æ¹ýÀº ±âÁ¸ÀÇ ÆÄÀÏ ½Ã½ºÅÛÀÇ nodeµéÀÇ method¸¦ ¼öÁ¤ÇÏ°í »õ·Ó°Ô ÄÄÆÄÀÏÇÏ´Â °úÁ¤À» °ÅÄ¡°Ô µÈ´Ù. ¿¹Á¦°¡ ±âÁ¸¿¡ Á¸ÀçÇÏ´Â ÀÎÅÍÆäÀ̽ºÀÇ ±¸ÇöÀ» ¼­·Î ´Ù¸£°Ô ÇÏ´Â °ÍÀ¸·Î ³¡³ª´Â ¾ÆÁÖ °£´ÜÇÑ °ÍÀ̾ ±×·¸Áö, ¾Æ¿¹ »õ·Î¿î operationÀ» µµÀÔÇØ¾ß ÇÏ´Â ¹®Á¦¿¡ ´ç¸éÇßÀ» °æ¿ì¿¡´Â ±×¸® °£´ÜÇÏÁö ¾Ê´Ù. Áö³­ È£¿¡¼­ °í¹Î¿¡ ºüÁ³´ø ¹®Á¦°¡ ´Ù½Ã ´ëµÎµÇ´Â °ÍÀÌ´Ù. »õ·Î¿î ±â´ÉÀ» ÀÎÅÍÆäÀ̽ºÀÇ operationÀ¸·Î Ãß°¡ÇÒ °ÍÀΰ¡ ¾Æ´Ï¸é °¢ nodeÀÇ Å¸ÀÔÀÇ method·Î¸¸ µÑ °ÍÀΰ¡ ÇÏ´Â ¹®Á¦·Î ¸»ÀÌ´Ù. ÆÄÀÏ ½Ã½ºÅÛ¿¡ »õ·Î¿î ±â´ÉÀ» Ãß°¡ÇÒ ¶§¸¶´Ù ÀÌ·± °í¹ÎÀ» ÇÏ´Â °Íµµ Èûµç ÀÏÀε¥, Ãß°¡µÇ´Â ±â´ÉÀ» À§ÇÑ ÀÎÅÍÆäÀ̽ºÀÇ operationÀÇ Áõ°¡·Î Àüü ÆÄÀÏ ½Ã½ºÅÛÀÇ encapsulation°ú abstractionÀÌ ¶³¾îÁ®¼­ ³ªÁß¿¡´Â µµÀúÈ÷ °¨´çÇÒ ¼ö ¾øÀ» Á¤µµ·Î ÆÄÀϽýºÅÛÀÌ º¹ÀâÇØÁ®¼­ ÀÎÅÍÆäÀ̽º¶ó´Â Àǹ̰¡ ¹«»öÇØ Áú °ÍÀÌ´Ù. µû¶ó¼­, ÆÄÀÏ ½Ã½ºÅÛÀÇ ±â´É È®À强À» À§Çؼ­´Â ±âÁ¸ÀÇ ÆÄÀÏ ½Ã½ºÅÛÀ» ±¸¼ºÇÏ´Â node ±¸Á¶¸¦ ¼öÁ¤ÇÏ´Â ÀÌ¿Í °°Àº ¹æ¹ýÀº ±×¸® ¹Ù¶÷Á÷ÇÏÁö ¾Ê´Ù. Node¸¦ À§ÇÑ ÀÎÅÍÆäÀ̽ºÀÇ operationÀº °¡Àå ±âº»ÀûÀÎ ÃÖ¼ÒÇÑÀÇ °Í¸¸À» À¯ÁöÇϸ鼭 node¿¡ »õ·Î¿î operationÀ» °¡ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» ¸ð»öÇØ¾ß ÇÒ °ÍÀÌ´Ù.


Node¿¡ »õ·Î¿î operationÀ» °¡Çϴ åÀÓÀ» Ŭ¶óÀ̾ðÆ®¿¡ ÀÏÀÓÇÏ¸é ¾î¶³±î? ÇÑ ´®¿¡ ÀÌ·¯ÇÑ µðÀÚÀÎÀº °´Ã¼ÁöÇâÀû »ç°í¹æ½ÄÀ» ¹«½ÃÇÏ´Â »ó´çÈ÷ ºñÈ¿À²ÀûÀÎ µðÀÚÀÎ Á¢±Ù ¹æ¹ýÀÓÀ» ¾Ë ¼ö ÀÖ´Ù. ±× ÀÌÀ¯´Â »·ÇÏ´Ù. ÆÄÀÏ ½Ã½ºÅÛÀ» ÀÌ¿ëÇϴµ¥ À¯¿ëÇÏ°Ô »ç¿ëµÉ ¼ö ÀÖ´Â °øÅëµÈ ±â´ÉÀ» ¸ðµç Ŭ¶óÀ̾ðÆ® ¸¶´Ù ±¸ÇöÇÔÀ¸·Î½á Àç»ç¿ë¼º°ú Åõ¸í¼ºÀ» ¾ÆÁÖ ¹«½ÃÇØ ¹ö¸®±â ¶§¹®ÀÌ´Ù. ÀÌ °÷¿¡¼­ ¿¹ÀÇ °æ¿ì¿¡´Â ´ÙÀ½ÀÇ ¼Ò½º 1ó·³ Ŭ¶óÀ̾ðÆ®´Â ÇØ´ç nodeÀÇ Å¸ÀÔÀ» ±¸º°ÇÏ´Â °úÁ¤À» °ÅÄ¡°Ô µÇ¾î Áö³­ È£¿¡¼­ À̾߱âÇß´ø Åõ¸í¼ºÀ» ¶³¾î¶ß¸°´Ù.

 

        void ls(Node n_) {

                if(n_ instanceof File) {
                        System.out.println(n_.getName());
                }else if(n instanceof Directory) {
                        System.out.println(n_.getName() + "/");
                        for(int i=0; i < ((Directory)n_).getSize(); i++)
                                System.out.println(n_.getChild(i).getName() );

                }
        }

¼Ò½º 1. ls ±¸Çö #1

±×·³ ÀÌ·± ¹®Á¦Á¡À» ¾î´À Á¤µµ ±Øº¹ÇÒ ¼ö ÀÖ´Â ´Ù¸¥ µðÀÚÀÎ ¹æ¹ýÀº ¾ø³ª?

Visitor ÆÐÅÏ

Visitor ÆÐÅÏÀÌ ±× ÇÑ°¡Áö ÇØ´äÀÌ µÉ ¼ö ÀÖ´Ù. Visitor ÆÐÅÏÀÌ ¾î¶² °ÍÀÎÁö¿¡ ´ëÇÑ ÀϹÝÀûÀÎ À̾߱â´Â ³ªÁß¿¡ Çϱâ·Î ÇÏ°í, ÀÏ´Ü ´ÙÀ½ÀÇ ³»¿ëÀ» Àо±â ¹Ù¶õ´Ù.

Node¿¡ »õ·Î¿î operationÀÎ accept(Visitor v)¸¦ ÷°¡ÇÑ´Ù. ±×¸®°í ³­ ÈÄ¿¡ ´ÙÀ½°ú °°Àº Visitor Ŭ·¡½º¸¦ Á¤ÀÇÇÑ´Ù.

 

class Visitor {

        void visit(File file_) {
                System.out.println(file_.getName());
        }

        void visit(Directory dir_) {

                System.out.println(dir_.getName() + "/");
                for(int i=0 ; i < dir_.getSize(); i++)
                        System.out.println(dir_.getChild(i).getName());
 
        }
}

¼Ò½º2. Visitor class

±×¸®°í,  Node¿¡ »õ·Î ÷°¡µÈ accept operation¿¡ ´ëÇÑ File°ú Directory ÀÇ ±¸ÇöºÎ´Â ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

class File extends Node {
        ¡¦
        void accept(Visitor v_) {
                v_.visit(this);
        }
        ¡¦
}

class Directory extends Node {
        ¡¦
        void accept(Visitor v_) {
                v_.visit(this);
        }
        ¡¦
}

¼Ò½º3. accept methodÀÇ ±¸ÇöºÎ

ÀÌÁ¦ Àç·á(?)´Â ¸ðµÎ Áغñ µÆ´Ù. Node¿¡ »õ·Î ÷°¡µÈ operationÀÎ accept¿Í »õ·Î Á¤ÀÇÇÑ Visitor Ŭ·¡½º¸¦ °¡Áö°í ¼Ò½º 1°ú °°Àº ±â´ÉÀ» °¡Áö´Â Ŭ¶óÀ̾ðÆ®ÀÇ method¸¦ ±¸ÇöÇÏ¸é ´ÙÀ½°ú °°ÀÌ µÈ´Ù.

void ls(Node n_) {
        Visitor v_ = new Visitor();
        n_.accept(v_);
}

¼Ò½º 4. ls ±¸Çö #2

ÀÌÁ¦ ¼Ò½º1°ú ¼Ò½º4¸¦ ºñ±³ÇØ º¸ÀÚ. ¼Ò½º1°ú´Â ´Þ¸® ¼Ò½º4¿¡¼­´Â Ŭ¶óÀ̾ðÆ®¿¡¼­ Ãâ·ÂÇÏ·Á´Â ÇØ´ç nodeÀÇ Å¸ÀÔÀ» ±¸º°ÇÏ´Â °úÁ¤À» º¼ ¼ö ¾ø´Ù. ´ë½Å¿¡ »õ·ÎÀÌ Ãß°¡µÈ accept operationÀ» Visitor ÀνºÅϽºÀÇ reference¸¸À» ÀÎÀÚ·Î ÇÏ¿© È£ÃâÇÏ´Â °ÍÀÌ ÀüºÎÀÌ´Ù. accept operationÀÇ È£ÃâÀº °á°úÀûÀ¸·Î childÀÇ Å¸ÀÔ¿¡ µû¶ó¼­ ÀÚµ¿À¸·Î ¼Ò½º 3¿¡¼­ Á¤ÀÇµÈ °Íó·³ ÀÚ½ÅÀ» reference¸¦ ÀÎÀÚ·Î Çؼ­ Visitor ÀνºÅϽºÀÇ visit ¸Þ¼Òµå°¡ È£ÃâµÈ´Ù. ±×·¯¸é ¼Ò½º 2¿¡¼­Ã³·³ Visitor ÀνºÅϽºÀÇ´Â call backÀ¸·Î½á ÇØ´ç node ŸÀÔ¿¡ µû¶ógetNameÀ» È£ÃâÇÏ¿©, °á°úÀûÀ¸·Î´Â ¼Ò½º 1ó·³ nodeÀÇ Å¸ÀÔ °Ë»ç¸¦ Ŭ¶óÀ̾ðÆ®¿¡¼­ ÇÏÁö ¾Ê°íµµ °°Àº °á°ú¸¦ ¾ò°Ô µÈ´Ù. visit(File file_)°¡ È£Ãâ‰çÀ» °æ¿ì¸¦ interaction ´ÙÀ̾î±×·¥À¸·Î ³ªÅ¸³»¸é  ´ÙÀ½ÀÇ sequence diagram °ú °°´Ù.

±×¸² 2. Visitor ÆÐÅÏÀÇ sequence ´ÙÀ̾î±×·¥

ÀÌÁ¦ Á¤¸®¸¦ ÇØ º¸ÀÚ. ÆÄÀÏ ½Ã½ºÅÛ¿¡ »õ·Î¿î ±â´ÉÀ» º¸°­Çϱâ À§ÇÏ¿© accept¶ó´Â »õ·Î¿î operationÀ» Node¿¡ Ãß°¡Çϱâ´Â ÇßÁö¸¸,  ¼Ò½º 2¿¡¼­Ã³·³ ½ÇÁúÀûÀÎ ÇàÀ§´Â VisitorÀÇ visitÀ̶ó´Â ¸Þ¼Òµå¿¡°Ô À§ÀӵǾî ÀÖ´Ù. Áï, Ŭ¶óÀ̾ðÆ®´Â NodeÀÇ Å¸ÀÔ¿¡ µû¶ó¼­ ´Ù¸¥ Çü½ÄÀ¸·Î Ãâ·ÂÇϴ åÀÓÀ» °¡Áö´Â °´Ã¼¸¦ Visitor¶ó´Â À̸§À¸·Î »õ·Î ¸¸µé°í, ÀÌ °´Ã¼¸¦ Àüü ÆÄÀϽýºÅÛÀ» ±¸¼ºÇÏ´Â °¢ node¿¡ acceptÀÇ ÀÎÀÚ·Î ³Ñ°ÜÁÖ°í, °¢ node´Â call back Çü½ÄÀ¸·Î Visitor°¡ °¢ nodeÀÇ À̸§À» ÇØ´ç nodeÀÌ Å¸ÀÔ¿¡ µû¶ó¼­ Ãâ·ÂÇÏ°Ô µÇ¾î ÀÖ´Â ±¸Á¶´Ù.

°á°úÀûÀ¸·Î´Â node ŸÀÔ¿¡ µû¸¥ À̸§ Ãâ·Â¿¡ ´ëÇÑ Ã¥ÀÓÀÌ Node ÀÚüµµ ¾Æ´Ï°í, Node¸¦ »ç¿ëÇϴ Ŭ¶óÀ̾ðÆ®µµ ¾Æ´Ñ, Á¦ »ïÀÇ Visitor¶ó´Â °´Ã¼°¡ °¡Áö´Â ±¸Á¶¸¦ ¶ç°í ÀÖ´Ù. ÀÌ ±¸Á¶¸¦ Á»´õ ÀϹÝÈ­ ½ÃÅ°¸é ´ÙÀ½ÀÇ Å¬·¡½º ´ÙÀ̾î±×·¥°ú °°ÀÌ Ç¥ÇöµÉ ¼ö ÀÖ´Ù.

 

±×¸² 3. ÀϹÝÈ­µÈ Visitor ÆÐÅÏÀÇ È°¿ë ±¸Á¶

ls¸¦ À§ÇÑ ¸Þ¼Òµå¿Ü¿¡µµ ÆÄÀϽýºÅÛ¿¡ ´ëÇÑ À¯¿ëÇÑ ÀÀ¿ëÇÁ·Î±×·¥À¸·Î´Â Unix ½Ã½ºÅÛÀÇ cat°ú °°Àº °ÍÀ» ¿¹·Î º¼ ¼ö ÀÖ´Ù. catÀÇ °æ¿ì¿¡´Â ÇØ´ç node°¡ FileÀÎ °æ¿ì¿¡´Â file ³»¿ëÀ» Ãâ·ÂÇÏ°í directoryÀÎ °æ¿ì¿¡´Â ¿À·ù ¸Þ¼¼Áö¸¦ È­¸é¿¡ Ãâ·ÂÇÏ´Â ±â´ÉÀ» °®Ãß¾î¾ß ÇÑ´Ù. ÀÌ °æ¿ì¿¡µµ lsÀÇ °æ¿ì¿Í ¸¶Âù°¡Áö·Î NodeÀÇ encapsulation°ú abstractionÀ» ÃÖÀûÀÇ »óÅ·ΠÀ¯ÁöÇÏ°í, Ŭ¶óÀ̾ðÆ®ÀÇ ºÎ´ãÀ» ´ú¾îÁÖ±â À§ÇÏ¿© ÀÌ·¯ÇÑ ±â´ÉÀ» °¡Áö´ÂVisitor °´Ã¼¸¦ ¸¸µé¾î »ç¿ëÇÏ´Â °ÍÀ» °í·ÁÇØ º¼ ¼ö ÀÖ´Ù. ls¿Í cat ÀÌ¿Ü¿¡µµ ÆÄÀϽýºÅÛÀ» ±¸¼ºÇÏ´Â °¢ nodeÀÇ Å¸ÀÔ¿¡ µû¶ó¼­ °°Àº operation¿¡ ´ëÇؼ­ ´Ù¸¥ ÇàÀ§¸¦ ÇØ¾ß ÇÏ´Â operationµéÀ» »ý°¢ÇÒ ¼ö ÀÖ´Ù. ÀÌ·± °æ¿ì¸¦ °í·ÁÇÏ¿© ±×¸² 3¿¡¼­Ã³·³ Visitor ÀÎÅÍÆäÀ̽º¸¦ µÎ°í, ½ÇÁúÀûÀÎ operation¿¡ ´ëÇÑ ÇàÀ§¸¦ ±¸ÇöÇϴ Ŭ·¡½ºµéÀÌ Visitor ÀÎÅÍ ÆäÀ̽º¸¦ implementÇϵµ·Ï ÇÑ´Ù. ÀÌ·± ±¸Á¶·Î µðÀÚÀÎÇϸé, Ŭ¶óÀ̾ðÆ®´Â Node¸¦ ¼öÁ¤ÇÏÁö ¾Ê°íµµ Node¿¡ ´ëÇÑ »õ·Î¿î operationÀ» ¹«ÇÑÈ÷(?) ¸¸µé¾î »ç¿ëÇÒ ¼ö ÀÖ°Ô µÈ´Ù.


Encapsulation°ú abstraction¿¡ ´ëÇÑ ´À³¦ÀÌ Á¶±ÝÀ̳ª¸¶ µ¶Àڵ鿡°Ô Àü´ÞµÇ¾ú´ÂÁö ¸ð¸£°Ú´Ù. GoFÃ¥¿¡ ÀÖ´Â Visitor ÆÐÅÏ¿¡ ´ëÇÑ ±¸Á¶¿Í Àǵµ(intent)·Î½á ÀÌ ¹øÈ£¿¡ ´ëÇÑ À̾߱⸦ ÁÙÀÌ°Ú´Ù. ±×¸² 4´Â GoFÃ¥¿¡ ÀÖ´Â Visitor ÆÐÅÏÀ» ÇÊÀÚ°¡ Á¶±Ý ¼öÁ¤ÇÏ°í UMLÀ» »ç¿ëÇÏ¿© ±×¸° ´ÙÀ̾î±×·¥ÀÌ´Ù.

 

±×¸² 4. Visitor ÆÐÅÏ

     

    Àǵµ(Intent)

    Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.

    Visitor ÆÐÅÏÀº °´Ã¼ ±¸Á¶Ã¼ÀÇ element¿¡ ¿¬»êÀ» °¡ÇÏ´Â »õ·Î¿î operationÀ» ÇØ´ç elementÀÇ Å¬·¡½º¿¡ ¼öÁ¤À» °¡ÇÏÁö ¾ÊÀº »óÅ·ΠÃß°¡ÇÒ ¼ö ÀÖ°Ô ÇØ ÁØ´Ù.

     

°ü·Ã ÆÐÅÏ

ÀÌ ÆÐÅÏ°ú °ü·ÃÀÌ ÀÖ´Ù°í ÀúÀÚµéÀÌ À̾߱âÇϱâ·Î´Â Composite¿Í Interpreter ÆÐÅÏÀÌ ÀÖ´Ù. ÀÌ ¹øÈ£¿¡¼­´Â Visitor ÆÐÅÏÀ» Composite ÆÐÅÏ°ú ¿¬°üÁö¾î¼­ À̾߱⸦ ÇØ º¸¾Ò°í, ´ÙÀ½¿¡ ±âȸ°¡ µÇ¸é Interpreter¿Í ¿¬°üÁö¾î¼­ À̾߱⸦ ÇØ º¸°Ú´Ù.

¸ÎÀ½¸»

Encapsulation°ú AbstractionÀÌ ÁÁÀº °´Ã¼ÁöÇ⠽ýºÅÛÀ» µðÀÚÀÎ Çϱâ´Â Âü ¾î·Á¿î ÀÏÀÌ ¾Æ´Ò ¼ö ¾ø´Ù. °´Ã¼ÁöÇâ ÇÁ·Î±×·¡¹Ö ¾ð¾î¸¦ ¸¶½ºÅÍ Çß´Ù°í Çؼ­ ÇÒ ¼ö ÀÖ´Â Àϵµ ¾Æ´Ï°í, ±×¾ß¸»·Î ¸¹Àº °í¹ÎÀ» ÅëÇؼ­ ¾ò¾îÁö´Â °æÇèÀÇ »ê¹°ÀÌ¶ó º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. µðÀÚÀÎ ÆÐÅÏÀ» Àß °øºÎÇغ¸¸é, ¸í½ÃÀûÀ¸·Î Àß µå·¯³ª ÀÖÁö´Â ¾ÊÁö¸¸, Encapsulation°ú AbstractionÀÌ ÁÁÀº °´Ã¼ÁöÇ⠽ýºÅÛÀ» µðÀÚÀÎ ÇϱâÀ§Çؼ­ ³ë·ÂÇÑ ¼±¹èµéÀÇ ±ÍÁßÇÑ °æÇèÀ» °øÂ¥·Î ¾òÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.  GoFÃ¥ÀÇ ³»¿ë¸¸ ´ëÃæ º¸Áö ¸»°í, Á÷Á¢ ÀÚ½ÅÀÌ ÇÏ°í ÀÖ´Â ÀÏ¿¡ µðÀÚÀÎ ÆÐÅÏÀ» »ç¿ëÇØ º¸±â ¹Ù¶õ´Ù.

Âü°í ¹®Çå

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

[2] Perdita Stevens, Using UML, Updated Edition, Addison-Wesley, 2000.  

[3] John Vlissides, Pattern Hatching: Design Patterns Applied, Addison-Wesley, 1998.  

 


(±Û Èıâ)

Âü ¿À·£ ¸¸¿¡ ±ÛÀ» ½á º¾´Ï´Ù. Á¦°¡ ¾´ ±ÛÀ» ²Ä²ÄÈ÷ Àо½Ã°í ´õ ÁÁÀº ¾ÆÀ̵ð¾î¸¦ Áֽô ºÐµéµµ °è½Ã°í, Àß ¸øµÈ °÷À» Áý¾î Áֽô ºÐµéµµ °è½Ê´Ï´Ù. Á¦°¡ Á» °ÔÀ»·¯¼­ »¡¸®»¡¸® ±× ³»¿ëµéÀ» ¼ö·ÅÇÏÁö ¸øÇÑ Á¡ÀÌ ÀÖÁö¸¸, ¾ÕÀ¸·Îµµ Á¦ ±ÛÀÇ ³»¿ë¿¡ ´ëÇÑ ÁÁÀº ÁöÀû ºÎŹµå¸³´Ï´Ù. ^(^

 


ÀÌ ±Û¿¡»ðÀÔµÈ Å¬·¡½º ´ÙÀ̾î±×·¥Àº ¡°Plastic Software¡±ÀÇ UML ¸ðµ¨¸µ ÅøÀÎ ¡°PLASTIC 3.0¡±À» ÀÌ¿ëÇÏ¿©±×·È´Ù.

 


 oonewsletter - 2001/10/8