|
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¸¦ Âü°íÇϱ⠹ٶõ´Ù.
º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù. °ü·Ã¹®ÀÇ : SKDN@sun.com
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϽ÷Á¸é ¼ö½Å°ÅºÎ¸¦
Ŭ¸¯ÇØ ÁÖ¼¼¿ä.
Copyright 2003-2005 Sun Korea, Inc. All rights reserved.
|