IBM Korea Skip to main content
       IBM Ȩ    |  Á¦Ç° & ¼­ºñ½º  |  °í°´Áö¿ø & ´Ù¿î·Îµå  |  È¸¿ø°¡ÀÔ  

Diagnosing Java Code : ±íÀÌ ¿ì¼± Visitor¿Í broken dispatches
¸ñ Â÷:
Composite ÆÐÅÏ
Visitor ÆÐÅÏ
VIsitor°¡ ÀûÇÕÇÏÁö ¾ÊÀ» ¶§
±íÀÌ ¿ì¼± Visitor ÆÐÅÏ
º¹ÀâÇÑ °èÃþ
ÁÖÀÇ»çÇ×
Âü°í ÀÚ·á
ÇÊÀÚ ¼Ò°³
±â»ç¿¡ ´ëÇÑ Æò°¡
°ü·Ã dW ¸µÅ©:
Broken Dispatch ¹ö±× ÆÐÅÏ
Æ©Å丮¾ó: ÀÚ¹Ù ¼³°è ÆÐÅÏ
US ¿ø¹® Àбâ
Visitor ÆÐÅÏ º¯Á¾À¸·Î ÄÚµå °£°á¼º Çâ»ó


Eric E. Allen
¹Ú»ç °úÁ¤, ÀÚ¹Ù ÇÁ·Î±×·¡¹Ö ¾ð¾î ÆÀ, Rice ´ëÇб³
2002³â 1¿ù

À̹ø "Diagnosing Java Code" ¿¬Àç¿¡¼­ Eric AllenÀº Visitor ÆÐÅÏÀÇ ÇÑ º¯ÇüÀÎ ±íÀÌ ¿ì¼± visitor (depth-first visitors)¸¦ »ç¿ëÇØ ¿©·¯ºÐ ÄÚµåÀÇ °£°á¼ºÀ» ³ôÀÌ´Â °ÍÀÌ ¾î¶»°Ô °¡´ÉÇÑÁö¸¦ ¼³¸íÇÑ´Ù. ±×´Â ±â¹ýÀ» ¼³¸íÇÏ°í ÀÕÁ¡°ú ÁÖÀÇÁ¡À» ³íÀÇÇÏ¸ç »ç¿ë½Ã ³ªÅ¸³ª´Â ¹ö±× ÆÐÅÏ¿¡ ´ëÇØ µ¶Àڵ鿡°Ô °æ°íÇÏ°í ±íÀÌ ¿ì¼± visitorÀÇ Æ¯Á¤ ½Ç·Ê¸¦ º¸¿©ÁÙ °ÍÀÌ´Ù. ÀÌ ±ÛÀ» ÀÐÀº ÈÄ ¿©·¯ºÐÀº ÄÚµùÇÒ ¶§ µµ¿òÀÌ µÇµµ·Ï ±íÀÌ ¿ì¼± visitors¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» ÀÌÇØÇÏ°Ô µÉ °ÍÀÌ°í ÀÌ ±â¹ýÀ» Àû¿ëÇÒ ¶§ÀÇ ÇÔÁ¤¿¡ ´ëÇؼ­µµ ¾Ë°Ô µÉ °ÍÀÌ´Ù.

¼³°è ÆÐÅÏÀº ÃÖÀûÀ¸·Î È°¿ëÇÒ °æ¿ì ÇÁ·ÎÁ§Æ®ÀÇ °£´ÜÇÑ ¼³°è¸¦ ½Å¼ÓÇÏ°Ô ¼öÇàÇϴµ¥ Å« µµ¿òÀÌ µÉ ¼ö ÀÖ´Ù. ±×·¯³ª ƯÁ¤ »óȲ¿¡¼­ ¼³°è ÆÐÅÏÀ» ±¸ÇöÇÏ´Â °¡Àå °£´ÜÇÑ ¹æ¹ýÀÌ Ç×»ó ¸íÈ®ÇÑ °ÍÀº ¾Æ´Ï´Ù. °ÅÀ§¸¦ ±Á´Âµ¥´Â ÇÑ°¡Áö ÀÌ»óÀÇ ¹æ¹ýÀÌ ÀÖ´Ù. À̹ø ´Þ¿¡ ¿ì¸®´Â ÀϹÝÀûÀÎ µðÀÚÀÎ ÆÐÅÏÀ» Àû¿ëÇÏ¿© °£´ÜÇÏ°í ª°í °­·ÂÇÑ Äڵ带 ¸¸µå´Â ¸î °¡Áö ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æ º¸ÀÚ.

