ÀÎÀÚ¸¦ °¡Áø »ý¼ºÀÚ¸¦ ÇÇÇÔÀ¸·Î½á ÀÌ ¹ö±×¸¦ ¹°¸®Ä¡±â
Eric
E. Allen ¹Ú»ç °úÁ¤, ÀÚ¹Ù ÇÁ·Î±×·¡¹Ö ÆÀ, Rice University 2002³â 4¿ù
¿©·¯ºÐÀº Á¾Á¾ »ý¼ºÀÚ È£ÃâÀ» ÅëÇؼ »Ó ¾Æ´Ï¶ó ´Ù¾çÇÑ Çʵ带 ¼³Á¤Çϱâ À§ÇÑ ¸î
°¡Áö ÈÄ¼Ó ÀÛ¾÷À» ÅëÇØ Å¬·¡½º¸¦ ÃʱâÈÇÏ´Â Äڵ带 º»ÀûÀÌ ÀÖÀ» °ÍÀÌ´Ù. ±×·¯ÇÑ ÈÄ¼Ó ÀÛ¾÷µéÀº ºÒÇàÈ÷µµ ¹ö±×ÀÇ ¿Â»óÁöÀ̸ç,
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¿¡ ºüÁ®¹ö¸± ¼ö ÀÖ´Ù.
ÀÌ °æ¿ì ó¸®ÀÚ°¡ Á¸ÀçÇÏÁö ¾Ê´Â °Íº¸´Ù ´õ ³ª»Ú´Ù. ÃÖ¼ÒÇÑ Ã¼Å©µÈ ¿¹¿Ü´Â ±×
¿øÀο¡ ´ëÇÑ ¸î °¡Áö ´Ü¼¸¦ °¡Áö°í ÀÖ´Ù. ±×·¯³ª NullPointerException
sÀº °ªÀÌ Ã³À½¿¡ ¿Ö
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 °ªÀ» ºÒÇÊ¿äÇÏ°Ô »ç¿ëÇÏ¸é °á°úÀûÀ¸·Î NullPointerException
sÀÌ
¹ß»ýÇϱ⠶§¹®ÀÌ´Ù. NullPointerException
sÀº ³ª»Ú´Ù. ÇÑ °¡Áö ÀÌÀ¯¸¦ µéÀÚ¸é À̵éÀº ¹ö±×ÀÇ
½ÇÁ¦ ¿øÀο¡ ´ëÇØ °ÅÀÇ Á¤º¸¸¦ Á¦°øÇÏÁö ¾Ê´Â´Ù. ¶Ç ´Ù¸¥ ÀÌÀ¯´Â À̵éÀÌ ¹ö±×ÀÇ ½ÇÁ¦ ¿øÀÎÀ¸·ÎºÎÅÍ ¾ÆÁÖ ¸Ö¸® ¶³¾îÁø °÷¿¡ ³ªÅ¸³ª±â
½±´Ù´Â °ÍÀÌ´Ù.
¹«½¼ ¼ö¸¦ ½á¼¶óµµ À̵éÀ» ÇÇÇϵµ·Ï ÇÑ´Ù. ¿©·¯ºÐÀÌ Å¬·¡½º°¡ ¾ÆÁ÷ ¿ÏÀüÈ÷ ÃʱâȵÇÁö ¾Ê¾ÒÀ½À» ³ªÅ¸³»±â À§ÇØ 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ÀÇ ÇÁ·ÎÁ§Æ® °ü¸®ÀÚÀÌ´Ù.