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

Diagnosing Java Code: Run-on Initializer ¹ö±× ÆÐÅÏ
¸ñ Â÷:
Run-on initialization
run-ons¿¡¼­ ¹ß»ýÇÏ´Â ´Ù¸¥ ¿¡·¯µé
ÀÌ·¯Áöµµ Àú·¯Áöµµ ¸øÇÒ ¶§
¿¹¿Ü ¹ß»ý ¸Þ½îµå
À̵éÀ» °íÄ¡´Â °Íº¸´Ù ´õ ³´´Ù
Âü°í ÀÚ·á
ÇÊÀÚ ¼Ò°³
±â»ç¿¡ ´ëÇÑ Æò°¡
°ü·Ã dW ¸µÅ©:
À̵éÀ» °íÄ¡´Â °Íº¸´Ù ´õ ³´´Ù
Âü°í ÀÚ·á
ÇÊÀÚ ¼Ò°³r
±â»ç Æò°¡
US ¿ø¹® Àбâ
Also in the Web services zone:
¹ö±× ÆÐÅÏ: ¼Ò°³
Null Flag ¹ö±× ÆÐÅÏ
Diagnosing Java Code Ä÷³
developerWorks newsletter ±¸µ¶Çϱâ
 
Also in the Java zone:
Æ©Å丮¾ó
Åø ¹× Á¦Ç°
ÄÚµå ¹× ÄÄÆ÷³ÍÆ®
Articles
 
ÀÎÀÚ¸¦ °¡Áø »ý¼ºÀÚ¸¦ ÇÇÇÔÀ¸·Î½á ÀÌ ¹ö±×¸¦ ¹°¸®Ä¡±â


Eric E. Allen
¹Ú»ç °úÁ¤, ÀÚ¹Ù ÇÁ·Î±×·¡¹Ö ÆÀ, Rice University
2002³â 4¿ù

Column icon¿©·¯ºÐÀº Á¾Á¾ »ý¼ºÀÚ È£ÃâÀ» ÅëÇؼ­ »Ó ¾Æ´Ï¶ó ´Ù¾çÇÑ Çʵ带 ¼³Á¤Çϱâ À§ÇÑ ¸î °¡Áö ÈÄ¼Ó ÀÛ¾÷À» ÅëÇØ Å¬·¡½º¸¦ ÃʱâÈ­ÇÏ´Â Äڵ带 º»ÀûÀÌ ÀÖÀ» °ÍÀÌ´Ù. ±×·¯ÇÑ ÈÄ¼Ó ÀÛ¾÷µéÀº ºÒÇàÈ÷µµ ¹ö±×ÀÇ ¿Â»óÁöÀ̸ç, run-on initializationÀ̶ó´Â À¯ÇüÀÇ ¹ö±×¸¦ ÃÊ·¡ÇÑ´Ù. Eric AllenÀº run-on initializer ¹ö±×¸¦ °ËÅäÇÏ°í ÀÌ ¹ö±×¸¦ ÇÇÇØ¾ß ÇÏ´Â ÀÌÀ¯¿Í ¹æ¹ýÀ» ¼³¸íÇϸç, ÀÌ ¹ö±×°¡ °¡Á®¿Ã ¼ö ÀÖ´Â ÇÇÇظ¦ ÃÖ¼ÒÈ­ÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁØ´Ù.

Run-on initialization
´Ù¾çÇÑ ÀÌÀ¯ ¶§¹®¿¡ (´ëºÎºÐÀº ³ª»Û ÀÌÀ¯) ¿©·¯ºÐÀº Á¾Á¾ Ŭ·¡½º »ý¼ºÀÚ°¡ Ŭ·¡½ºÀÇ ¸ðµç Çʵ带 ¿Ã¹Ù·Î ÃʱâÈ­ÇÒ¸¸Å­ ÃæºÐÇÑ ÀÎÀÚ¸¦ °¡Áö°í ÀÖÁö ¾ÊÀº Ŭ·¡½º Á¤ÀǸ¦ º¸°Ô µÉ °ÍÀÌ´Ù. ±×·¯ÇÑ »ý¼ºÀÚ´Â ÇϳªÀÇ »ý¼ºÀÚ È£Ã⺸´Ù´Â ¿©·¯ ´Ü°è·Î (ÃʱâÈ­µÇÁö ¾ÊÀº ÇʵåÀÇ °ªÀ» ¼³Á¤ÇÏ´Â) ÀνºÅϽº¸¦ ÃʱâÈ­Çϴ Ŭ¶óÀ̾ðÆ® Ŭ·¡½ºµéÀ» ÇÊ¿ä·Î ÇÑ´Ù. ÀÌ·± ¹æ½ÄÀ¸·Î ÀνºÅϽº¸¦ ÃʱâÈ­ÇÏ´Â ÀýÂ÷¿¡¼­´Â ¿¡·¯°¡ ¹ß»ýÇϱ⠽¬¿îµ¥, ³ª´Â À̸¦ run-on initializationÀ̶ó°í ºÎ¸¥´Ù.ÀÌ ÀýÂ÷¿¡¼­ ³ª¿Â ¹ö±× À¯ÇüµéÀº À¯»çÇÑ Áõ»ó°ú Ä¡·áÃ¥À» °¡Áö°í ÀÖÀ¸¹Ç·Î, ¿ì¸®´Â À̵éÀ» Run-on Initializer ¹ö±× ÆÐÅÏÀ̶ó´Â ÇϳªÀÇ ÆÐÅÏÀ¸·Î ¹­À» ¼ö ÀÖ´Ù.

´ÙÀ½ Äڵ带 °ËÅäÇغ¸ÀÚ.

Listing 1. °£´ÜÇÑ run-on initialization

class RestrictedInt {
  public Integer value;
  public boolean canTakeZero;
  
  public RestrictedInt(boolean _canTakeZero) {
    canTakeZero = _canTakeZero;
  }
  
