.
.
Core Java
Technologies Technical Tips
.
 
2005³â 1¿ù 19ÀÏ  


Core Java Technologies Tech Tips¿¡ ¿À½Å ¿©·¯ºÐÀ» ȯ¿µÇÕ´Ï´Ù. Java 2 Platform, Standard Edition (J2SE)¿¡ ±â¹ÝÇÑ core Java technologies ¿Í APIsÀÇ »ç¿ë¿¡ °üÇÑ ÃֽŠÁ¤º¸¸¦ ¾ò¾î °¡½Ã±â ¹Ù¶ø´Ï´Ù. ÀÌ ±Û¿¡¼­´Â Java 2 Platform Standard Edition Development Kit 5.0(JDK 5.0)À» »ç¿ëÇÕ´Ï´Ù.
Download JDK 5.0

À̹ø È£¿¡¼­´Â,

-¸®¼Ò½º ¹øµé ·Îµù
-javadoc¿¡¼­ ListResourceBundles ¼û±â±â

À» ´Ù·ç°Ô µË´Ï´Ù.

ÀúÀÚ Daniel H. Steinberg

.

¸®¼Ò½º ¹øµé ·Îµù

¸®¼Ò½º ¹øµéÀ» ÀÌ¿ëÇØ ÅØ½ºÆ® ½ºÆ®¸µÀ» °¢±¹ÀÇ ¾ð¾îº°(ƯÈ÷, ¿µ¾î¿¡ À־´Â °¢ Áö¿ªº° ¿µ¾î)·Î ÀÓº£µåÇÒ ¼ö ÀÖ´Ù. ÀÌÀüÀÇ Tech Tip¿¡¼­´Â ¸®¼Ò½º ¹øµéÀÇ »ç¿ë¿¡ ´ëÇØ¼­ ³íÀÇÇß¾ú´Ù. À̸¦ Àá½Ã µÇ»õ°Üº¸ÀÚ. ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡ "Hello, World"¿Í °°Àº ½ºÆ®¸µÀÌ ÇÊ¿äÇÏ´Ù¸é À̸¦ ÇÁ·Î±×·¥¿¡ ÄÚµùÇÏ´Â °ÍÀÌ ÇϳªÀÇ ¹æ¹ýÀÌ µÇ°Ú´Ù. ±×·¯³ª ¸®¼Ò½º ¹øµéÀ» ÀÌ¿ëÇÏ¸é ½ºÆ®¸µÀ» Çϵå ÄÚµùÇÒ Çʿ䰡 ¾ø´Ù. ´ë½Å¿¡ ·è¾÷ Å×ÀÌºí¿¡ ½ºÆ®¸µÀ» ³Ö°í ·±Å¸Àӽà ÇÁ·Î±×·¥ÀÌ ½ºÆ®¸µÀ» ã¾Æº¸µµ·Ï ÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î±×·¥ÀÌ ´Ù¸¥ Áö¿ª°ª(locale)À¸·Î ±¸µ¿ÇÑ´Ù¸é ã¾Æº¸±â(lookup)±â´ÉÀº, ¹ø¿ªµÇ¾îÀÖÀ» °æ¿ì¿¡´Â ´Ù¸¥ ½ºÆ®¸µÀ», ¹ø¿ªµÇ¾îÀÖÁö ¾ÊÀ» °æ¿ì¿¡´Â ¿ø·¡ÀÇ ½ºÆ®¸µÀ» ãÀ» °ÍÀÌ´Ù. Áö¿ª°ª¿¡ »ó°ü¾øÀÌ µ¿ÀÏÇÑ ÄÚµå·Î ±¸µ¿µÇ¹Ç·Î ÇÁ·Î±×·¥ÀÇ Äڵ忡´Â ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê´Â´Ù. »ç¿ëÀÚ°¡ ÇØ¾ßÇÒ °ÍÀº °ªµéÀÇ ·è¾÷ Å×À̺íÀ» »ý¼ºÇÏ°í ¹ø¿ªÇÏ´Â °Í »ÓÀÌ´Ù.

¾Õ¿¡¼­ ¾ð±ÞÇßµíÀÌ ¸®¼Ò½º ¹øµéÀº Áö¿ª°ªÀ» ´ë»óÀ¸·Î ÇÑ´Ù. ¿µ¾î°¡ Áö¿ª°ªÀÏ ¶§ "¿µ¾î·Î 'greet' ½ºÆ®¸µÀÌ ÇÊ¿äÇÔ."¶ó°í ÇÒ ¼ö ÀÖÀ¸¸ç, ¹Ì±¹ ¿µ¾îÀÇ 'color'¿Í ¿µ±¹ ¿µ¾îÀÇ 'colour'ÀÇ Â÷À̸¦ µÑ ¼öµµ ÀÖ´Ù. Áö¿ª°ªÀº ±¹°¡º° ¾ð¾î»Ó ¾Æ´Ï¶ó °¢ ¾ð¾î ¾È¿¡¼­µµ Áö¿ª±¸ºÐÀ» Áö¿øÇϱ⠶§¹®ÀÌ´Ù. Áï ¹Ì±¹½Ä ¿µ¾î Áß¿¡¼­µµ Southern California³ª New York CityµîÀÇ °¢ Áö¿ª¿¡ µû¶ó ´Ù¸¥ ±¸¹®À» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.