¿ì¼± ¿©·¯ ´Ù¸¥ »óȲ¿¡ Àû¿ëµÉ ¼ö ÀÖ´Â µÎ°³ÀÇ ÆÐÅÏÀ» »ìÆ캸ÀÚ. º» ÅäÇÈ¿¡ ´ëÇÑ ¼¼¹ÌÀÚ ÀÚ·á(Âü°íÀÚ·á)ÀÎ "¼³°è ÆÐÅÏ (Erich Gamma, "Gang of Four"¶ó°íµµ ¾Ë·ÁÁ® ÀÖÀ½)"¿¡¼­ ³íÀÇµÈ ¸ðµç ¼³°è ÆÐÅÏ Áß¿¡¼­ ³ª´Â °¡Àå ³Î¸® Àû¿ëµÇ´Â ÆÐÅÏÀÌ Composite¿Í Visitor ÆÐÅÏÀ̶ó´Â »ç½ÇÀ» ¹ß°ßÇß´Ù.

ÀÌ µÎ ÆÐÅÏÀ» Á» ´õ ÀÚ¼¼È÷ »ìÆ캸ÀÚ.

Composite·Î ¹Ýº¹ÀûÀÎ µ¥ÀÌÅÍ À¯Çü ÁöÁ¤Çϱâ

¿Ö Composite ÆÐÅÏÀÌ À¯¿ëÇÑÁö´Â ½±°Ô ¾Ë ¼ö ÀÖ´Ù. Composite ÆÐÅÏÀº ¹Ýº¹ÀûÀ¸·Î Á¤ÀǵǴ µ¥ÀÌÅÍ À¯ÇüÀ» ÁöÁ¤ÇÏ´Â °´Ã¼ ÁöÇâÀû ¹æ¹ýÀÌ´Ù. ÀÌ·± ±âȸ´Â ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÇ ¸ðµç °úÁ¤ Áß¿¡ µîÀåÇÑ´Ù.

¹Ýº¹ÀûÀ¸·Î Á¤ÀÇµÈ °´Ã¼ À¯Çü¿¡ ´ëÇØ ÀÛ¾÷ÇÒ ¼ö ÀÖ´Â °ÍÀº ¼ÒÇÁÆ®¿þ¾î ¿£Áö´Ï¾î¸µ (¸»ÇÏÀÚ¸é, Á¤ÇüÈ­µÈ »óÅÂÀÇ ±â°è·ÎºÎÅÍ ½Ã½ºÅÛÀÌ °³¹ßµÇ´Â µðÁöÅÐ ¼³°è¿Í ¹Ý´ëµÇ´Â °³³ä)ÀÇ °¡Àå µÎµå·¯Áø Ư¡ Áß ÇϳªÀÌ´Ù.

Visitor·Î Ŭ·¡½º °èÃþ È®ÀåÇϱâ

Visitor ÆÐÅÏÀÌ ±×·¸°Ô ±¤¹üÀ§ÇÏ°Ô Àû¿ëµÇ´Â ÀÌÀ¯ Áß »ó´ç ºÎºÐÀº Composite ÆÐÅÏÀ» º¸¿ÏÇÑ´Ù´Â »ç½Ç ¶§¹®ÀÌ´Ù..

Visitors´Â ±âÁ¸ Composite Ŭ·¡½º °èÃþÀÇ ±â´ÉÀ» ±× °èÃþ ³»ÀÇ Å¬·¡½º¸¦ ½ÇÁ¦·Î ¼öÁ¤ÇÏÁö ¾Ê°íµµ È®ÀåÇÏ´Â ¹æ¹ýÀ¸·Î Á¾Á¾ »ç¿ëµÈ´Ù. ±×·¯³ª VIsitorsÀÇ ±â´ÉÀº À̺¸´Ù ÈξÀ ¸¹´Ù.

VisitorµéÀº Ŭ·¡½º °èÃþÀÇ ±â´É Áß ÀϺθ¦ Ŭ·¡½º ÀÚü·ÎºÎÅÍ ºÐ¸®ÇÒ ¼ö ÀÖµµ·Ï µÇ¾î Àֱ⠶§¹®¿¡, Ŭ·¡½ºÀÇ º»ÁúÀûÀÎ ºÎºÐÀ̶ó°í °£ÁÖÇϱ⿣ °³³äÀûÀ¸·Î Á» ¾î»öÇÑ ±â´ÉÀÌ ÀÖ´Â ¸ðµç Á¾·ùÀÇ ¼³Á¤¿¡ »ç¿ëµÉ ¼ö ÀÖ´Ù.

Visitor°¡ ÀÚÁÖ ³ªÅ¸³ª´Â ÈçÇÑ °æ¿ì°¡ º¹ÇÕ µ¥ÀÌÅÍ ±¸Á¶¸¦ ¹Ýº¹ÀûÀ¸·Î µû¶ó ³»·Á°¥ ¶§ÀÌ´Ù. ¿¹¸¦ µé¾î ÀÌÁø¹ýÀû Æ®¸® ±¸Á¶¸¦ °¡Áø ÇϳªÀÇ Å¬·¡½º °èÃþÀÌ ÀÖ°í, ÇϳªÀÇ Æ®¸®¿¡¼­ ¾î¶² ³ëµå°¡ 0(Zero)°ªÀ» °¡Áö°í ÀÖ´ÂÁö¸¦ ÆǺ°ÇÏ´Â Visitor°¡ ÀÖ´Ù°í »ý°¢ÇØ º¸ÀÚ.