  public void setValue(int _value) throws CantTakeZeroException {
    if (_value == 0) {
      if (canTakeZero) {
        value = new Integer(_value);
      }
      else {
        throw new CantTakeZeroException(this);
      }
    }
    else {
      value = new Integer(_value);
    }
  }
}

class CantTakeZeroException extends Exception {
  
  public RestrictedInt ri;
  
  public CantTakeZeroException(RestrictedInt _ri) {
    super("RestrictedInt can't take zero");
    ri = _ri;
  }
}

class Client {
  public static void initialize() throws CantTakeZeroException {
    RestrictedInt ri = new RestrictedInt(false);
    ri.setValue(0);
  }
}

ºÒÇàÈ÷µµ, ÀÌ Å¬·¡½ºÀÇ ÀνºÅϽº¿¡ ´ëÇÑ ÃʱâÈ­ ÀýÂ÷´Â ¿¡·¯°¡ ³ª±â ½±´Ù. ¿©·¯ºÐÀº À§ÀÇ Äڵ忡¼­ µÎ¹ø° ÃʱâÈ­ ´Ü°è¿¡ ¿¹¿Ü°¡ ¹ß»ýÇß´Ù´Â °ÍÀ» ¹ß°ßÇßÀ» °ÍÀÌ´Ù. ±× °á°ú, ÀÌ ´Ü°è µÚ¿¡ ¼³Á¤µÇ¾ú¾î¾ß ÇÒ Çʵ尡 ¼³Á¤µÇÁö ¾Ê¾Ò´Ù.

±×·¯³ª ¹ß»ýÇÑ ¿¹¿Ü¿¡ ´ëÇÑ Ã³¸®ÀÚ´Â Çʵ尡 ¼³Á¤µÇÁö ¾Ê¾Ò´Ù´Â »ç½ÇÀ» ¾ËÁö ¸øÇÒ ¼ö ÀÖ´Ù. ¿¹¿Ü º¹±¸ ÀýÂ÷¿¡ ÀÖ¾î ¸¸ÀÏ ¿¹¿Ü ó¸®ÀÚ°¡ ¹®Á¦ÀÇ RestrictedIntÀÇ value Çʵ忡 Á¢±ÙÇÑ´Ù¸é, ±× ÀÚ½ÅÀÌ NullPointerException¿¡ ºüÁ®¹ö¸± ¼ö ÀÖ´Ù.

ÀÌ °æ¿ì ó¸®ÀÚ°¡ Á¸ÀçÇÏÁö ¾Ê´Â °Íº¸´Ù ´õ ³ª»Ú´Ù. ÃÖ¼ÒÇÑ Ã¼Å©µÈ ¿¹¿Ü´Â ±× ¿øÀο¡ ´ëÇÑ ¸î °¡Áö ´Ü¼­¸¦ °¡Áö°í ÀÖ´Ù. ±×·¯³ª NullPointerExceptionsÀº °ªÀÌ Ã³À½¿¡ ¿Ö null·Î ¼³Á¤µÇ¾ú´ÂÁö¿¡ °üÇØ °ÅÀÇ Á¤º¸¸¦ °¡Áö°í ÀÖÁö ¾Ê±â ¶§¹®¿¡ Áø´ÜÇϱⰡ ¾î·Æ±â·Î ¾Ç¸íÀÌ ³ô´Ù. ´õ±¸³ª À̵éÀº ÃʱâÈ­µÇÁö ¾ÊÀº Çʵ忡 Á¢±ÙÇÒ ¶§¸¸ ³ªÅ¸³­´Ù. ±×·¯ÇÑ Á¢±ÙÀº ¾Æ¸¶µµ ¹ö±×ÀÇ ¿øÀÎ (Áï óÀ½¿¡ Çʵ带 ÃʱâÈ­Çϴµ¥ ½ÇÆÐÇÑ °Í)À¸·ÎºÎÅÍ ¸Ö¸® ¶³¾îÁø ÁöÁ¡¿¡¼­ ÀÌ·ç¾îÁú °ÍÀÌ´Ù.

¹°·Ð run-on initialization ¹ö±×¿¡¼­ ¹ß»ýÇÒ ¼ö ÀÖ´Â ´Ù¸¥ ¿¡·¯µéµµ ÀÖ´Ù.

¹ß»ýÇÒ ¼ö ÀÖ´Â ´Ù¸¥ ¿¡·¯µé
¹ß»ýÇÒ ¼ö ÀÖ´Â ´Ù¸¥ ¿¡·¯µéÀº ´ÙÀ½°ú °°´Ù.

  • ÃʱâÈ­ Äڵ带 ÀÛ¼ºÇÏ´Â ÇÁ·Î±×·¡¸Ó´Â ÃʱâÈ­ ´Ü°èµé Áß Çϳª¸¦ »ðÀÔÇÏ´Â °ÍÀ» Àؾî¹ö¸± ¼ö ÀÖ´Ù.

  • ÃʱâÈ­ ´Ü°èµéÀº ¼ø¼­´ë·Î ½ÇÇàµÇ¾î¾ß ÇÒ ¼ö Àִµ¥, ÇÁ·Î±×·¡¸Ó°¡ À̸¦ ¸ð¸£°í ¼ø¼­ ¾øÀÌ ±¸¹®À» ½ÇÇà½Ãų ¼ö ÀÖ´Ù.

  • ÃʱâÈ­µÇ°í Àִ Ŭ·¡½º°¡ ¹Ù²ð ¼ö ÀÖ´Ù. »õ·Î¿î Çʵ尡 Ãß°¡µÇ°Å³ª ÀÌÀü Çʵ尡 »èÁ¦µÉ ¼ö ÀÖ´Ù. ±× °á°ú ¸ðµç Ŭ¶óÀ̾ðÆ®¿¡¼­ÀÇ ¸ðµç ÃʱâÈ­ Äڵ尡 Çʵ带 ¿Ã¹Ù·Î ¼³Á¤Çϱâ À§ÇØ ¼öÁ¤µÇ¾î¾ß ÇÑ´Ù. ¼öÁ¤µÈ ÄÚµåÀÇ »ó´ç¼ö°¡ À¯»çÇÏ°ÚÁö¸¸, ÇÑ copy¸¸ ºüÁ®µµ ¹ö±×°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. µû¶ó¼­ run-on initializers´Â rogue tiles ¹ö±× ÆÐÅÏÀÌ µÇ±â ½±´Ù. (Rogue Tile ¹ö±× ÆÐÅÏ¿¡ ´ëÇÑ ÇÊÀÚÀÇ ±Û ÂüÁ¶)

