ÀÚ¹Ù¿¡¼ ¹®ÀÚ¸¦ ±¸ºÐÀÚ·Î ºÐ¸®Çϱâ
¼¿·ºÆ®¸®½ºÆ®ÀÇ ÇϳªÀÇ ¿É¼Ç¿¡ ¿©·¯ °ª(Value)À» Áà¾ß ÇÒ °æ¿ì º¸Åë ±¸ºÐÀÚ(delimiter)¸¦ ³Ö¾îµÎ°í ±× ±¸ºÐÀÚ¸¦ ±âÁØÀ¸·Î ÇÏ¿© ÇϳªÀÇ ÅؽºÆ®¸¦ ¿©·¯ °ªÀ¸·Î ºÐ¸®Çس»´Â ¹æ½ÄÀ» »ç¿ëÇÑ´Ù.
<body>
<select id="select_list">
<option value="APPLE|CARROT|PIZZA">Foods</option>
</select>
<script>
var options = $("#select_list option:selected").val();
var values = options.split("|");
var params = "?FRUIT=" + values[0];
params += "&VEGETABLE=" + values[1];
params += "&INSTANT=" + values[2];
/*
values[0] = "APPLE"
values[1] = "CARROT"
values[2] = "PIZZA"
*/
</script>
</body>
ÁַΠŬ¶óÀ̾ðÆ®Ãø¿¡¼ ƯÁ¤ Á¶°Ç °ªÀ¸·Î Á¶È¸(SELECT)¸¦ ÇÒ ¶§ À§¿Í °°ÀÌ view ´Ü¿¡¼ ÀÚ¹Ù½ºÅ©¸³Æ®¸¦ ÅëÇØ ¾Æ¿¹ ´Ù ºÐ¸®¸¦ ÇÑ ´ÙÀ½ Äõ¸®½ºÆ®¸µÀ» ¸¸µé¾î HTTP GET ¿äûÀ» º¸³Â´Ù.
À̹ø¿¡ ¾î¼´Ùº¸´Ï À§¿Í °°ÀÌ ±¸ºÐÀÚ·Î ±¸ºÐµÇ´Â ÇϳªÀÇ ¹®ÀÚ¿À» ¼¹ö¿¡¼ ó¸®ÇÏ°Ô µÇ¾ú´Âµ¥, ÀÚ¹Ù¿Í ÀÚ¹Ù½ºÅ©¸³Æ®ÀÇ split ÀÌ ºñ½ÁÇÏ°Ô µ¿ÀÛÇÏ´Â °ÍÀ¸·Î ±â¾ïÇÏ°í ±¸ÇöÇÏ¿´´Ù°¡ API ¹®¼¸¦ ÅëÇØ À߸ø ±â¾ïÇÏ°í ÀÖ´Ù´Â °É ±ú´Ý°í ¡®³»°¡ ÀÚ¹Ù¿¡¼ split À» ÀÌ·¸°Ô ¾È½áºÃ³ª?¡¯ ÇÏ´Â ¸¶À½¿¡ Çѹø Á¤¸®ÇÑ´Ù.
java.lang.String.split(String regex)
¸ÕÀú, java.lang.String
Ŭ·¡½º¿¡ Æ÷ÇԵǾî ÀÖ´Â split ¸Å¼Òµå´Â ±¸ºÐÀÚ·Î ¹Þ´Â ¸Å°³º¯¼ö°¡ Á¤±Ô½Ä
ÀÌ´Ù. (limit
µµ ¸Å°³º¯¼ö·Î ¹Þµµ·Ï ¿À¹ö·Îµù µÈ ¸Þ¼Òµåµµ ÀÖÁö¸¸, ÀÌ ±ÛÀÇ ÁÖ °ü½É»ç´Â ¾Æ´Ï¹Ç·Î Á¦¿Ü)
@Test
public void splitTest() {
String text = "APPLE|CARROT|PIZZA";
String [] array = text.split("|");
assertEquals(3, array.length);
}
/*
Test Failed
java.lang.AssertionError:
Expected :3
Actual :18
*/
À§´Â ÀÚ¹Ù¿¡¼ ÀÚ¹Ù½ºÅ©¸³Æ®¿Í °°Àº ¹æ½ÄÀ¸·Î split À» »ç¿ëÇÏ¿´´Ù°¡ ½ÇÆÐÇÑ Å×½ºÆ®ÀÌ´Ù.
ÀÚ¹Ù½ºÅ©¸³Æ®¿Í °°ÀÌ µ¿ÀÛÇß´Ù¸é ¹è¿ÀÇ ±æÀÌ´Â 3ÀÌ µÇ¾î¾ß ÇßÀ¸³ª, ¹è¿ÀÇ ±æÀÌ°¡ 18ÀÌ´Ù(¿å ¾Æ´Ô). Áö±Ý array
¹è¿¿¡´Â text
¸¦ ÇѱÛÀÚ¾¿ ÂÉ°³¼ µé¾î°¡ ÀÖ´Ù.
(fa|mo|(br|b)?o)ther
Á¤±Ô½Ä¿¡¼ |
(Vertical Bar)´Â OR ·Î ÀνÄÇÑ´Ù°í ÇÑ´Ù. À§¿Í °°Àº Á¤±Ô½Ä Á¶°ÇÀÌ ÀÖ´Ù°í ÇÒ¶§, father, mother, bother, brother, other ´Ü¾î ¸ðµÎ À§ Á¶°ÇÀ» Åë°úÇÒ ¼ö ÀÖ´Ù.
±×·±µ¥ ±×·³ Á¤±Ô½ÄÀº Á¤±Ô½ÄÀÌ°í ¿Ö ÇѱÛÀÚ¾¿ ÂÉ°³Á®¼ ¹è¿¿¡ µé¾î°¡´À³Ä? ¼ÖÁ÷È÷ À̸®Àú¸® ã¾Æ ºÃ´Âµ¥ ¼¼·Î ¹Ù(|)°¡ ¿¹¾à¾î¶ó´Â ´äº¯µé ¹Û¿¡´Â ãÁö ¸øÇß´Ù. Á÷Á¢ µð¹ö±ë ¸ðµå·Î ÃßÀû ÇغÃÁö¸¸, split À» ¼öÇàÇϱâ À§ÇØ Pattern
Ŭ·¡½º »Ó¸¸ ¾Æ´Ï¶ó ¸¹Àº Ŭ·¡½ºµéÀ» Ÿ°í µé¾î°¡¼ ¸íÈ®ÇÑ µ¿ÀÛ ¹æ½ÄÀ» ÀÌÇØÇϱⰡ Èûµé¾ú´Ù. ¿©Æ° ÀÚ¹Ù¿¡¼ split
¸Þ¼Òµå¿¡ ¸Å°³º¯¼ö·Î ³Ñ¾î°¡´Â ¹®ÀÚ´Â ´Ü¼ø ¹®ÀÚ°¡ ¾Æ´Ï¶ó Á¤±Ô½Ä À̶ó´Â °Í°ú split
ÇÏ´Â °ÍÀÌ ±²ÀåÈ÷ º¹ÀâÇÑ °úÁ¤À» °ÅÄ£´Ù´Â °ÍÀ» ±â¾ïÇؾ߰ڴÙ.
java.util.StringTokenizer
ÀÚ¹Ù¿¡´Â ¹®ÀÚ¸¦ ºÐ¸®Çϱâ À§ÇØ split
¸»°í StringTokenizer
¶ó´Â Ŭ·¡½ºµµ ÀÖ´Ù. ½ºÇø´ Àº JDK 1.4
ºÎÅÍ Áö¿øµÆ°í, ÅäÅ©³ªÀÌÀú´Â JDK 1.0
ºÎÅÍ Áö¿øÇߴµ¥, API ¹®¼¸¦ Àо¸é ÅäÅ©³ªÀÌÀú ´ë½Å ½ºÇø´À» »ç¿ëÇÒ °ÍÀ» ±ÇÀåÇÑ´Ù. ÇÏÁö¸¸ @deprecated
µÈ Ŭ·¡½º´Â ¾Æ´Ï´Ù.
@Test
public void toknizerTest() {
String text = "APPLE|CARROT|PIZZA";
StringTokenizer st = new StringTokenizer(text, "|");
String [] array = new String[3];
int i = 0;
while (st.hasMoreTokens()) {
array[i] = st.nextToken();
i++;
}
assertEquals(3, array.length);
}
½ºÇø´°ú ´Þ¸® ÅäÅ©³ªÀÌÀú´Â ¹®ÀÚ ±×´ë·Î¸¦ ±¸ºÐÀÚ·Î »ç¿ëÇϱ⠶§¹®¿¡ À§ ÄÚµå´Â ¼º°øÇÏ´Â Å×½ºÆ®ÀÌ´Ù. ÇÏÁö¸¸ ÅäÅ©³ªÀÌÀú´Â Ŭ·¡½ºÀ̱⠶§¹®¿¡ ºÐ¸®ÇÏ°í Çϳª¾¿ ÀÐ¾î µéÀÌ´Â ¹ø°Å·Î¿î °úÁ¤°ú ±× ÄÚµåµéÀÌ ¸ðµÎ »ç¿ëÇÏ´Â ÂÊ¿¡ µå·¯³´Ù.
Benchmark
ÃÖ±Ù¿¡ JMH (http://openjdk.java.net/projects/code-tools/jmh/) ¶ó´Â ÀÚ¹Ù ¼º´ÉÃøÁ¤ ÅøÀ» ¾Ë°Ô µÇ¾î ½ºÇø´°ú ÅäÅ©³ªÀÌÀú ¼º´Éºñ±³¸¦ Çѹø ÇغôÙ. ±²ÀåÈ÷ ¾à½ÄÀ¸·Î ÇÏ¿´°í, ÀüÁ¦Á¶°Ç µîµµ Á¦´ë·Î ¼³Á¤ÇÏ°í µ¹¸° º¥Ä¡¸¶Å©°¡ ¾Æ´Ï±â ¶§¹®¿¡ ±×³É °¡º±°Ô º¸¸é ÁÁ°Ú´Ù.
@Benchmark
public void splitTest() {
String text = "APPLE|CARROT|PIZZA";
String [] array = text.split("|");
}
@Benchmark
public void toknizerTest() {
String text = "APPLE|CARROT|PIZZA";
StringTokenizer st = new StringTokenizer(text, "|");
String [] array = new String[3];
int i = 0;
while (st.hasMoreTokens()) {
array[i] = st.nextToken();
i++;
}
}
# JMH 1.12 (released 105 days ago, please consider updating!)
# VM version: JDK 1.8.0_73, VM 25.73-b02
# VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home/jre/bin/java
# VM options: -Dfile.encoding=UTF-8
# Warmup: 20 iterations, 1 s each
# Measurement: 20 iterations, 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread, will synchronize iterations
# Benchmark mode: Throughput, ops/time
# Benchmark: com.test.StringBenchmark.splitTest
Benchmark Mode Cnt Score Error Units
splitTest thrpt 200 1227784.106 ¡¾ 10013.248 ops/s
toknizerTest thrpt 200 12667246.536 ¡¾ 171699.957 ops/s
°á·Ð
¾îÂîµÆµç ÀÚ¹Ù¿¡¼µµ ÅäÅ©³ªÀÌÀú Ŭ·¡½º º¸´Ù´Â ½ºÇø´ ¸Þ¼Òµå¸¦ »ç¿ëÇÒ °ÍÀ» ±ÇÀåÇÏ°í ÀÖ´Ù. ½ºÇø´ ¸Þ¼Òµå´Â Á¤±ÔÇ¥Çö½ÄÀ» ÅëÇØ Á¤±Ô½Ä »Ó¸¸ ¾Æ´Ï¶ó ¹®ÀÚ¸¦ ±¸ºÐÀڷεµ »ç¿ëÇÒ ¼ö ÀÖÁö¸¸ ÅäÅ©³ªÀÌÀú´Â Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÒ ¼ö´Â ¾ø´Ù. ±×¸®°í À§¿¡µµ Àû¾úÁö¸¸ ¹®ÀÚ¸¦ ±¸ºÐÀÚ·Î ºÐ¸®ÇÏ°í ÀÌÅÍ·¹ÀÌÆ®(iterate) ÇÏ´Â °úÁ¤ÀÌ ¸ðµÎ »ç¿ëÇÏ´Â ÂÊ¿¡¼ Äڵ尡 µå·¯³ª±â ¶§¹®¿¡ º°·ÎÀÎ °Í °°´Ù.
String [] array = text.split("\\|");
String [] array = text.split((Pattern.quote("|")));
½ºÇø´ ¸Þ¼Òµå¿¡¼ ¼¼·Î ¹Ù(|)·Î ¹®ÀÚ¸¦ ºÐ¸®Çϱâ À§Çؼ´Â À§¿Í °°ÀÌ ¿ª½½·¡½¬¸¦ µÎ°³ Æ÷ÇÔÇϰųª, Pattern
Ŭ·¡½º¸¦ È°¿ëÇÏ¸é µÇ°Ú´Ù.
Âü°íÀÚ·á
- http://stackoverflow.com/questions/5675704/java-string-split-not-returning-the-right-values
- http://stackoverflow.com/questions/6983856/why-is-stringtokenizer-deprecated
- http://library1008.tistory.com/16
- ÀÚ¹ÙÀÇ ½Å Vol 2 ÁÖ¿ä API ÀÀ¿ëÆí, ÀÌ»ó¹Î Àú
- ÁøÂ¥ Àß ¸¸µç Á¤±Ô½Ä ½½¶óÀÌµå °Ãß! Ãʺ¸ÀÚ¸¦ À§ÇÑ Á¤±Ô Ç¥Çö½Ä °¡À̵å
Ãâó: http://www.iamkyu.com/108 [My Library]