Listing 1. visitor°¡ µé¾î ÀÖ´Â ÀÌÁø¹ýÀû Æ®¸®


abstract class Tree {
  public abstract Boolean accept(TreeVisitor that);
}

class Leaf extends Tree {
  public static final Leaf ONLY = new Leaf();

  public Boolean accept(TreeVisitor that) {
    return that.forLeaf(this);
  }
}

class Branch extends Tree {

  public int value;
  public Tree left;
  public Tree right;

  public Branch(int _value, Tree _left, Tree _right) {
    this.value = _value;
    this.left = _left;
    this.right = _right;
  }

  public Boolean accept(TreeVisitor that) {
    return that.forBranch(this);
  }
}

interface TreeVisitor {
  public Boolean forLeaf(Leaf that);
  public Boolean forBranch(Branch that);
}

class ZeroFinder implements TreeVisitor {
  public Boolean forLeaf(Leaf that) {
    return new Boolean(false);
  }

  public Boolean forBranch(Branch that) {
    if (that.value == 0) { return new Boolean(true); }

    boolean foundInLeft = that.left.accept(this).booleanValue();
    boolean foundInRight = that.right.accept(this).booleanValue();

    return new Boolean(foundInLeft || foundInRight);
  }
}

ÀÌ·¸°Ô 0(Zero)°ªÀ» ã´Â ±â´ÉÀ» Tree Ŭ·¡½º·ÎºÎÅÍ ºÐ¸®ÇÏ¿© for*() ¸Þ¼Òµå("*"´Â "ÀÙ"À̳ª "°¡Áö"¸¦ ³ªÅ¸³»´Â ¿ÍÀϵåÄ«µåÀÌ´Ù)¿¡ µÒÀ¸·Î½á ¿ì¸®´Â ´ÙÀ½rhk rkxdms ÀÌÁ¡À» ¾ò´Â´Ù.

  • ÀÌ Å¬·¡½ºµéÀÌ Ä¿Áö´Â °ÍÀ» ¹æÁöÇÑ´Ù. ¸¸¾à ¿ì¸®°¡ »õ·Î¿î ±â´ÉÀÌ ÇÊ¿äÇÒ ¶§¸¶´Ù Ŭ·¡½º¿¡ »õ ¸Þ¼Òµå¸¦ Ãß°¡ÇÑ´Ù¸é Ŭ·¡½ºµéÀº ½±»ç¸® Èǽ Ä¿Á®¹ö¸± °ÍÀÌ´Ù.
  • 0(Zero)À» ã´Â ±â´ÉÀ» ¸ðµÎ ÇÑ °÷¿¡ µÎ¾î À¯Áöº¸¼ö°¡ ´õ ½¬¿öÁø´Ù.

Visitor°¡ ÀûÀýÄ¡ ¾ÊÀ» ¶§

Gang of Four°¡ ¾ð±ÞÇßµíÀÌ, Visitor¸¦ »ç¿ëÇÒ ¶§ÀÇ ÁÖµÈ ´ÜÁ¡Àº º¹ÇÕ °èÃþ¿¡ »õ·Î¿î Ŭ·¡½ºµéÀ» Ãß°¡ÇϱⰡ Á¶±Ý ´õ Èûµé¾îÁø´Ù´Â °ÍÀÌ´Ù. ÀÌ°ÍÀº °ð VisitorµéÀº º¹ÇÕ °èÃþÀÌ º¯°æµÇÁö ¾ÊÀ» °ÍÀ¸·Î ¿¹»óµÇ´Â °æ¿ì¿¡ »ç¿ëÇÏ´Â °ÍÀÌ ÃÖ¼±À̶ó´Â ¾ê±â´Ù. (¹°·Ð "È®Àå Visitor ÆÐÅÏ"°ú °°ÀÌ ÀÌ°ÍÀ» µ¹¾Æ°¡´Â ¹æ¹ýµéÀÌ ÀÖ±â´Â ÇÏ´Ù)

±×·¸Áö¸¸ ¶Ç ´Ù¸¥ Å« ´ÜÁ¡ÀÌ ÀÖ´Ù. º¹ÇÕ °èÃþ³»ÀÇ ¸¹Àº Ŭ·¡½ºµéÀÌ µ¿ÀÏÇÑ ¹æ½ÄÀ¸·Î 󸮵Ǵ °æ¿ì °¢°¢ÀÇ Å¬·¡½º³»¿¡ µÑ ¶§º¸´Ù Visitor³»¿¡ µÑ ¶§ Äڵ尡 ´õ Ä¿Áú °ÍÀÌ´Ù. (Ŭ·¡½º ³»¿¡ À§Ä¡½Ãų °æ¿ì, °£´ÜÈ÷ µðÆúÆ® ±¸Çö ³»¿ëÀ» ºÎ¸ð Ŭ·¡½º¿¡ µÑ ¼ö Àֱ⠶§¹®ÀÌ´Ù)