run-on initialization°ú °ü·ÃµÈ ¸ðµç ¹®Á¦µé ¶§¹®¿¡, ¸ðµç Çʵ带 ÃʱâÈ­ÇÏ´Â »ý¼ºÀÚ¸¦ Á¤ÀÇÇÏ´Â °ÍÀÌ ÁÁ´Ù. À§ÀÇ ¿¹Á¦¿¡¼­ RestrictedInt¿¡ ´ëÇÑ »ý¼ºÀÚ´Â ÀÚ½ÅÀÇ value Çʵ带 ÃʱâÈ­Çϱâ À§ÇØ int¸¦ ÃëÇØ¾ß ÇÑ´Ù. ¾î¶² Çʵ带 ÃʱâÈ­ÇÏÁö ¾ÊÀº ä µÎ´Â Ŭ·¡½ºÀÇ »ý¼ºÀÚ¸¦ Æ÷ÇÔ½Ãų¸¸ÇÑ ÁÁÀº ÀÌÀ¯¶õ °áÄÚ ¾ø´Ù. Ŭ·¡½º¸¦ óÀ½ºÎÅÍ ÀÛ¼ºÇÒ ¶§ ÀÌ°ÍÀº µû¸£±â¿¡ ±×·¸°Ô ¾î·Á¿î ¿øÄ¢Àº ¾Æ´Ï´Ù.

±×·¯³ª Ŭ·¡½º°¡ »ý¼ºÀÚ ³»ÀÇ ¸ðµç Çʵ带 ÃʱâÈ­ÇÏÁö ¾Ê´Â ´ë´ÜÀ§ÀÇ ÄÚµå ±â¹Ý¿¡ ´ëÇØ ÀÛ¾÷ÇØ¾ß ÇÒ ¶§ ±×¸®°í ÄÚµå Àü¹Ý¿¡ °ÉÃÄ run-on initializers°¡ ÀÖ´Â °æ¿ì¿¡´Â ¾î¶²°¡? ³ª´Â ÀÌ¿Í °°Àº »óȲÀ» ¿©·¯ ¹ø ¸¶ÁÖÃÆ´Ù.

ÀÌ·¯Áöµµ Àú·¯Áöµµ ¸øÇÒ ¶§

ºÒÇàÈ÷µµ, »ý¼ºÀÚ ³»ÀÇ ¸ðµç ÇʵåµéÀ» ÃʱâÈ­ÇÏÁö ¾Ê´Â Ŭ·¡½º¸¦ °¡Áø ·¹°Å½Ã ÄÚµå ±â¹Ý¿¡¼­ ÀÛ¾÷ÇÏ´Â °ÍÀº ´ëºÎºÐÀÇ ÇÁ·Î±×·¡¸Óµé¿¡°Ô ÈçÇÑ ÀÏÀÌ´Ù. ·¹°Å½Ã ÄÚµå ±â¹ÝÀÌ ±¤¹üÀ§Çϸç, ¹®Á¦ Àִ Ŭ·¡½º¿¡ Á¢±ÙÇϴ Ŭ¶óÀ̾ðÆ®°¡ ¸¹À»¼ö·Ï ¿©·¯ºÐÀº »ý¼ºÀÚ ¼­¸íÀ» ¼öÁ¤ÇÏ·Á µéÁö ¾ÊÀ» °ÍÀÌ´Ù. ƯÈ÷ ±×·¯ÇÑ Äڵ忡 ´ëÇÑ ´ÜÀ§ Å×½ºÆ®°¡ ºÎÁ·Çß´Ù¸é ´õ¿í ±×·¯ÇÒ °ÍÀÌ´Ù. ºÐ¸íÈ÷ ¿©·¯ºÐÀº ¹®¼­È­µÇÁö ¾ÊÀº ºÒº¯°ªÀ» ÁßÁö½ÃÅ°´Â °ÍÀ¸·Î ³¡¸Î°Ô µÉ °ÍÀÌ´Ù.

±×·¯ÇÑ »óȲ¿¡¼­ Á¾Á¾ ÃÖ»óÀÇ ¹æ¹ýÀº ·¹°Å½Ã Äڵ带 ¹ö¸®°í »õ·Î ½ÃÀÛÇÏ´Â °ÍÀÌ´Ù! ÀÌ ¸»Àº ¹ÌÄ£ ¼Ò¸®°°ÀÌ µé¸± ¼öµµ ÀÖÁö¸¸, ÀÌ¿Í °°Àº ÄÚµå ³»ÀÇ ¹ö±×¸¦ °íÄ¡´Âµ¥ µå´Â ½Ã°£ÀÌ ±×°ÍÀ» ÀçÀÛ¼ºÇÏ´Â µ¥ °É¸®´Â ½Ã°£º¸´Ù ´õ ¸¹¾ÆÁö±â ½±´Ù. ¿©·¯ ¹ø ³ª´Â ÀÌ¿Í °°Àº ¹®Á¦¸¦ °¡Áø ´ë´ÜÀ§ ·¹°Å½Ã Äڵ带 ºÙÀâ°í °í±ººÐÅõÇßÁö¸¸ °á±¹ óÀ½ºÎÅÍ »õ·Î ½ÃÀÛÇß´õ¶ó¸é ÇÏ°í ¹Ù¶ó°Ô µÇ¾ú´Ù.