ListResourceBundle¸¦ È®ÀåÇÏ´Â .class ÆÄÀÏ¿¡ ¸®¼Ò½º ¹øµéÀ» Á¤ÀÇÇϰųª .properties ÆÄÀÏ·Î ¹é¾÷µÇ´Â PopertyResourceBundle¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ¸®¼Ò½º ¹øµé°ú Áö¿ª°ªÀ» °áÇÕ½Ãų ¶§´Â µÎ°¡Áö °Ë»öÀÌ ¼ö¹ÝµÈ´Ù. ù¹øÂ° °Ë»öÀ¸·Î´Â °¡Àå °¡±î¿î ¿äû ¸®¼Ò½º ¹øµéÀ» ã°í, µÎ¹øÂ° °Ë»öÀ¸·Î´Â ¿äûµÈ key¿¡ ´ëÇÑ ½ºÆ®¸µÀ» ã´Â´Ù. ¿Ö ÀÌ·¯ÇÑ Â÷À̸¦ µÑ±î? ¸®¼­Ä¡ ¹øµéÀ» °Ë»öÇÒ ¶§ ½Ã½ºÅÛÀº ¸®¼Ò½º ¹øµéÀ» ã´Â Áï½Ã °Ë»öÀ» Áß´ÜÇÏ°í ¿äûµÈ ¸®¼Ò½º ¹øµéÀ» ·ÎµùÇÑ´Ù. ½Ã½ºÅÛÀÌ ¿äûµÈ ¹øµé¿¡¼­ key¸¦ ãÁö ¸øÇÏ¸é ´Ù¸¥ ¸®¼Ò½º ¹øµé¿¡¼­ ã°Ô µÈ´Ù. °á±¹ ãÁö ¸øÇÏ¸é ½Ã½ºÅÛÀº MissingResourceException¸¦ ´øÁø´Ù.

ÀÌ¿¡ ´ëÇÑ ½Ã¿¬À¸·Î Greeting À̶ó´Â À̸§ÀÇ ¹øµé ¾È¿¡¼­ New York Áö¿ª°ª¿¡ ´ëÇÑ ½ºÆ®¸µÀ» ã´Â´Ù°í °¡Á¤Çϰí Áö¿ª°ªÀÌ ´ÙÀ½°ú °°ÀÌ »ý¼ºµÇ¾ú´Ù°í ÇÏÀÚ.

   Locale newYork = new Locale("en", "US", "NewYork")

±×¸®°í ´ÙÀ½°ú °°ÀÌ ¸®¼Ò½º ¹øµéÀ» ¿äûÇϸé,

   ResourceBundle bundle = 
     ResourceBundle.getBundle("Greeting", newYork);

½Ã½ºÅÛÀº ¿ì¼± ¹øµé¿¡ ´ëÇÑ .class ÆÄÀÏÀ» ã´Â´Ù. ±× ÆÄÀÏÀº New York °ú °°ÀÌ º¯ÇÏ´Â Áö¿ª°ªÀº ·¹º§·Î¼­ ±× ÆÄÀÏÀº Greeting_en_US_NewYork.classÀÌ µÉ °ÍÀÌ´Ù. ½Ã½ºÅÛÀÌ Å¬·¡½º °æ·Î¿¡¼­ .classÆÄÀÏÀ» ãÁö ¸øÇϸé Greeting_en_US_NewYork.propertiesÆÄÀÏÀ» °Ë»öÇϰԵȴÙ. À̾ Greeting_en_US.class, Greeting_en_US.properties, Greeting_en.class, Greeting_en.properties, Greeting.class, Greeting.properties¸¦ °Ë»öÇÏ°Ô µÉ °ÍÀÌ´Ù. ¸®¼Ò½º ¹øµéÀ» ã°Ô µÇ¸é ½Ã½ºÅÛÀº °Ë»öÀ» ¸ØÃá´Ù. ´ÙÇàÈ÷ ij½¬°¡ Æ÷ÇԵǾî ÀÖ¾î ½Ã½ºÅÛÀÌ ¾ðÁ¦³ª ¸ðµç °÷À» °Ë»öÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. ±×·¸Áö¸¸ °Ë»öÇØ¾ßÇÏ´Â °÷ÀÌ ÀáÀçÀûÀ¸·Î ¸Å¿ì ¸¹Àº °ÍÀÌ »ç½ÇÀÌ´Ù.

±× ÈÄ ½Ã½ºÅÛÀº µÎ¹øÂ° ã¾Æº¸±â¸¦ ½ÇÇàÇÑ´Ù. À̹ø¿¡´Â ¿äûµÈ ۸¦ ã´Â ´Ü°èÀÌ´Ù. ¿äûÇÑ Å°°¡ ½Ã½ºÅÛÀÌ Ã£Àº ¹øµé ¾È¿¡ ¾ø´Ù¸é ½Ã½ºÅÛÀº ¾ð¾î, Áö¿ª, µîÀÇ ÇöÀç ¹øµéÀÇ ·¹º§À» ³Ñ¾î¼­¼­ ¶Ç´Ù¸¥ ¸®¼Ò½º ¹øµéÀ» ã°Ô µÈ´Ù. ÀÌ¿¡ µû¶ó .class ÆÄÀÏÀ̵ç .properties ÆÄÀÏÀ̵çÁö »ó°ü¾øÀÌ Á» ´õ ¸¹Àº ¹øµéÀ» ·ÎµùÇÏ°Ô µÈ´Ù.