´ÙÇེ·´°Ôµµ ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇØ°áÇÒ »Ó¸¸ ¾Æ´Ï¶ó ½ÇÁ¦·Î ¸¹Àº °æ¿ì °¢°¢ÀÇ Å¬·¡½º¿¡ µÑ ¶§º¸´Ù Äڵ带 ÈξÀ ´õ °£´ÜÇÏ°Ô ¸¸µé ¼ö ÀÖ°Ô ÇÏ´Â ÀÏ¹Ý VisitorsÀÇ º¯Á¾ÀÌ ÀÖ´Ù. ¿ì¸®´Â ÀÌ·¯ÇÑ º¯Á¾À» "±íÀÌ ¿ì¼± Visitor ÆÐÅÏ"À̶ó°í ºÎ¸¥´Ù.

±íÀÌ ¿ì¼± Visitor ÆÐÅÏ

±íÀÌ ¿ì¼± Visitor ÆÐÅÏ µÚ¿¡ ±ò¸° »ý°¢Àº ´ÙÀ½°ú °°´Ù: µ¥ÀÌÅÍ ±¸Á¶¸¦ ¹Ýº¹ÀûÀ¸·Î µû¶ó ³»·Á°¡´Â ´ëºÎºÐÀÇ VisitorµéÀº ±íÀÌ ¿ì¼±ÀÇ ¹æ½ÄÀ¸·Î À̸¦ ¼öÇàÇÑ´Ù. ÀÌ°ÍÀº VisitorµéÀÌ ³ëµå ÀÚü¸¦ ¹æ¹®Çϱâ Àü¿¡ ÁÖ¾îÁø (ÀÙÀº ¾Æ´Ï°í) ³ëµåÀÇ ÀÚ½Ä ³ëµå¸¦ ¹æ¹®ÇÑ´Ù´Â ÀǹÌÀÌ´Ù.

±×·¯¹Ç·Î ¿ì¸®´Â visitor Ãß»ó Ŭ·¡½ºÀÇ for* ¸Þ¼Òµå ³»¿¡ ±íÀÌ ¿ì¼±ÀÇ Å½»öÀ» ±¸ÇöÇÒ ¼ö ÀÖ°í, ±×¸®°í ³ª¼­ °¢°¢ÀÇ µ¥ÀÌÅÍ À¯Çü¿¡ ´ëÇØ ÇÏÀ§ ³ëµåµéÀÇ ¹æ¹® °á°ú¸¦ °áÇÕ½ÃÅ°´Â ¹æ¹ý¿¡ °üÇØ ±¸Ã¼ÀûÀÎ ±¸Çö »ó¼¼¸¦ ´Ü¼øÈ÷ ±â¼úÇϱ⸸ ÇÏ¸é µÈ´Ù. ÀÌ·¯ÇÑ ±â¼ú ³»¿ëÀº ÇÏÀ§ ³ëµåµé¿¡ ´ëÇÑ ¹æ¹® °á°ú¸¦ ¸Å°³º¯¼ö·Î Çϴ Ư¼öÇÑ for*Only() ¸Þ¼Òµå ³»¿¡ µÐ´Ù.

¿¹¸¦ µé¾î, Listing 2´Â ¿ì¸®ÀÇ ÀÌÁø¹ýÀû Æ®¸®µé¿¡ ´ëÇØ ±íÀÌ ¿ì¼±ÀÇ Visitor¸¦ ÀçÀÛ¼ºÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁØ´Ù.

Listing 2. ±íÀÌ ¿ì¼± Visitor


abstract class DepthFirstTreeVisitor implements TreeVisitor {

  public abstract Boolean forLeafOnly(Leaf that);
  public abstract Boolean forBranchOnly(Branch that,
                                        Boolean left_result,
                                        Boolean right_result);

  public Boolean forLeaf(Leaf that) {
    return forLeafOnly(that);
  }

  public Boolean forBranch(Branch that) {
    Boolean left_result = that.left.accept(this);
    Boolean right_result = that.right.accept(this);

    return forBranchOnly(that, left_result, right_result);
  }
}

ÀÌÁ¦ ¿ì¸®´Â Listing 3¿¡ ³ªÅ¸³­ °Í°ú °°ÀÌ ¿ì¸®ÀÇ ZeroFinder Visitor¸¦ ÀçÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.

Listing 3. Àç¹æ¹®µÈ ZeroFinder


abstract class DepthFirstTreeVisitor implements TreeVisitor {

class DepthFirstZeroFinder extends DepthFirstTreeVisitor {
  public Boolean forLeafOnly(Leaf that) {
    return new Boolean(false);
  }