±×·¯³ª Äڵ带 ¹ö¸®´Â °ÍÀ» ¼±ÅÃÇÒ ¼ö ¾øÀ» °æ¿ì ¿©·¯ºÐÀº ´ÙÀ½°ú °°Àº °£´ÜÇÑ ½ÇÇà ¹æ¹ýÀ» µµÀÔÇÔÀ¸·Î½á ¾Ö·¯°¡ ¹ß»ýÇÒ °¡´É¼ºÀ» Á¦¾îÇÏ·Á°í ½ÃµµÇÒ ¼ö ÀÖ´Ù.

  • Çʵ带 (nullÀÌ ¾Æ´Ñ) ±âº» °ªÀ¸·Î ÃʱâÈ­ÇÑ´Ù.
  • ¿©ºÐÀÇ »ý¼ºÀÚ¸¦ »ç¿ëÇϵµ·Ï Æ÷ÇÔ½ÃŲ´Ù.
  • Include an isInitialized method in the class. Ŭ·¡½º¿¡ isInitialized ¸Þ½îµå¸¦ Æ÷ÇÔ½ÃŲ´Ù.
  • Construct special classes to represent the default values. ±âº» °ªÀ» Ç¥ÇöÇϴ Ư¼ö Ŭ·¡½º¸¦ »ý¼ºÇÑ´Ù.

¿ì¸®°¡ ¿Ö ÀÌ ¹æ¹ýµéÀ» µû¶ó¾ß ÇÏ´ÂÁö »ìÆ캸ÀÚ.

Çʵ带 (nullÀÌ ¾Æ´Ñ) ±âº» °ªÀ¸·Î ÃʱâÈ­Çϱâ

Çʵ带 ±âº» °ªÀ¸·Î ä¿òÀ¸·Î½á ¿©·¯ºÐÀº ¿©·¯ºÐ Ŭ·¡½ºÀÇ ÀνºÅϽº°¡ ¾ðÁ¦µçÁö Àß Á¤ÀÇµÈ »óÅ·ΠÀÖÀ» °ÍÀÓÀ» º¸ÁõÇÒ ¼ö ÀÖ´Ù. ÀÌ·¯ÇÑ ¹æ¹ýÀº ¿©·¯ºÐÀÌ º°·Îµµ ´Ù¸£°Ô ÁöÁ¤ÇÏÁö ¾Ê´Â ÇÑ null °ªÀ» ÃëÇÒ ÂüÁ¶ À¯Çü¿¡°Ô ƯÈ÷ Áß¿äÇÏ´Ù.

¿Ö ±×·²±î? null °ªÀ» ºÒÇÊ¿äÇÏ°Ô »ç¿ëÇÏ¸é °á°úÀûÀ¸·Î NullPointerExceptionsÀÌ ¹ß»ýÇϱ⠶§¹®ÀÌ´Ù. NullPointerExceptionsÀº ³ª»Ú´Ù. ÇÑ °¡Áö ÀÌÀ¯¸¦ µéÀÚ¸é À̵éÀº ¹ö±×ÀÇ ½ÇÁ¦ ¿øÀο¡ ´ëÇØ °ÅÀÇ Á¤º¸¸¦ Á¦°øÇÏÁö ¾Ê´Â´Ù. ¶Ç ´Ù¸¥ ÀÌÀ¯´Â À̵éÀÌ ¹ö±×ÀÇ ½ÇÁ¦ ¿øÀÎÀ¸·ÎºÎÅÍ ¾ÆÁÖ ¸Ö¸® ¶³¾îÁø °÷¿¡ ³ªÅ¸³ª±â ½±´Ù´Â °ÍÀÌ´Ù.

¹«½¼ ¼ö¸¦ ½á¼­¶óµµ À̵éÀ» ÇÇÇϵµ·Ï ÇÑ´Ù. ¿©·¯ºÐÀÌ Å¬·¡½º°¡ ¾ÆÁ÷ ¿ÏÀüÈ÷ ÃʱâÈ­µÇÁö ¾Ê¾ÒÀ½À» ³ªÅ¸³»±â À§ÇØ nullÀ» »ç¿ëÇÏ°íÀÚ ÇÑ´Ù¸é Null Flag ¹ö±× ÆÐÅÏ¿¡ ´ëÇÑ ÇÊÀÚÀÇ ±ÛÀ» ÀÐÀ¸¸é µµ¿òÀÌ µÉ °ÍÀÌ´Ù.

¿©ºÐÀÇ »ý¼ºÀÚ Æ÷ÇÔ½ÃÅ°±â

Ãß°¡ÀûÀÎ »ý¼ºÀÚµéÀ» Æ÷ÇÔ½ÃÅ°¸é ¿©·¯ºÐÀº À̵éÀ» »õ·Î¿î ¹®¸Æ¿¡¼­ »ç¿ëÇÒ ¼ö Àִµ¥, . ÀÌ »õ·Î¿î ¹®¸Æ¿¡¼­´Â »õ·Î¿î run-on initialization ÀÛ¾÷ÀÌ ÀϾ ÇÊ¿ä°¡ ¾ø´Ù. ÀϺΠ¹®¸ÆµéÀº ÀÌÀÇ »ç¿ëÀÌ Á¦ÇѵǾîÀֱ⠶§¹®¿¡ ´Ù¸¥ ¹®¸Æµé¿¡¼­ ¶Ç´Ù½Ã ÃʱâÈ­½Ãų ÇÊ¿ä°¡ ¾ø±â ¶§¹®ÀÌ´Ù.

Ŭ·¡½º¿¡ isInitialized ¸Þ½îµå Æ÷ÇÔ½ÃÅ°±â