»ç¿ëÀÚµéÀÌ ¾Æ¸¶µµ ±Ã±ÝÇÒ °ÍÀº .class ÆÄÀÏÀ» »ç¿ëÇÏ´Â °Í°ú .properties ÆÄÀÏÀ» »ç¿ëÇÏ´Â °Í Áß ¾î´À °ÍÀÌ ´õ ³ªÀº°ÍÀΰ¡¿¡ ´ëÇÑ °ÍÀÌ´Ù. .class ÆÄÀÏÀÌ ¸ÕÀú °Ë»öµÇ°í ±× ´ÙÀ½ÀÌ .properties ÆÄÀÏÀÌ´Ù. ¶ÇÇÑ .classÀº Ŭ·¡½º ·Î´õ¿¡¼­ Á÷Á¢ ·ÎµùµÇ´Â ¹Ý¸é .properties ÆÄÀÏÀº ¹øµéÀÌ ·ÎµùµÉ ÇÊ¿äÇÏ ÀÖÀ» ¶§¸¶´Ù ¸Å¹ø ÆÄ½ÌµÇ¾î¾ßÇÑ´Ù. ÆÄ½ÌÀº µÎ¹øÀÇ °úÁ¤À» °ÅÄ£´Ù. \uXXX°ú °°Àº À¯´ÏÄڵ带 ´Ù·ç·Á¸é ½Ã½ºÅÛÀº ¹Ýµå½Ã °¢°¢ÀÇ key=value ¶óÀÎÀ» µÎ¹ø¾¿ ½ºÄµÇÑ ÈÄ, °ªÀ¸·ÎºÎÅÍ Å°¸¦ ºÐ¸®ÇؾßÇÑ´Ù.

ÀÚ ÀÌÁ¦ ÀÌ µÎ°³ÀÇ ·Îµù ½Ã°£À» ºñ±³Çغ¸ÀÚ. ´ÙÀ½ÀÇ Å×½ºÆ® ÇÁ·Î±×·¥À¸·Î ¸ÕÀú ½ÃÀÛÇØº¸¸é,

   import java.util.*;

   public class Test1 {
     public static void main(String args[]) {
       Locale locale = Locale.ENGLISH;
       long start = System.nanoTime();
       ResourceBundle myResources =
         ResourceBundle.getBundle("MyResources", locale);
       long end1 = System.nanoTime();
       String string = myResources.getString("HelpKey");
       long end2 = System.nanoTime();
       System.out.println("Load: " + (end1 - start));
       System.out.println("Fetch: " + (end2 - end1));
       System.out.println("HelpKey: " + string);
     }
   }

»ç¿ëÀÚ°¡ 1.4 Java Ç÷§ÆûÀ» ±¸µ¿ÇÑ´Ù¸é Å×½ºÆ® ÇÁ·Î±×·¥À» º¯°æÇÏ¿© nanoTime ´ë½Å currentTimeMillisÀ» È£ÃâÇϵµ·Ï ÇÑ´Ù. nanoTime ¸Þ¼Òµå´Â ³ª³ë¼¼ÄÁµå ´ÜÀ§(10¾ïºÐÀÇ 1ÃÊ)·Î ½ÇÇàµÇ¸ç, currentTimeMillis´Â ¹Ð¸®¼¼ÄÁµå ´ÜÀ§(õºÐÀÇ 1ÃÊ)·Î ½ÇÇàµÈ´Ù. ¶ÇÇÑ À̹ø ÆÁÀÇ ¸¶Áö¸· ºÎºÐ¿¡ ³ª¿À´Â microbenchmarks¸¦ Âü°íÇÏÀÚ.

´ÙÀ½À¸·Î Å×½ºÆ® ÇÁ·Î±×·¥°ú °°Àº µð·ºÅ丮 ¾È¿¡ ListResourceBundle Ŭ·¡½º¸¦ »ý¼ºÇÏÀÚ.

   import java.util.*;
   
   public class MyResources extends ListResourceBundle {
     public Object[][] getContents() {
       return contents;
     }
     private static final Object[][] contents = {
       {"OkKey", "OK"},
       {"CancelKey", "Cancel"},
       {"HelpKey", "Help"},
       {"YesKey", "Yes"},
       {"NoKey", "No"},
     };
    }

Å×½ºÆ® ÇÁ·Î±×·¥°ú MyResources Ŭ·¡½º¸¦ ÄÄÆÄÀÏÇϰí Å×½ºÆ® ÇÁ·Î±×·¥À» ±¸µ¿½ÃŰÀÚ.

°á°ú´Â ÀÛ¾÷ ȯ°æ, Áï RAMÀÇ Å©±â¿Í ÇÁ·Î¼¼¼­ÀÇ ¼Óµµ¿¡ µû¶ó ´Þ¶óÁú °ÍÀÌ´Ù. ´ÙÀ½Àº 768 MB RAMÀ¸·Î Windows XP¸¦ ±¸µ¿ÇÏ´Â 800 MHz ÀåÄ¡¿¡¼­ÀÇ °á°úÀÌ´Ù.

   Load: 25937415
   Fetch: 62994

ÀÌÁ¦ properties ÆÄÀÏÀÎ MyResources.properties¸¦ ´ÙÀ½ÀÇ ¿ä¼Ò¿Í ÇÔ²² »ý¼ºÇÏÀÚ.

   OkKey=OK
   CancelKey=Cancel
   HelpKey=Help
   YesKey=Yes
   NoKey=No