  public Boolean forBranchOnly(Branch that, 
		               Boolean left_result, 
                               Boolean right_result) 
  {
    if (that.value == 0) { return new Boolean(true); }
    return new Boolean(left_result.booleanValue() || 
                       right_result.booleanValue());
  }
}

ÀÌ·Î½á ¿ì¸®´Â ±¸Ã¼ÀûÀÎ Visitor·ÎºÎÅÍ ±íÀÌ ¿ì¼± Ž»öÀÇ º¹ÀâÇÔÀ» ¸¹Àº ºÎºÐ ²ôÁý¾î³»¾î (°øÀ¯µÇ´Â) Ãß»ó ºÎ¸ð Ŭ·¡½º·Î Áý¾î³Ö¾ú´Ù. ¶ÇÇÑ ±íÀÌ ¿ì¼±ÀÇ Visitor ±¸ÇöÀÚ´Â °¢ À¯Çü¿¡ ´ëÇØ ¸ðµç º¸À¯ ÄÄÆ÷³ÍÆ®µéÀ» ½±°Ô »ç¿ëÇÒ ¼ö ÀÖ°Ô µÇ¾úÀ» °ÍÀÌ´Ù.(for*Only()¸Þ¼ÒµåÀÇ ¼­¸í¿¡¼­)

º¹ÇÕ °èÃþÀº ¾î¶²°¡?

ÀÌ°ÍÀº ÀÌ °£´ÜÇÑ º¹ÇÕ °èÃþ¿¡ ´ëÇØ ¿ì¸®°¡ ÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ±×·¯³ª ´õ º¹ÀâÇÑ Å¬·¡½º °èÃþµé¿¡ ´ëÇؼ­ ¿ì¸®´Â ´õ ¸¹Àº ÀÏÀ» ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¸¹Àº Ŭ·¡½º¸¦ °¡Áø º¹ÇÕ °èÃþ¿¡ ´ëÇØ ÁÖ¾îÁø Visitor´Â Á¾Á¾ ¸¹Àº °æ¿ì¸¦ °øÅëµÈ (ȤÀº Æò¹üÇÑ) ¹æ¹ýÀ¸·Î ó¸®ÇÒ °ÍÀÌ´Ù. ÀÌ°ÍÀº Visitor°¡ ÇÑ ½ÖÀÇ instanceof È®ÀÎ ÀÛ¾÷µéÀ» ´ë½ÅÇÒ ¼ö ÀÖÀ» ¶§ ƯÈ÷ ±×·¸´Ù. ÀÌ °æ¿ìµé¿¡ À־´Â ¿ì¸®´Â °£´ÜÇÏ°Ô defaultCase()¶ó´Â Ãß»ó ¸Þ¼Òµå¸¦ È£ÃâÇÏ´Â for*Only() ¸Þ¼ÒµåÀÇ µðÆúÆ® ±¸ÇöÀ» Á¦°øÇÒ ¼ö ÀÖ´Ù.

Listing 4. Ãß°¡µÈ µðÆúÆ® ¿¹

abstract class DepthFirstTreeVisitor implements TreeVisitor {

  public abstract Boolean defaultCase(Tree that);

  public Boolean forLeafOnly(Leaf that) {
    return defaultCase(that);
  }