¿©·¯ºÐÀº ÀνºÅϽº°¡ ÃʱâÈ­µÇ¾ú´ÂÁö¸¦ ½Å¼ÓÇÏ°Ô ³ªÅ¸³»µµ·Ï Çϱâ À§ÇØ Å¬·¡½º¿¡ isInitialized ¸Þ½îµå¸¦ Æ÷ÇÔ½Ãų ¼ö ÀÖ´Ù. ±×·¯ÇÑ ¸Þ½îµå´Â run-on initializationÀÌ ÇÊ¿äÇÑ Å¬·¡½º¸¦ ÀÛ¼ºÇÒ ¶§´Â °ÅÀÇ Ç×»ó ÁÁÀº ¾ÆÀ̵ð¾îÀÌ´Ù.

ÀÌ·¯ÇÑ Å¬·¡½ºµéÀ» ¿©·¯ºÐ ÀÚ½ÅÀÌ À¯Áöº¸¼öÇÏÁö ¾Ê´Â °æ¿ì ¿©·¯ºÐÀº ±×·¯ÇÑ isInitialized ¸Þ½îµå¸¦ ¿©·¯ºÐ ÀÚ½ÅÀÇ À¯Æ¿¸®Æ¼ Ŭ·¡½º¿¡ µÑ ¼ö ÀÖ´Ù.

°á±¹, ÀνºÅϽº°¡ ÃʱâÈ­µÇÁö ¾Ê¾Ò°í À̸¦ ¿ÜºÎ¿¡¼­ ¾Ë ¼ö ÀÖ´Â °æ¿ì¿¡ ¿©·¯ºÐÀº ÀÌ °á°ú¸¦ üũÇϱâ À§ÇÑ ¸Þ½îµå¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. (ÀÌ°ÍÀÌ RuntimeExceptionÀ» ¹ß»ý½ÃÅ°´Â º¸Åë ÁÁÁö ¾ÊÀº ¹æ¹ýÀ» »ç¿ëÇÏ°Ô²û ÇÏ´õ¶óµµ)

±âº» °ªÀ» Ç¥ÇöÇϴ Ư¼ö Ŭ·¡½º »ý¼ºÇϱâ

ÇʵåµéÀ» null·Î ä¿ì±âº¸´Ù´Â ±âº» °ªµéÀ» Ç¥ÇöÇÒ ¼ö ÀÖµµ·Ï Ư¼ö Ŭ·¡½º(½Ì±ÛÅæ°ú °°Àº)¸¦ ¸¸µé¶ó. ±×¸®°í ³ª¼­ ±âº» »ý¼ºÀÚ ³»ÀÇ ¿©·¯ºÐÀÇ Çʵ忡 ÀÌ Å¬·¡½ºµéÀÇ ÀνºÅϽº¸¦ ä¿î´Ù. ±×·¯¸é NullPointerExceptionÀ» ¸¸³¯ È®·üµµ Àû¾îÁú »Ó ¾Æ´Ï¶ó ÀÌ·¯ÇÑ ÇʵåµéÀÌ ºÎÀûÀýÇÏ°Ô Á¢±ÙµÉ ¶§ ¾î¶² ¿À·ù°¡ ¹ß»ýÇÏ´ÂÁö¸¦ ¼¼¹ÐÇÏ°Ô Á¦¾îÇÒ ¼ö ÀÖ°Ô µÉ °ÍÀÌ´Ù.

¿¹¸¦ µé¾î, ¿ì¸®´Â RestrictedInt Ŭ·¡½º¸¦ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.

Listing 2. NonValues¸¦ °¡Áø RestrictedInts


class RestrictedInt implements SimpleInteger {
  public SimpleInteger value;
  public boolean canTakeZero;
  
  public RestrictedInt(boolean _canTakeZero) {
    canTakeZero = _canTakeZero;
    value = NonValue.ONLY;
  }
  
  public void setValue(int _value) throws CantTakeZeroException {
    if (_value == 0) {
      if (canTakeZero) {
        value = new DefaultSimpleInteger(_value);
      }
      else {
        throw new CantTakeZeroException(this);
      }
    }
    else {
      value = new DefaultSimpleInteger(_value);
    }
  }
  
  public int intValue() {
    return ((DefaultSimpleInteger)value).intValue();
  }
}

interface SimpleInteger {
}

class NonValue implements SimpleInteger {
    
  public static NonValue ONLY = new NonValue();
    
  private NonValue() {}
  
}


class DefaultSimpleInteger implements SimpleInteger {
  private int value;
  
  public DefaultSimpleInteger(int _value) {
    value = _value;
  }
  
  public int intValue() {
    return value;
  }
}

ÀÌÁ¦ ÀÌ Çʵ忡 Á¢±ÙÇÏ´Â ¿©·¯ºÐÀÇ Å¬¶óÀ̾ðÆ® Ŭ·¡½º Áß ¾î¶² °ÍÀÌ °á°ú element¿¡ intValue ÀÛ¾÷À» ¼öÇàÇØ¾ß ÇÒ °æ¿ì, NonValue°¡ ±×·¯ÇÑ ÀÛ¾÷À» Áö¿øÇÏÁö ¾Ê±â ¶§¹®¿¡ À̵éÀº ¿ì¼± DefaultSimpleInteger¸¦ ij½ºÆ®ÇØ¾ß ÇÒ °ÍÀÌ´Ù.

À§ Á¢±Ù ¹æ½ÄÀÇ ÀåÁ¡Àº ÀÌ ¸Þ½îµå È£ÃâÀÌ ±âº» °ª¿¡¼­ ÀÛµ¿ÇÏÁö ¾Ê´Â´Ù´Â »ç½ÇÀ» ¿©·¯ºÐÀÌ ÄÚµå ³»¿¡¼­ ij½ºÆ®ÇÏ´Â °ÍÀ» Àؾî¹ö¸± ¶§¸¶´Ù °è¼ÓÀûÀ¸·Î »ó±â½ÃÄÑ ÁÙ °ÍÀ̶ó´Â Á¡ÀÌ´Ù (ÄÄÆÄÀÏ·¯ ¿¡·¯·Î). ¶ÇÇÑ ·±Å¸Àӽÿ¡ ¿©·¯ºÐÀÌ ÀÌ Çʵ忡 Á¢±ÙÇÏ°í ÀÌ Çʵ尡 ±âº» °ªÀ» °¡Áö°í ÀÖÀ» °æ¿ì ¿©·¯ºÐÀº ClassCastExceptionÀ» ¾òÀ» °ÍÀε¥, ÀÌ°ÍÀº NullPointerExceptionº¸´Ù ÈξÀ ´õ ¸¹Àº Á¤º¸¸¦ °¡Áö°í ÀÖÀ» °ÍÀÌ´Ù. ClassCastExceptionÀº ½ÇÁ¦·Î °Å±â¿¡ ¹«¾ùÀÌ ÀÖ¾ú´ÂÁö »Ó ¾Æ´Ï¶ó ÇÁ·Î±×·¥ÀÌ °Å±â¿¡¼­ ¾î¶»°Ô µÉÁöµµ ¾Ë·ÁÁÙ °ÍÀÌ´Ù.