Å×½ºÆ® ÇÁ·Î±×·¥À» ´Ù½Ã ±¸µ¿Çϰí, À̹ø¿¡´Â ¸ÕÀú MyResources Ŭ·¡½º¸¦ Á¦°ÅÇÑ´Ù. .properties ÆÄÀÏÀ» ÀÌ¿ëÇÏ¿© ÇÁ·Î±×·¥À» ±¸µ¿ÇÒ °ÍÀÌ´Ù. ´ÙÀ½Àº Á»Àü°ú °°Àº »ç¾çÀÇ ÀåÄ¡¿¡¼­ ³ª¿Â °á°úÀÌ´Ù.

   Load: 101469357
   Fetch: 35450  

·Îµù½Ã°£¿¡ À־´Â ListResourceBundleÀÌ PropertyResourceBundleº¸´Ù ºü¸£´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ±×·¯³ª ³î¶ø°Ôµµ ÆÐĪ(fetch) ½Ã°£À¸·Î´Â PropertyResourceBundleÀÌ ListResourceBundleº¸´Ù µÎ ¹è °¡±îÀÌ ºü¸£´Ù. ´ë·«, ·Îµù¿¡ À־´Â ´Ù¼¸¹èÀÇ Â÷À̰¡ ³ª°í ÆÐĪ¿¡ À־´Â µÎ¹èÀÇ Â÷À̰¡ ³ª¹Ç·Î À̸¦ µû¶óÀâ±â À§Çؼ­´Â ¸¹Àº ÆÐĪ ÀÛ¾÷ÀÌ ÇÊ¿äÇÏ´Ù. ³ª³ë¼¼ÄÁµå´Â 10¾ïºÐÀÇ 1ÀÇ ½Ã°£À̶ó´Â °Í°ú ¹Ð¸®¼¼ÄÁµå´Â õºÐÀÇ 1Ãʶó´Â »ç½ÇÀ» ÀØÁö ¸»±â ¹Ù¶õ´Ù.

Å×½ºÆ® ÇÁ·Î±×·¥À» ´Ù½Ã ±¸µ¿Çϰí, À̹ø¿¡´Â .class¿Í .propertiesÆÄÀÏ¿¡ ÀÖ´Â 100°³ÀÇ ¿ä¼ÒµéÀ» »ç¿ëÇÏÀÚ. ÀÌÀü ÆÄÀÏÀÇ ´Ù¼¸ ¿ä¼Ò¸¦ 20¹ø º¹»çÇÏ°í º¹»çÇÒ ¶§¸¶´Ù óÀ½ºÎºÐÀ» ¾à°£ º¯°æÇÔÀ¸·Î½á °£´ÜÈ÷ ÆÄÀÏÀ» »ý¼ºÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î OkKey¸¦ OkKey1À¸·Î, CancelKey¸¦ CancelKey1·Î º¯°æÇÏ´Â ½ÄÀÌ´Ù. ÀÌ¿¡ ´ëÇÑ °á°ú´Â ÀÌÀüÀÇ °á°ú¿Í °°ÀÌ ·Îµù¿¡ À־´Â ListResourceBundleÀÌ ºü¸£°í ÆÐĪ¿¡ À־´Â PropertyResourceBundleÀÌ ºü¸¦ °ÍÀÌ´Ù. »ç½Ç PropertyResourceBundleÀÇ 100°³ ¿ä¼Ò¿¡ ´ëÇÑ ·Îµù½Ã°£Àº 5°³¸¦ ÆÐĪÇÏ´Â ½Ã°£°ú ºñ½ÁÇÏ´Ù´Â °É ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

ListResourceBundle
   Load: 12782686
   Fetch: 262788

PropertyResourceBundle
   Load: 12600795
   Fetch: 35175   

Áö¿ª°ªÀ» ¾ð¾î(Locale.ENGLISH)¿¡¼­ ¾ð¾î/Áö¿ª(Locale.US)À¸·Î ¹Ù²Ù¸é Á» ´õ Àç¹ÌÀÖ´Â °á°ú°¡ ³ªÅ¸³­´Ù.

Loading 5 / Locale.US:

ListResourceBundle
   Load: 13152117
   Fetch: 32921
   
PropertyResourceBundle
   Load: 14592024
   Fetch: 261060   
   
Loading 100 / Locale.US:

ListResourceBundle:
   Load: 12837863
   Fetch: 264264
   
PropertyResourceBundle   
   Load: 14468366
   Fetch: 33166

¸ðµç Ŭ·¡½º¿¡¼­ ListResourceBundleÀÌ Ãʱ⠹øµéÀ» ·ÎµùÇÏ´Â ½Ã°£Àº ¾ðÁ¦³ª ºü¸¥ ¹Ý¸é¿¡, ÆÐĪ ½Ã°£Àº °¡²û ´À¸®±âµµ ÇÑ´Ù. ±×·¸´Ù¸é ¾î¶² °ÍÀÌ ÁÁÀ»±î? ÀÛÀº ¸®¼Ò½º ¹øµéÀÇ °æ¿ì ListResourceBundleÀÌ µÑ Áß¿¡ ºü¸£°í, Å« °æ¿ì ListResourceBundle¸¦ »ç¿ëÇÏÁö ¾Ê´Â °ÍÀÌ ÁÁ¾Æ º¸ÀδÙ. ListResourceBundleÀº 2Â÷¿øÀ¸·Î ¹è¿­µÈ °ÍÀ» ·è¾÷¸ÊÀ¸·Î º¯°æ½ÃÄѾßÇϹǷΠÀ̰ÍÀÌ ´õ ´À¸° ÀÌÀ¯ÀÌ´Ù.