  public Boolean forBranchOnly(Branch that,
                               Boolean left_result,
                               Boolean right_result)
  {
    return defaultCase(that);
  }
  ...
}

ÀÌÁ¦ ÀÌ¿Í °°ÀÌ º¹ÀâÇÑ °èÃþ¿¡ ±íÀÌ ¿ì¼± Visitor¸¦ ±¸ÇöÇÒ ¶§, ¿ì¸®´Â ´ÜÁö µðÆúÆ®·Î 󸮵ÇÁö ¾Ê´Â °æ¿ìµé¿¡ ´ëÇØ Äڵ带 ÁöÁ¤Çϱ⸸ ÇÏ¸é µÈ´Ù.

º¹ÇÕ °èÃþÀÌ ÇϳªÀÇ Ãþº¸´Ù ´õ ±íÀ» ¶§ ¿ì¸®´Â ¶ÇÇÑ °èÃþÀÇ °¢°¢ÀÇ ÇÏÀ§ Æ®¸®¿¡ ´ëÇØ º°°³ÀÇ µðÆúÆ® ¸Þ¼Òµå¸¦ ÁöÁ¤ÇÏ°í ½ÍÀ»Áö ¸ð¸¥´Ù. ÀÌ·¯ÇÑ µðÆúÆ® ¸Þ¼Òµå´Â ºÎ¸ð Ŭ·¡½ºÀÇ µðÆúÆ® ¸Þ¼Òµå¸¦ ´Ü¼øÈ÷ È£ÃâÇϵµ·Ï Á¤ÀÇµÉ ¼ö ÀÖ´Ù. ±×·¯³ª ±×µéÀº ÇÊ¿äÇÑ °æ¿ì ¹«½ÃµÉ ¼ö ÀÖ´Ù.

ÀÏ´Ü À̸¦ ¼öÇàÇϸé ÀÏ¹Ý VisitorÀÇ ¸ðµç ÀåÁ¡À» À¯ÁöÇϸ鼭 º¹ÇÕ Å¬·¡½º ³»¿¡ ±â´ÉÀ» Æ÷ÇÔ½ÃÅ°´Â °£ÆíÇÔµµ ¾òÀ» ¼ö ÀÖ´Ù.

¹°·Ð °æ°í »çÇ×µµ ÀÖ´Ù.

¸î°¡Áö °æ¿ì¿¡¸¸ ±íÀÌ ¿ì¼±À¸·Î µû¶ó ³»·Á°¡´Â Visitor¿¡°Ôµµ ¿ì¸®´Â ±íÀÌ ¿ì¼± Vsitor¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿ì¸®´Â ±íÀÌ ¿ì¼±À» Àû¿ëÇÏ°í ½ÍÁö ¾ÊÀº ±×·¯ÇÑ for*() ¸Þ¼Òµå(for*Only() ¸Þ¼Òµå¿¡ ´ëÀÀµÊ)¸¦ ´ÜÁö ¹«½ÃÇÏ¸é µÈ´Ù.

±×·¯³ª ÀÌ ¹æ½Ä¿¡´Â ÇϳªÀÇ ÁÖÀÇ»çÇ×ÀÌ ÀÖ´Ù. ÀÌ ¹æ½Ä¿¡¼­´Â broken dispatches¸¦ ¸¸³ª±â°¡ ½±´Ù. ±â¾ïÇϴ°¡? Broken Dispatch ¹ö±× ÆÐÅÏÀº ºÎ¸ð Ŭ·¡½º¿¡¼­ÀÇ ±¸ÇöÀ» ¹«½ÃÇϱ⺸´Ù´Â ÇÑ ¸Þ¼Òµå¸¦ ¿ì¿¬È÷ ¿À¹ö·ÎµåÇÒ ¶§ ³ªÅ¸³­´Ù. ±íÀÌ ¿ì¼± Visitor¿¡¼­´Â ƯÈ÷ ³ªÅ¸³ª±â ½±´Ù.

ºÎ¸ð Ŭ·¡½ºÀÇ for*()¸Þ¼Òµå (for*Only()¸Þ¼Òµå°¡ ¾Æ´Ñ) Áß Çϳª¸¦ ¹«½ÃÇÏ·Á ÇÑ´Ù°í °¡Á¤ÇØ º¸ÀÚ. ÀÌ for*()¸Þ¼ÒµåÀÇ ¼­¸íÀº ±×°ÍÀÌ ÀÛµ¿ÇÏ´Â ³ëµå´Â ÃëÇÏÁö¸¸, for*Only()¸Þ¼Òµå´Â ´Þ¸® ÇÏÀ§ ³ëµå ¹æ¹® °á°ú´Â ÃëÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. ¿ì¸®°¡ for*()¸Þ¼Òµå¿Í for*Only()¸Þ¼Òµå¸¦ µÑ´Ù ¾²°í Àֱ⠶§¹®¿¡ À̸¦ »ý·«ÇÏ°í for*()¸Þ¼Òµå Áß ÇϳªÀÇ À̸§À¸·Î for*Only()¸¦ ¿ì¿¬È÷ ¾²´Â °ÍÀ» »ó»óÇϱâ¶õ ¾î·ÆÁö ¾Ê´Ù.

±×·¸°Ô Çϸé ÄÚµå´Â ¹®Á¦ ¾øÀÌ ÄÄÆÄÀϵǰÚÁö¸¸, ¿ì¸®´Â for*() ±â¹ýÀ» ¹«½ÃÇϴµ¥ ½ÇÆÐÇÏ°Ô µÉ °ÍÀÌ´Ù. ´ë½Å for*Only() ¸Þ¼Òµå¸¦ ´Ù¸¥ ¼­¸íÀ» °¡Áø »õ·Î¿î ¸Þ¼Òµå·Î ¿À¹ö·ÎµåÇÒ °ÍÀÌ´Ù.

Ãß°¡ÀûÀ¸·Î, ÀÌ »õ·Î¿î for*Only() ¸Þ¼Òµå´Â °áÄÚ È£ÃâµÇÁö ¾ÊÀ» °ÍÀÌ´Ù. ÀÌ¿Í °°Àº Broken Dispatch´Â ÃßÀûÇϱⰡ ¾î·Á¿î ¸Å¿ì ÀáÇ༺ÀÇ ¹ö±×ÀÌ´Ù. ŸÀÔ °Ë»ç±â·Î´Â ÀÌ ¹ö±×¸¦ Àâ¾Æ ³»Áö ¸øÇÒ °ÍÀÌ°í , ÀÌ ¹ö±×°¡ Á¸ÀçÇÑ´Ù Çصµ ¿©·¯ºÐÀº À̵éÀÌ ¾ðÁ¦ ½ÇÁ¦·Î ¿¡·¯¸¦ Ç¥½ÃÇÒÁö ¾ËÁö ¸øÇÒ °ÍÀÌ´Ù. ÃÖ¾ÇÀÇ °æ¿ì Broken Dispatch´Â ÀÌÄ¡¿¡´Â ¿Ïº®ÇÏ°Ô ¸ÂÁö¸¸ ¿ÏÀüÈ÷ À߸øµÈ ¹æ½ÄÀ¸·Î ¿©·¯ºÐ ÇÁ·Î±×·¥ÀÇ ÇൿÀ» °£´ÜÈ÷ ¼öÁ¤ÇÒ °ÍÀÌ´Ù.

À̸¦ ¹æÁöÇϱâ À§ÇØ ³»°¡ ÇÒ ¼ö ÀÖ´Â ¸»Àº ÀÌ ¹ö±×°¡ Äڵ带 ÀÛ¼ºÇϱâ Àü¿¡ (±×¸®°í ÀÛ¼ºÇÏ´Â µ¿¾È) ´ÜÀ§ Å×½ºÆ®¸¦ ÀÛ¼ºÇÏ´Â °ÍÀÌ ¿Ö ½Ã°£À» ÁÙ¿©ÁÖ´ÂÁö, ±×¸®°í ÀÌ Å×½ºÆ®µéÀ» ¿Ö ÀÚÁÖ ½ÇÇà½ÃÄÑ¾ß ÇÏ´ÂÁö¸¦ º¸¿©ÁÖ´Â ¾ÆÁÖ ÈǸ¢ÇÑ ½Ç·Ê¶ó´Â °Í »ÓÀÌ´Ù.

ÀÌÁ¦ ¿©·¯ºÐÀº ±íÀÌ ¿ì¼± visitor°¡ ¿Ö ¸ÚÁøÁö, ±×¸®°í ±×µéÀÌ ¿©·¯ºÐÀ» ¾î¶»°Ô ±«·ÓÈú ¼ö ÀÖ´ÂÁö¸¦ ¾Ë°Ô µÇ¾ú´Ù. ³ª´Â ÀÌ ÆÐÅÏÀ» óÀ½ ³ª¿¡°Ô ¼Ò°³½ÃÄÑÁØ ¿ì¸® ½ÇÇè½ÇÀÇ ´ëÇпø»ýÀÎ Brian Stoler¿¡°Ô °¨»ç¸¦Ç¥ÇÏ°í ½Í´Ù. ±íÀÌ ¿ì¼± Visitor´Â JavaCC ¹®¹ýÀ¸·ÎºÎÅÍ º¹ÇÕ °èÃþ (±×¸®°í Visitor)À» ÀÚµ¿À¸·Î »ý¼º½ÃÄÑÁÖ´Â "ÀÚ¹Ù Æ®¸® ºô´õ"¿¡ ÀÇÇØ ±¸ÃàµÇ¾ú´Ù. ÀÌ µµ±¸´Â Âü°í ÀÚ·á ¿¡¼­ ¹«·á·Î ÀÌ¿ëÇÒ ¼öÀÖ´Ù.

Âü°í ÀÚ·á