´ÜÁ¡Àº ¼º´ÉÀÌ´Ù. Çʵ忡 Á¢±ÙÇÒ ¶§¸¶´Ù ÇÁ·Î±×·¥ÀÌ Ä³½ºÆ®¸¦ ¼öÇàÇØ¾ß ÇÒ °ÍÀÌ´Ù.

ÄÄÆÄÀÏ ¿¡·¯ ¸Þ½ÃÁö¸¦ ¹«½ÃÇÏ°í ½Í´Ù¸é ¶Ç ´Ù¸¥ ¼Ö·ç¼ÇÀº SimpleInteger ÀÎÅÍÆäÀ̽º¿¡ intValue ¸Þ½îµå¸¦ Æ÷ÇÔ½ÃÅ°´Â °ÍÀÌ´Ù. ±×·¯¸é ¿©·¯ºÐÀº ¿©·¯ºÐÀÌ ¿øÇÏ´Â ¿¡·¯°¡ ¹«¾ùÀ̵簣¿¡ ±×°ÍÀ» ¹ß»ý½ÃÅ°´Â ¸Þ½îµå¸¦ °¡Áø ±âº» Ŭ·¡½º¿¡ ÀÌ ¸Þ½îµå¸¦ ±¸ÇöÇÒ ¼ö ÀÖ´Ù (±×¸®°í ¿©·¯ºÐÀÌ ¿øÇÏ´Â ¾î¶² Á¤º¸µçÁö Æ÷ÇÔ½Ãų ¼ö ÀÖ´Ù). ´ÙÀ½ ¿¹Á¦°¡ À̸¦ º¸¿©ÁØ´Ù.

Listing 3. ¿¹¿Ü¸¦ ¹ß»ý½ÃÅ°´Â NonValues

class RestrictedInt implements SimpleInteger {
  public SimpleInteger value;
  public boolean canTakeZero;
  
  public RestrictedInt(boolean _canTakeZero) {
    canTakeZero = _canTakeZero;
    value = NonValue.ONLY;
  }
  
  public void setValue(int _value) throws CantTakeZeroException {
    if (_value == 0) {
      if (canTakeZero) {
        value = new DefaultSimpleInteger(_value);
      }
      else {
        throw new CantTakeZeroException(this);
      }
    }
    else {
      value = new DefaultSimpleInteger(_value);
    }
  }
  
  public int intValue() {
    return value.intValue();
  }
}

interface SimpleInteger {
  public int intValue();
}

class NonValue implements SimpleInteger {
    
  public static NonValue ONLY = new NonValue();
    
  private NonValue() {}
    
  public int intValue() {
    throw new 
      RuntimeException("Attempt to access an int from a NonValue");
  }
}


class DefaultSimpleInteger implements SimpleInteger {
  private int value;
  
  public DefaultSimpleInteger(int _value) {
    value = _value;
  }
  
  public int intValue() {
    return value;
  }
}

ÀÌ ¼Ö·ç¼ÇÀº ClassCastExceptionº¸´Ù ÈǸ¢ÇÑ ¿¡·¯ Áø´ÜÀ» Á¦°øÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ·±Å¸Àӽÿ¡ ij½ºÆ®°¡ ÇÊ¿äÇÏÁö ¾Ê±â ¶§¹®¿¡ ´õ È¿°úÀûÀ̱⵵ ÇÏ´Ù. ±×·¯³ª ÀÌ ¼Ö·ç¼ÇÀº ¸ðµç Á¢±Ù ÁöÁ¡¿¡¼­ Çʵ忡 ¾î¶² °ªÀÌ °¡´ÉÇÒÁö¿¡ °üÇØ ¿©·¯ºÐÀÌ »ý°¢Çϵµ·Ï ¿ä±¸ÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.

¿©·¯ºÐÀÌ ¾î¶² ¼Ö·ç¼ÇÀ» »ç¿ëÇϱâ·Î ¼±ÅÃÇÒ Áö´Â ºÎºÐÀûÀ¸·Î´Â ¿©·¯ºÐÀÇ ¼±È£¿¡, ±×¸®°í ºÎºÐÀûÀ¸·Î´Â ¿©·¯ºÐ ÇÁ·ÎÁ§Æ®ÀÇ ¼º´É°ú °­·Â¼º Á¦¾à¿¡ ´Þ·Á ÀÖ´Ù.

ÀÌÁ¦ ¾ð¶æ º¸±â¿¡´Â ¿ÏÀüÈ÷ Ʋ¸° °Íó·³ º¸ÀÌ´Â ±â¹ýÀ» »ìÆì º¸ÀÚ.

¿¹¿Ü¸¸À» ¹ß»ý½ÃÅ°´Â ¸Þ½îµå Æ÷ÇÔ½ÃÅ°±â