ÀÌ °á°úµéÀ» º¸¸é ListResourceBundle¸¦ »ç¿ëÇÏÁö ¾Ê°Ú´Ù°í ¸¶À½¸ÔÀ» ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î ¼­¹ö ±â¹Ý ÇÁ·Î±×·¥¿¡¼­ .class ÆÄÀϺ¸´Ù .properties ÆÄÀÏÀ» À¯ÁöÇÏ´Â °ÍÀÌ ´õ ½±°í, ·Îµù ½Ã°£Àº ¹«½ÃÇØµµ ±¦Âú´Ù°í ´À³¥ ¼ö ÀÖ´Ù. ±×·¯³ª ListResourceBundleÀº ´ÜÁö ½ºÆ®¸µÀÇ 2Â÷¿øÀû ¹è¿­¸¸ÀÌ ¾Æ´Ï´Ù. getContents ¸Þ¼Òµå´Â Object ¹è¿­À» ¸®ÅÏÇÑ´Ù.

   public Object[][] getContents()

À̰ÍÀº ¹«¾ùÀ» ÀǹÌÇϳª? °£´ÜÇÑ ½ºÆ®¸µÀ» ³Ñ¾î¼± ÄÁÅÙÃ÷¸¦ ·ÎÄÃÈ­ÇÏ°í ½Í´Ù¸é ¹Ýµå½Ã ListResourceBundle ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇØ¾ßÇÑ´Ù. ÀÌ´Â À̹ÌÁö, »ö±ò, Â÷¿ø µîÀ» ·ÎÄÃÈ­ÇØÁØ´Ù. PropertyResourceBundle¿¡¼­´Â ½ºÆ®¸µ ÀÌ¿ÜÀÇ ¿ÀºêÁ§Æ®¸¦ °¡Áú ¼ö ¾ø´Ù.

»ùÇà ÇÁ·Î±×·¥¿¡¼­ÀÇ ½Ã°£ Å×½ºÆ®´Â microbenchmark À¸·Î ¿©°ÜÁú ¼ö ÀÖÀ½À» ÁÖÀÇÇϱ⠹ٶõ´Ù. ÀÌ´Â ´ç¿¬È÷ ¹ßÀüµÉ °ÍÀÌÁö¸¸ ¸®¼Ò½º ¹øµé ·ÎµùÀÇ Ä³½ÌÀ¸·Î´Â ÇѹøÀÇ ±¸µ¿¿¡¼­ ¿©·¯ ¹øÀÇ ·çÇÎÀ» ½ÇÇàÇÒ ¶§ Á¤È®ÇÑ ·Îµù ½Ã°£À» ÃøÁ¤Çϱâ Èûµé´Ù. Microbenchmark¸¦ ÀÛ¼ºÇÏ´Â ±â¼ú¿¡ ´ëÇØ¼­´Â JavaOne 2002 ¹ßÇ¥ÀÚ·áÀÎ How NOT To Write A Microbenchmark¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù. µ¡ºÙ¿©, ÀÌ ºÐ¾ßÀÇ ¸¹Àº ¼º´É ÀÛ¾÷ÀÌ JDK 5.0¿¡¼­ ¿Ï·áµÇ¾úÀ¸¸ç Java 2 SDK, Standard Edition, v 1.4.x »ç¿ëÇÒ ¶§¿Í´Â ¼ýÀÚµéÀÌ ´ëü·Î ´Ù¸¦ °ÍÀÌ´Ù.

¸®¼Ò½º ¹øµé·Î ÀÛ¾÷ÇÏ´Â °Í¿¡ ´ëÇÑ Á» ´õ ¸¹Àº Á¤º¸´Â Java TutorialÀÇ javadoc for the ResourceBundle class, internationalization trail°ú Core Java InternationalizationÆäÀÌÁö¸¦ Âü°íÇϱ⠹ٶõ´Ù.

.
.

javadoc¿¡¼­ ListResourceBundles ¼û±â±â