  • Ç¥ÁØ Visitors´Â ÃÖÃÊÀÇ ¼³°è ÆÐÅÏ Ã¥ÀÎ ¼³°è ÆÐÅÏ : Àç»ç¿ë °¡´ÉÇÑ °´Ã¼ ÁöÇâ ¼ÒÇÁÆ®¿þ¾îÀÇ ¿ä¼Ò (Erich Gamma, Addison-Wesley 1995)¿¡¼­ ³íÀǵǾú´Ù. 1998³â ¾÷µ¥ÀÌÆ®º» ¿¡´Â »ùÇà ÄÚµå¿Í ºÙ¿©³Ö±â ÇÏ¿© ¾µ ¼ö ÀÖ´Â 23°³ÀÇ ÆÐÅÏÀÌ µé¾î ÀÖ´Ù.
  • ¼³°è ÆÐÅÏÀÌ »ý¼ÒÇÑ ºÐÀ̶ó¸é "ÀÚ¹Ù ¼³°è ÆÐÅÏ" (developerWorks, January 2002)·Î ½ÃÀÛÇÒ ¼ö ÀÖ´Ù. ÀÌ Ã¥Àº Áß¿äÇÏ°í À¯¿ëÇÑ °´Ã¼ ÁöÇâ ¼³°è¿Í °³¹ß °³³äÀ» ¼Ò°³ÇÏ°í ÀÖ´Ù.
  • Java Tree Builder ·Î ±íÀÌ ¿ì¼± VisitorÀ» ÀÚµ¿À¸·Î »ý¼ºÇ϶ó. ÀÌ µµ±¸´Â Java Compiler Compiler (JavaCC) Æļ­ »ý¼º±â¿Í ÇÔ²² »ç¿ëµÇ´Â ±¸¹® Æ®¸® ºô´õ·Î½á, ÆòÀÌÇÑ JavaCC ¹®¹ý ÆÄÀÏÀ» ÀԷ¹®À¸·Î ÃëÇØ ´ÙÀ½°ú °°Àº °ÍÀ» ÀÚµ¿À¸·Î »ý¼ºÇÑ´Ù.¹®¹ý³»ÀÇ productions¿¡ ±â¹ÝÇÑ ±¸¹® Æ®¸® Ŭ·¡½º ¼ÂÆ® (Visitor ¼³°è ÆÐÅÏÀ» »ç¿ëÇÏ¿©); µÎ°³ÀÇ ÀÎÅÍÆäÀ̽º (Visitor¿Í ObjectVisitor); µÎ °³ÀÇ ±íÀÌ ¿ì¼± Visitor (DepthFirstVisitor¿Í ObjectDepthFirst); °Ë»çÇÏ´Â µ¿¾È ±¸¹® Æ®¸®¸¦ ±¸ÃàÇϱâ À§ÇÑ ÀûÇÕÇÑ ÁÖ¼®À» °®Ãá JavaCC ¹®¹ý
  • Extensible Visitor ÆÐÅÏ¿¡ ´ëÇÑ Ãß°¡ Á¤º¸´Â "°´Ã¼ ÁöÇâ ¼³°è¿Í ±â´ÉÀû ¼³°è¸¦ ÅëÇÕÇÏ¿© Àç»ç¿ë¼º ³ôÀ̱â" (Shriram Krishnamurthi)À» ÂüÁ¶ÇÑ´Ù. ÀÌ µÎ ¹æ½ÄÀÇ ÀåÁ¡(±â´ÉÀû ¼³°èÀÇ Åø Ãß°¡¿Í °´Ã¼ ÁöÇâ ÇÁ·Î±×·¡¹ÖÀÇ µ¥ÀÌÅÍ ¼ÂÆ® È®Àå)¸¸ ÅëÇÕÇÑ º¹ÇÕ ¼³°è ÆÐÅÏÀÌ Á¦½ÃµÇ¾î ÀÖ´Ù.
  • JUnit À¥ »çÀÌÆ®: ÇÁ·Î±×·¥ Å×½ºÆ® ±â¹ý¿¡ °üÇÑ ¼ö¸¹Àº Èï¹ÌÀÖ´Â ÀÚ·á·ÎÀÇ ¸µÅ© Á¦°ø
  • Eric AllenÀÇ Diagnosing Java Code Ä÷³ Àüü
  • developerWorks Java technology zone: ÀÚ¹Ù °ü·Ã ÀÚ·á

ÇÊÀÚ ¼Ò°³
Eric AllenÀº Cornell ´ëÇп¡¼­ ÄÄÇ»ÅÍ °øÇÐ ¹× ¼öÇÐ Çлç ÇÐÀ§¸¦ ¹Þ¾ÒÀ¸¸ç Rice ´ëÇÐÀÇ ÀÚ¹Ù ÇÁ·Î±×·¡¹Ö ¾ð¾îÆÀ¿¡¼­ ¹Ú»ç °úÁ¤À» ¹â°í ÀÖ´Ù. ÇÐÀ§¸¦ ¸¶Ä¡±â À§ÇØ Rice ´ëÇÐÀ¸·Î µ¹¾Æ°¡±â Àü¿¡ EricÀº Cycorp »çÀÇ ¼±ÀÓ ÀÚ¹Ù ¼ÒÇÁÆ®¿þ¾î °³¹ßÀÚ¿´°í, ¶ÇÇÑ JavaWorldÀÇ ÀÚ¹Ù ÃʱÞÀÚ Åä·Ð Æ÷·³ÀÇ ÁøÇàÀÚÀ̱⵵ ÇÏ´Ù. ±×´Â ÀÚ¹Ù ¾ð¾î¿¡¼­ ¼Ò½º¿Í ¹ÙÀÌÆ®ÄÚµå ·¹º§ ¾çÂÊ¿¡¼­ÀÇ Àǹ̷ÐÀû ¸ðµ¨ °³¹ß°ú Á¤ÀûÀÎ ºÐ¼® Åø¿¡ °ü½ÉÀ» °¡Áö°í ÀÖ´Ù. EricÀº ¶ÇÇÑ ÀϹÝÀûÀÎ ·±Å¸ÀÓ À¯ÇüÀ» °¡Áø ÀÚ¹Ù ¾ð¾îÀÇ È®ÀåÆÇÀÎ NextGen ÇÁ·Î±×·¡¹Ö ¾ð¾îÀÇ ÄÄÆÄÀÏ·¯ °³¹ßÀ» µ½±âµµ Çß´Ù.



ÀÌ ±â»ç¿¡ ´ëÇÏ¿© ¾î¶»°Ô »ý°¢ÇϽʴϱî?

Á¤¸» ÁÁ´Ù (5) ÁÁ´Ù (4) ±×Àú±×·¸´Ù (3) ¼öÁ¤º¸¿ÏÀÌ ÇÊ¿äÇÏ´Ù(2) ÇüÆí¾ø´Ù (1)

  È¸»ç¼Ò°³  |  °³ÀÎÁ¤º¸ º¸È£Á¤Ã¥  |  ¹ý·ü  |  ¹®ÀÇ