óÀ½¿¡ ¿©·¯ºÐÀº ÀÌ ¹æ¹ýÀÌ º»ÁúÀûÀ¸·Î À߸øµÈ °Í, ±×¸®°í Ŭ·¡½º´Â ½ÇÁ¦·Î µ¥ÀÌÅÍ¿¡¼­ ó¸®ÇÒ ¼ö ÀÖ´Â ¸Þ½îµå¸¸À» Æ÷ÇÔÇØ¾ß ÇÑ´Ù´Â Á÷°ü¿¡ ¹Ý´ëµÈ °Íó·³ »ý°¢µÉ °ÍÀÌ´Ù. ƯÈ÷ ¿©·¯ºÐÀÌ °´Ã¼ ÁöÇâ ÇÁ·Î±×·¡¹Ö¿¡ °üÇØ ÇÁ·Î±×·¡¸ÓµéÀ» ±³À°½ÃÅ°°í ÀÖÀ» ¶§ ±×·¯ÇÑ Å¬·¡½º¸¦ Æ÷ÇÔ½ÃÅ°´Â °ÍÀÌ È¥¶õ½º·¯¿ï ¼ö ÀÖ´Ù.

¿¹¸¦ µé¾î, ¾Æ·¡ÀÇ Listing 4¿Í 5¿¡ ³ª¿À´Â Lists¿¡ ´ëÇÑ Å¬·¡½º °èÃþÀ» Á¤ÀÇÇÏ´Â µÎ °¡Áö °¡´ÉÇÑ ¹æ¹ýÀ» °ËÅäÇØ º¸ÀÚ.

Listing 4. ¹ü¿ë getters¸¦ °¡ÁöÁö ¾ÊÀº Lists

abstract class List {}

class Empty extends List {}

class Cons extends List {
  Object first;
  List rest;
  
  Cons(Object _first, List _rest) {
    first = _first;
    rest = _rest;
  }
  
  public Object getFirst() {
    return first;
  }
  
  public List getRest() {
    return rest;
  }
}

Listing 5. ÀÎÅÍÆäÀ̽º¿¡ getter¸¦ °¡Áø Lists

abstract class List {
  public abstract Object getFirst();
  public abstract Object getRest();
}

class Empty extends List {
  public Object getFirst() {
   throw new RuntimeException("Attempt to take first of an empty list");
  }
  
  public List getRest() {
   throw new RuntimeException("Attempt to take rest of an empty list");
  }
}

class Cons extends List {
  Object first;
  List rest;
  
  Cons(Object _first, List _rest) {
    first = _first;
    rest = _rest;
  }
  
  public Object getFirst() {
    return first;
  }
  
  public List getRest() {
    return rest;
  }
}

°´Ã¼ ÁöÇâ ¾ð¾î°¡ »ý¼ÒÇÑ ÇÁ·Î±×·¡¸Ó¶ó¸é ù¹ø° ¹öÀüÀÇ List (¹ü¿ë getters°¡ ¾ø´Â °Í) µÚ¿¡ ¼ûÀº µ¿±â°¡ ´ú È¥¶õ½º·¯¿ï °ÍÀÌ´Ù. Á÷°üÀûÀ¸·Î, Ŭ·¡½º´Â ½ÇÁ¦ ÀÛ¾÷À» ¼öÇàÇÏÁö ¾Ê´Â ¸Þ½îµå¶ó¸é ±× ¸Þ½îµå¸¦ Æ÷ÇÔ½ÃÄѼ­´Â ¾È µÈ´Ù. ±×·¯³ª ±âº» Ŭ·¡½º¸¦ ´Ù·ç±â À§ÇÑ À§ÀÇ °í·Á»çÇ×Àº ÀÌ ¿¹Á¦¿¡¼­µµ µ¿ÀÏÇÏ°Ô Àß Àû¿ëµÈ´Ù.

¿©·¯ºÐ Äڵ忡 ij½ºÆ®¸¦ °è¼Ó »ðÀÔÇÏ´Â °ÍÀº »ó´çÈ÷ ¼º°¡½º·¯¿ï ¼ö ÀÖ°í Äڵ尡 ¸Å¿ì ÀåȲÇØÁú ¼ö ÀÖ´Ù. ¶ÇÇÑ Å¬·¡½º ij½ºÆ®´Â ƯÈ÷ List¿Í °°ÀÌ ÀÚÁÖ È£ÃâµÇ´Â À¯Æ¿¸®Æ¼ÀÇ °æ¿ì ¼º´É ¸é¿¡ »ó´çÇÑ ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Ù.

¸ðµç ¼³°è ¹æ½Ä°ú ¸¶Âù°¡Áö·Î ÀÌ ¹æ½ÄÀº ÀÌ ¹æ½ÄÀÇ ±â¹ÝÀÌ µÇ´Â µ¿±â¸¦ °í·ÁÇÒ ¶§ °¡Àå Àß Àû¿ëµÈ´Ù. ±×·¯³ª ±× µ¿±â°¡ Ç×»ó Àû¿ëµÉ ¼ö´Â ¾øÀ» °ÍÀÌ´Ù. µû¶ó¼­, ±× µ¿±â°¡ Àû¿ëµÉ ¼ö ¾øÀ» ¶§´Â ÀÌ ¹æ½ÄÀÌ »ç¿ëµÇ¾î¼­´Â ¾È µÈ´Ù.

À̵éÀ» °íÄ¡´Â °Íº¸´Ù ´õ ³´´Ù

¿©·¯ºÐÀº Run-on Initializer ¹ö±×°¡ ¾à°£ ´Ù¸£´Ù´Â °ÍÀ» ¾Ë¾ÆÂ÷·ÈÀ» °ÍÀÌ´Ù (¿©·¯ºÐÀÌ ÇÊÀÚÀÇ ´Ù¸¥ ¹ö±× ÆÐÅÏ °ü·Ã ±ÛÀ» Àоú´Ù¸é). À̹ø ±Û¿¡¼­ ³ª´Â ÀÌ ¹ö±×¸¦ ¹Ù·Î °íÄ¡±âº¸´Ù ¹ö±×ÀÇ ±Ùº» ¿øÀο¡ °üÇØ ÀÛ¾÷ÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ ¸î °¡Áö ¾ÆÀ̵ð¾î¸¦ Á¦°øÇÏ¿´´Ù. ³»°¡ À̵鿡 ´ëÇØ ÀÛ¾÷ÇØ¾ß Çß´ø °æ¿ì°¡ ¸¹¾Ò±â ¶§¹®ÀÌ´Ù. ±×°ÍÀº ±×·¸°Ô ÁÁÀº ½Ã°£Àº ¾Æ´Ï¾ú´Ù.

