CORE
HOME > JAVA > J2SE > CORE
2017.03.29 / 14:11

ÀÚ¹Ù¿¡¼­ ¹®ÀÚ¸¦ ±¸ºÐÀÚ·Î ºÐ¸®Çϱâ

½ºÄÚ´Ù
Ãßõ ¼ö 311

¼¿·ºÆ®¸®½ºÆ®ÀÇ ÇϳªÀÇ ¿É¼Ç¿¡ ¿©·¯ °ª(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://www.iamkyu.com/108 [My Library]