ù¹øÂ° Å×Å©ÆÁ ¸®¼Ò½º ¹øµé ·ÎµùÇϱ⿡¼­ ListResourceBundle°ú PropertyResourceBundleÀÇ ¸î°¡Áö ¼º´ÉÀ» ºñ±³Çغ¸¾Ò¾ú´Ù. PropertyResourceBundle ·çÆ® ´ë½Å ListResourceBundles¸¦ »ç¿ëÇϱâ·Î Çß´Ù¸é °í·ÁÇØ¾ßÇÒ »çÇ×ÀÌ ÇѰ¡Áö ´õ ÀÖ´Ù. ¸®½ºÆ® ¸®¼Ò½º ¹øµé¿¡ ´ëÇÑ Å¬·¡½ºµéÀÌ ¹Ýµå½Ã °ø°³ Ŭ·¡½º·Î Á¤ÀǵǾî¾ßÇÑ´Ù´Â »ç½ÇÀÌ´Ù. ¹®Á¦´Â ¼Ò½º Æ®¸®¿¡ javadoc ÅøÀ» ±¸µ¿½Ãų ¶§ ¸®¼Ò½º ¹øµé Ŭ·¡½ºÀÇ API ¹®¼­°¡ °°Àº ÆÐŰÁö ¾È¿¡ ÀÖ´Ù¸é, ´Ù¸¥ Ŭ·¡½ºµé°ú °°ÀÌ ³ªÅ¸³­´Ù´Â °ÍÀÌ´Ù. ÀÌ·¯ÇÑ ±¸ÇöÀÇ ¼¼ºÎÀû »çÇ×Àº ¼û°ÜÁ® ÀÖ¾î¾ß ÇÑ´Ù. ¿Ö³ÄÇÏ¸é ³ªÁß¿¡ PropertyResourceBundle·Î º¯°æÇÏ¿´À» °æ¿ì °ø°³ Ŭ·¡½º°¡ »ç¶óÁö°í Á¦Ç°¿¡ ´ëÇÑ °ø°³ API´Â º¯°æµÇ±â ¶§¹®ÀÌ´Ù. ÀÌ ¹®Á¦¸¦ ¾î¶»°Ô ó¸®ÇÒ ¼ö ÀÖÀ»±î? ½ÇÁ¦·Î javadoc¿¡¼­ ListResourceBundles¸¦ ¼û±â´Â ¹æ¹ýÀÌ ÀÖÀ»±î? À̹ø Å×Å©ÆÁ¿¡¼­ ÀÌ¿¡ ´ëÇÑ ÇØ°áÃ¥À» º¸¿©ÁÖ·Á°íÇÑ´Ù.

javadoc ÅøÀº µðÆúÆ®°ªÀ¸·Î °á°ú¿¡¼­ Ŭ·¡½ºµéÀ» °¨Ãß´Â µÎ°¡Áö ¿É¼ÇÀ» Áö¿øÇÑ´Ù. ÆÄÀÏ ¾È¿¡ ÀÖ´Â ¸ðµç Ŭ·¡½ºÀÇ ¸®½ºÆ®¸¦ ÁöÁ¤Çϰí Åø·Î ÇÏ¿©±Ý ÀÌ °íÁ¤µÈ ¼¼Æ®¿¡ javadocÀ» ±¸µ¿Çϵµ·Ï Áö½ÃÇÒ ¼ö ÀÖ´Ù. ¶Ç´Â ÆÐŰÁö ¾È¿¡ ¸ðµç ¸®¼Ò½º ¹øµéÀ» À§Ä¡½Ã۰í Åø·Î ÇÏ¿©±Ý ¸®¼Ò½º ¹øµéÀÌ À§Ä¡ÇÑ ÆÐŰÁö¸¦ ¹«½ÃÇÏ´Â ÆÐŰÁöµéÀ» ±¸µ¿½Ãų ¼öµµ ÀÖ´Ù. ¸®½ºÆ®¸¦ À¯ÁöÇÏ´Â °ÍÀÌ ¾î·Æ±â ¶§¹®¿¡ ù¹øÂ° Å×Å©´ÐÀº Á» ¼º°¡½Ç ¼ö ÀÖ´Ù-. µÎ¹øÂ° Å×Å©´ÐÀ¸·Î´Â ¸®¼Ò½º ¹øµéÀ» »ç¿ëÇÏ´Â ¼Ò½º¿Í µ¿ÀÏÇÑ µð·ºÅ丮 ¾È¿¡ ¸®¼Ò½º ¹øµéÀ» º¸À¯ÇÏ´Â °ÍÀ» ¹æÁöÇϵµ·Ï ÇÑ´Ù.

ÀÚ, °á°ú¸¦ »ý¼ºÇÒ ¶§ ƯÁ¤ Ŭ·¡½º¸¦ ¹«½ÃÇϵµ·Ï ¾î¶»°Ô javadoc¸¦ »ç¿ëÀÚ Á¤ÀÇÇÒ ¼ö ÀÖÀ»±î? À̴ Ŭ·¡½ºµéÀÇ Àüü ¸®½ºÆ®¸¦ »ý¼º(¸®¼Ò½º ¹øµé Ŭ·¡½º ¾øÀÌ)ÇÏ´Â ´ë½Å °£´ÜÈ÷ ¸®¼Ò½º ¹øµé Ŭ·¡½ºµéÀÇ ¸®½ºÆ®¸¦ Á¦°øÇÔÀ¸·Î½á ÇØ°áÇÒ ¼ö ÀÖ´Ù.

ÀÌ ÇØ°áÃ¥Àº J2SE 1.4¿Í 5.0 ¹öÀü¿¡¼­ ¸ðµÎ ÀÛ¿ëÇÑ´Ù. À̸¦ À§Çؼ­´Â -excludefileÀ» Çã¿ëÇÏ´Â doclet¸¦ ±¸µ¿ÇÑ´Ù. -excludefile Àº »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ Å¬·¡½ºµéÀ» Á¦¿ÜÇÑ´Ù. ´ÙÀ½Àº docletÀ» ±¸µ¿ÇÏ´Â ¹æ¹ýÀÌ´Ù.(Ä¿¸àÆ®µéÀÌ ÇÑ ÁÙ¿¡ µé¾î°¡¾ßÇÔÀ» ÁÖÀÇÇϱ⠹ٶõ´Ù.)

   java -classpath <path to doclet and path to tools.jar>
     ExcludeDoclet -excludefile <path to exclude file> 
     <javadoc options>