¿©ÀüÈ÷, ¿ì¸®°¡ ¾ð±ÞÇÑ °í·Á »çÇ×µéÀÌ °¡¸®Å°µíÀÌ run-on initializationsÀ» ÇÇÇÏ´Â °ÍÀÌ ´õ ÁÁ´Ù. ±×·¯³ª ¿©·¯ºÐÀÌ À̵éÀ» ´Ù·ç¾î¾ß ÇÒ ¶§ ¿©·¯ºÐÀº ÃÖ¼ÒÇÑ ¿©·¯ºÐ ÀÚ½ÅÀ» º¸È£ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº ÀÌ ¹ö±× ÆÐÅÏÀ» °£Ã߸° °ÍÀÌ´Ù.

  • ÆÐÅÏ : Run-on Initializer

  • Áõ»ó : ÃʱâÈ­µÇÁö ¾ÊÀº Çʵå Áß Çϳª¿¡ Á¢±ÙÇÒ ¶§ NullPointerException ¹ß»ý

  • ¿øÀÎ : »ý¼ºÀÚ°¡ ¸ðµç Çʵ带 Á÷Á¢ ÃʱâÈ­ÇÏÁö ¾ÊÀº Ŭ·¡½º

  • Ä¡·áÃ¥ ¹× ¿¹¹æÃ¥ : »ý¼ºÀÚ ³»ÀÇ ¸ðµç Çʵ带 ÃʱâÈ­ÇÑ´Ù. ´õ ³ªÀº °ªÀÌ »ç¿ëµÉ ¼ö ¾øÀ» ¶§´Â ±âº» °ª¿¡ ´ëÇÑ Æ¯¼ö Ŭ·¡½º¸¦ »ç¿ëÇÑ´Ù. ´õ ³ªÀº °ªÀÌ »ç¿ëµÉ ¼ö ÀÖ´Â °æ¿ì¸¦ ´Ù·ç±â À§ÇØ ¿©·¯ »ý¼ºÀÚ¸¦ Æ÷ÇÔ½ÃŲ´Ù. isInitialized ¸Þ½îµå¸¦ Æ÷ÇÔ½ÃŲ´Ù.

´ÙÀ½ ¸î ´Þ µ¿¾È ¿ì¸®´Â ¹ö±× ÆÐÅÏÀ̶ó´Â ÁÖÁ¦·Î µÇµ¹¾Æ °¥ °ÍÀÌ´Ù. ´ÙÀ½ ´Þ¿¡´Â ÀÚ¹Ù ¾ð¾î¿¡¼­ ¹ß»ýÇÏ´Â ¸î °¡Áö Ç÷§Æû¿¡ µ¶¸³ÀûÀÎ ¹ö±×¸¦ ´Ù·ê °ÍÀÌ´Ù. ÀϹÝÀûÀÎ ¹ÏÀ½°ú´Â ´Þ¸® À̵鿡 ´ëÇÑ ¸é¿ªÀÌ µÇ¾î ÀÖÁö ¾Ê´Ù.

Âü°íÀÚ·á

  • bitterjava.com : »ó»óÇÒ ¼ö ÀÖ´Â °¡Àå ÇüÆí¾ø°í ³ª»Ú°í Çø¿À½º·¯¿î ÀÚ¹Ù ÇÁ·Î±×·¥, ¾ÆÅ°ÅØó ¹× ¼³°è -- ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ¸ðµç ³ª»Û ÄÚµù °üÇàÀ» ã¾Æ¼­ Á¶·ÕÇÏ´Â Àü¿ë »çÀÌÆ®

  • "¾´ ÀÚ¹ÙÀÇ ¸À " (developerWorks, March 2002)¿¡¼­ Bruce Tate´Â ¿Ö ¾ÈƼ ÆÐÅÏ (½ÇÁ¦·Î ¸íÈ®ÇÏ°Ô ºÎÁ¤ÀûÀÎ °á°ú¸¦ °¡Á® ¿À´Â ¹®Á¦¿¡ ´ëÇÑ ÀϹÝÀûÀÎ ¼Ö·ç¼Ç)ÀÌ ¼³°è ÆÐÅÏ¿¡ ÇÊ¿äÇÏ°í ±×°Í°ú º¸¿ÏÀûÀΠ¦ÀÌ µÇ´ÂÁö, ±×¸®°í ¾î¶»°Ô ÀÛµ¿ÇÏ´ÂÁö¸¦ º¸¿©ÁØ´Ù.

  • XP »çÀÌÆ®: extreme programmingÀÇ °³³ä ¿ä¾à

  • JUnit À¥ »çÀÌÆ® : ÇÁ·Î±×·¥ Å×½ºÆà ¸Þ½îµå¸¦ ´Ù·ç´Â ¹«¼öÇÑ ¼Ò½ºµéÀÇ Èï¹Ì ÀÖ´Â ¸¹Àº ±Ûµé·ÎÀÇ ¸µÅ© Á¦°ø

  • Eric AllenÀÇ Diagnosing Java Code Ä÷³

  • DrJava : Rice ´ëÇÐÀÌ °³¹ßÇÑ ¹«·áÀÇ ¿ÀÇ ¼Ò½º ÀÚ¹Ù ÅëÇÕ °³¹ß ȯ°æ. read-eval-print ·çÇÁ¸¦ °¡Áü.

  • developerWorks Java technology zone : ÀÚ¹Ù ±â¼ú°ú °ü·ÃµÈ ´Ù¸¥ ÀÚ·áµé

ÇÊÀÚ¼Ò°³

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

 



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

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

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