Java String

ํŠน์ •ํ•œ ๋ฌธ์ž์—ด์„ ๊ณ„์†์ ์œผ๋กœ ๋”ํ•˜์—ฌ ๊ฒฐ๊ณผ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์žˆ์—ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ ์‚ฌ์šฉํ–ˆ๋˜ ๋ฌธ์ž์—ด Class์— ๋Œ€ํ•œ ๋ฌธ์ œ์˜€๋‹ค. ๊ฐ ๋ฌธ์ž์—ด Class์— ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ํฌ์ŠคํŒ…์„ ํ•œ๋‹ค.

String, StringBuilder, String Buffer์˜ ์ฐจ์ด.

  • String : ๊ธฐ์กด์˜ ๋ฌธ์ž์—ด์— ๋ฌธ์ž๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ง€์ •ํ•˜๊ณ  ๊ธฐ์กด์˜ ๋ฌธ์ž์—ด ๊ฐ์ฒด๋Š” ์“ฐ๋ ˆ๊ธฐ๊ฐ€ ๋œ๋‹ค.
  • StringBuilder : ๊ธฐ์กด์˜ ๋ฌธ์ž์—ด ๊ฐ์ฒด์˜ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ๊ฐ’์„ ๋”ํ•œ๋‹ค. // ๋™๊ธฐํ™” ๊ธฐ๋Šฅ ์ œ๊ณต X
  • StringBuffer : ๊ธฐ์กด์˜ ๋ฌธ์ž์—ด ๊ฐ์ฒด์˜ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ๊ฐ’์„ ๋”ํ•œ๋‹ค. // ๋™๊ธฐํ™” ๊ธฐ๋Šฅ ์ œ๊ณต O

Test Code

/**
 * Created by nesoy on 2017. 11. 16..
 * blog : https:nesoy.github.io
 * email : kyoje11@gmail.com
 */
public class Main {
    public static void main(String[] args) {
        test_string(100);
        test_stringBuilder(100);
        test_stringBuffer(100);
 
        test_string(1000);
        test_stringBuilder(1000);
        test_stringBuffer(1000);
 
        test_string(10000);
        test_stringBuilder(10000);
        test_stringBuffer(10000);
 
        test_string(100000);
        test_stringBuilder(100000);
        test_stringBuffer(100000);
 
    }
 
    public static void test_string(int size) {
        long start = System.currentTimeMillis();
 
        String test = "";
        for (int i = 0; i < size; i++) {
            test += i;
        }
 
        long end = System.currentTimeMillis();
        System.out.println("String");
        System.out.println("ํฌ๊ธฐ : " + size + " ์‹œ๊ฐ„ : " + (end - start));
 
    }
 
    public static void test_stringBuilder(int size) {
        long start = System.currentTimeMillis();
 
        StringBuilder testBuilder = new StringBuilder();
        for (int i = 0; i < size; i++) {
            testBuilder.append(i);
        }
 
        long end = System.currentTimeMillis();
        System.out.println("StringBuilder");
        System.out.println("ํฌ๊ธฐ : " + size + " ์‹œ๊ฐ„ : " + (end - start));
    }
 
    public static void test_stringBuffer(int size) {
        long start = System.currentTimeMillis();
 
        StringBuffer testBuilder = new StringBuffer();
        for (int i = 0; i < size; i++) {
            testBuilder.append(i);
        }
 
        long end = System.currentTimeMillis();
        System.out.println("StringBuffer");
        System.out.println("ํฌ๊ธฐ : " + size + " ์‹œ๊ฐ„ : " + (end - start));
        System.out.println();
    }
}

Result

  • String์ด ๋งŽ์€ ์—ฐ์‚ฐ์„ ํ•˜๊ฒŒ๋˜๋ฉด ํ™•์—ฐํ•˜๊ฒŒ ๋Š๋ฆฐ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

Thinking - Update 2018.09.14

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ String์ด Immutableํ•˜๊ฒŒ ์„ค๊ณ„ํ–ˆ์„๊นŒ?

  • immutableํ•˜๊ฒŒ ์„ค๊ณ„ํ•จ์œผ๋กœ์จ Side effect๋ฅผ ์ตœ๋Œ€ํ•œ ์ œ๊ฑฐํ•˜๋ ค๋Š” ์˜๋„์ธ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์‹ค์ œ๋กœ Side effect๋Š” ์ค„์—ˆ์ง€๋งŒ Memory๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” issue๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ์— mutableํ•œ StringBuilder๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ์ง€๋งŒ Thread-Safeํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • mutableํ•˜๋ฉด์„œ Thread-Safeํ•œ StringBuffer๊ฐ€ ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.