Ä¿¸àÆ®¿¡ ´ëÇÑ ¹ÝÀÀÀ¸·Î Doclet Ŭ·¡½ºÀÇ validOptions ¸Þ¼­µå´Â -excludefile ¿É¼ÇÀ» ã´Â´Ù. ã°Ô µÇ¸é, ¸Þ¼­µå´Â Á¦¿ÜµÈ ÆÄÀÏ(¹«½ÃµÈ Ŭ·¡½ºµé°ú ÆÐŰÁöµé)ÀÇ ÄÁÅÙÃ÷¸¦ Àд´Ù. ±× ÈÄ start ¸Þ¼­µå°¡ È£ÃâµÈ´Ù. °¢ Ŭ·¡½º ¶Ç´Â ÆÐŰÁö°¡ ÁøÇàµÊ¿¡ µû¶ó ¸Þ¼Òµå´Â Á¦¿ÜµÈ Ŭ·¡½ºµé°ú ÆÐŰÁöµéÀ» ¹ö¸®°Ô µÈ´Ù. DocletÀº optionLength ¸Þ¼Òµå¸¦ Æ÷ÇÔÇϸç, ÀÌ´Â docletÀÌ J2SE 1.4¿Í 5.0¿¡¼­ ±¸µ¿µÉ ¼ö ÀÖ°Ô ÇÑ´Ù. ´ÙÀ½Àº ExcludeDocletÀÌ´Ù.

   import java.io.*;
   import java.util.*;
   import com.sun.tools.javadoc.Main;
   import com.sun.javadoc.*;

   /**
    * A wrapper for Javadoc.  Accepts an additional option 
    * called "-excludefile", which specifies which classes
    * and packages should be excluded from the output.
    * 
    * @author Jamie Ho
    */
   public class ExcludeDoclet extends Doclet {
     private static List m_args = new ArrayList();
     private static Set m_excludeSet = new HashSet();
    
   /**
    * Iterate through the documented classes and remove the
    * ones that should be excluded.
    * 
    * @param root the initial RootDoc (before filtering).
    */
     public static boolean start(RootDoc root) {
       root.printNotice
          ("\n\nRemoving excluded source files.......\n\n");
       ClassDoc[] classes = root.classes();
       for (int i = 0; i < classes.length; i++) {
         if (m_excludeSet.contains(classes[i].qualifiedName()) ||
             m_excludeSet.contains
                (classes[i].containingPackage().name())) {
           root.printNotice
              ("Excluding " + classes[i].qualifiedName());
           continue;
         }
         m_args.add(classes[i].position().file().getPath());   
       }
       root.printNotice("\n\n");
       return true;
     }
    
   /**
    * Let every option be valid.  The real validation happens 
    * in the standard doclet, not here.  Remove the "-excludefile" 
    * and "-subpackages" options because they are not needed by 
    * the standard doclet.
    * 
    * @param options the options from the command line.
    * @param reporter the error reporter.
    */
     public static boolean validOptions(String[][] options,
        DocErrorReporter reporter) {
       for (int i = 0; i < options.length; i++) {
         if (options[i][0].equalsIgnoreCase("-excludefile")) {
           try {
             readExcludeFile(options[i][1]);
           } catch (Exception e) {
             e.printStackTrace();   
           }
           continue;
         }
         if (options[i][0].equals("-subpackages")) {
           continue;   
         }
         for (int j = 0; j < options[i].length; j++) {
           m_args.add(options[i][j]);   
         }
       }
       return true;
     }

   /**
    * Parse the file that specifies which classes and packages
    * to exclude from the output. You can write comments in this
    * file by starting the line with a '#' character.
    * 
    * @param filePath the path to the exclude file.
    */
     private static void readExcludeFile(String filePath)
         throws Exception {
       LineNumberReader reader =
        new LineNumberReader(new FileReader(filePath));
       String line;
       while ((line = reader.readLine()) != null) {
         if (line.trim().startsWith("#"))
           continue;
         m_excludeSet.add(line.trim());
       }
     }

   /**
    * Method required to validate the length of the given option.
    * This is a bit ugly but the options must be hard coded here.
    * Otherwise, Javadoc will throw errors when parsing options.
    * We could delegate to the Standard doclet when computing 
    * option lengths, but then this doclet would be dependent on 
    * the version of J2SE used.  I'd rather hard code so that 
    * this doclet can be used with 1.4.x or 1.5.x.
    * 
    * @param option the option to compute the length for. 
    */
     public static int optionLength(String option) {
        
       if (option.equalsIgnoreCase("-excludefile")) {
         return 2;   
       }
        
       //General options
       if (option.equals("-author") ||
           option.equals("-docfilessubdirs") ||
           option.equals("-keywords") ||
           option.equals("-linksource") ||
           option.equals("-nocomment") ||
           option.equals("-nodeprecated") ||
           option.equals("-nosince") ||
           option.equals("-notimestamp") ||
           option.equals("-quiet") ||
           option.equals("-xnodate") ||
           option.equals("-version")) {
         return 1;
       } else if (option.equals("-d") ||
           option.equals("-docencoding") ||
           option.equals("-encoding") ||
           option.equals("-excludedocfilessubdir") ||
           option.equals("-link") ||
           option.equals("-sourcetab") ||
           option.equals("-noqualifier") ||
           option.equals("-output") ||
           option.equals("-sourcepath") ||
           option.equals("-tag") ||
           option.equals("-taglet") ||
        option.equals("-tagletpath")) {
         return 2;
       } else if (option.equals("-group") ||
           option.equals("-linkoffline")) {
         return 3;
       } 
        
       //Standard doclet options
       option = option.toLowerCase();
       if (option.equals("-nodeprecatedlist") ||
           option.equals("-noindex") ||
           option.equals("-notree") ||
           option.equals("-nohelp") ||
           option.equals("-splitindex") ||
           option.equals("-serialwarn") ||
           option.equals("-use") ||
           option.equals("-nonavbar") ||
           option.equals("-nooverview")) {
         return 1;
       } else if (option.equals("-footer") ||
           option.equals("-header") ||
           option.equals("-packagesheader") ||
           option.equals("-doctitle") ||
           option.equals("-windowtitle") ||
           option.equals("-bottom") ||
           option.equals("-helpfile") ||
           option.equals("-stylesheetfile") ||
           option.equals("-charset") ||
           option.equals("-overview")) {
         return 2;
       } else {
         return 0;
       }
     }

   /**
    * Execute this doclet to filter out the unwanted classes
    * and packages. Then execute the standard doclet.
    * 
    * @param args The Javadoc arguments from the command line.
    */
     public static void main(String[] args) {
       String name = ExcludeDoclet.class.getName();
       Main.execute(name, name, args);
       Main.execute((String[]) m_args.toArray(new String[] {}));
     }
   }

´ÙÀ½°ú °°ÀÌ docletÀ» ÄÄÆÄÀÏÇÏÀÚ.

  javac -classpath tools.jar ExcludeDoclet.java 

tools.jar¸¦ JDK ÀνºÅçÀÇ ÀûÀýÇÑ À§Ä¡·Î º¯°æÇÏÀÚ. ¿¹¸¦ µé¾î À©µµ¿ì ȯ°æ¿¡¼­ ±¸µ¿Çϰí JDK¸¦ c:\jdk1.5.0 directory, specify c:\jdk1.5.0\lib\tools.jar¿¡ ÀνºÅçÇß´Ù¸é, c:\jdk1.5.0\lib\tools.jar·Î ÁöÁ¤ÇÑ´Ù.

´ÙÀ½À¸·Î skip.txt°ú °°Àº ÆÄÀÏÀ» »ý¼ºÇÏ¿© ¾î¶² Ŭ·¡½º¸¦ ½ºÅµÇÒ °ÍÀÎÁö È®ÀÎÇÑ´Ù. º¸Åë ÀÌ´ÂListResourceBundle ¼­ºêŬ·¡½ºµéÀÌ µÉ °ÍÀÌ´Ù. ÀÌ¿¡ ´ëÇÑ ¿¹Á¦·Î, Ç¥ÁØ JDK Ŭ·¡½º·Î ExcludeDoclet¸¦ ±¸µ¿Çϰí java.lang ÆÐŰÁö¸¦ ¹«½ÃÇÏÀÚ.

   java.lang.Math
   java.lang.Long
   java.lang.InternalError 
   java.lang.InterruptedException 
   java.lang.Iterable 
   java.lang.LinkageError

´ÙÀ½ÀÇ Ä¿¸àµå(ÇÑ ÁÙ¿¡ À§Ä¡)¸¦ ±¸µ¿ÇÏÀÚ.

   java -classpath .;c:\jdk1.5.0\lib\tools.jar ExcludeDoclet 
     -d docs -excludefile skip.txt -sourcepath c:\jdk1.5.0\src 
     -source 1.5 java.lang

ÀÌ Ä¿¸àµå´Â skip.txt ·Î ½Äº°µÈ 6°³ÀÇ Å¬·¡½º¿Í ÀÎÅÍÆäÀ̽ºµéÀ» Á¦¿ÜÇÑ java.lang ÆÐŰÁö¿¡ ´ëÇÑ javadocÀ» »ý¼ºÇÒ °ÍÀÌ´Ù.

´ÙÀ½Àº »ý¼ºµÈ javadocÀÇ ÀϺηνá java.lang ÆÐŰÁöÀÇ ÀÎÅÍÆäÀ̽ºµéÀ» º¸¿©ÁÖ°íÀÖ´Ù. Iterable ÀÎÅÍÆäÀ̽º°¡ Á¦¿ÜµÇ¾úÀ½À» À¯ÀÇÇϱ⠹ٶõ´Ù.

»ç¿ëÀÚ Á¤ÀÇ docletÀÇ »ý¼º¿¡ ´ëÇÑ Á» ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â Generating Custom Doclets¸¦ Âü°íÇϱ⠹ٶõ´Ù.

.
.
.

Reader Feedback

  ¸Å¿ì ÁÁ´Ù    ÁÁ´Ù    ±×Àú ±×·¸´Ù 

 

ÀÚ¹Ù ÇÁ·Î±×·¡¹ÖÀÌ ±Ã±ÝÇϼ¼¿ä? Java Online SupportÀ» Âü°íÇϼ¼¿ä.

.
.

º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù. °ü·Ã¹®ÀÇ : SKDN@sun.com
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϽ÷Á¸é ¼ö½Å°ÅºÎ¸¦ Ŭ¸¯ÇØ ÁÖ¼¼¿ä.

Copyright 2003-2005 Sun Korea, Inc. All rights reserved.

Sun Microsystems, Inc.
.
.