String์„ ์“ฐ์ง€๋งˆ?

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์‘๋‹ต ์‹œ๊ฐ„์„ ํ™•์ธํ•œ๋‹ค.

์ธก์ •ํ•  ์ฝ”๋“œ๋Š” String, StringBuffer, StringBuilder์˜ ์—ฐ์‚ฐ์„ ์ธก์ • ํ•  ๊ฒƒ์ด๋‹ค.

// ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์‹คํ–‰ํ•˜์—ฌ ์ดˆ๊ธฐํ™”
System.gc();
try {
    Thread.sleep(100); // GC๊ฐ€ ์™„๋ฃŒ๋  ์‹œ๊ฐ„์„ ์ฃผ๊ธฐ ์œ„ํ•œ ๋Œ€๊ธฐ ์‹œ๊ฐ„
} catch (InterruptedException e) {
    e.printStackTrace();
}

// ์‹คํ–‰ ์ „ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ & ์‹œ๊ฐ„ ์กฐํšŒ
long startTime = System.currentTimeMillis();
long before = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
System.out.println("Before memory: " + before);

// ์ธก์ •ํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ


// ์‹คํ–‰ ํ›„ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์กฐํšŒ
long after = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
System.out.println("After memory: " + after);

// ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ธก์ •
long usedMemory = (after - before) / 1024 / 1024;
System.out.println("Used Memory: " + usedMemory + " MB");

// ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ• ๋‹น๋œ ํž™ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์ด์ฆˆ. ์ด ์‚ฌ์ด์ฆˆ๋ฅผ ๋„˜์–ด์„œ๋ฉด OOM ๋ฐœ์ƒ
long heapSize = Runtime.getRuntime().maxMemory();
System.out.println("Heap Size: " + heapSize / 1024 / 1024 + " MB");

long endTime = System.currentTimeMillis();
long durationInMillis = endTime - startTime;
double durationInSeconds = durationInMillis / 1000.0;
System.out.println("์‘๋‹ต ์‹œ๊ฐ„: " + durationInSeconds + "์ดˆ");

String, StringBuffer, StringBuilder ์–ด๋–ค๊ฑธ ์‚ฌ์šฉํ•˜์ง€?

๊ฐ๊ฐ 100,000๋ฒˆ ์—ฐ์‚ฐ์„ ํ†ตํ•œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์‘๋‹ต ์‹œ๊ฐ„์„ ๋น„๊ตํ•ด๋ณด์ž.

์ธก์ • ๊ฒฐ๊ณผ
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰
์‘๋‹ต ์‹œ๊ฐ„

String

497MB

3.5558์ดˆ

StringBuffer

3MB

0.019์ดˆ

StringBuilder

3MB

0.028์ดˆ

StringBuffer์™€ StringBuilder๋Š” ๊ฑฐ์˜ ๋˜‘๊ฐ™๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿผ ์™œ String๋งŒ ์ €๋Ÿด๊นŒ?

์•„๋ž˜ ํŠน์ง•์„ ํ†ตํ•ด์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

String

  • String์€ ๋ถˆ๋ณ€(Immutable) ๊ฐ์ฒด์ด๋‹ค. ๋”ฐ๋ผ์„œ String์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์€ ๊ณ„์† ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๊ณ , ์ด์ „ ๊ฐ์ฒด๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์“ฐ๋ ˆ๊ธฐ ๊ฐ’์ด ๋˜์–ด GC ๋Œ€์ƒ์ด ๋œ๋‹ค. ์ด๋Ÿฐ ์ž‘์—…์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•จ๊ณผ ๋™์‹œ์— ์‘๋‹ต ์†๋„์— ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค.

  • GC๋ฅผ ํ• ์ˆ˜๋ก ์‹œ์Šคํ…œ์˜ CPU๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

  • ์งง์€ ๋ฌธ์ž์—ด์„ ์—ฐ์‚ฐํ•˜๋Š” ๊ฒฝ์šฐ๋‚˜ ๋ฌธ์ž์—ด์˜ ๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ์—†๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค.

StringBuffer

  • ์Šค๋ ˆ๋“œ์— ์•ˆ์ „ํ•œ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ํ˜„์žฌ

  • StringBuffer๋Š” ๋‚ด๋ถ€์— synchronized lock์ด ์žˆ์–ด์„œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ thread-safeํ•˜๋‹ค.

  • ๊ฐ€๋ณ€(Mutable) ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์„œ ๋ถ€ํ•˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

  • thread-safeํ•œ ํ”„๋กœ๊ทธ๋žจ ๋˜๋Š” ํ˜„์žฌ ์‹œ์Šคํ…œ์ด thread-safeํ•œ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค.

  • thread-safe ํ•ด์„œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์—์„œ๋Š” ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

StringBuilder

  • StringBuffer์™€ ๋™์ผํ•˜๊ฒŒ ๊ฐ€๋ณ€ ๊ฐ์ฒด์ด๋‹ค.

  • thread-safe ํ•˜์ง€ ์•Š์•„์„œ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • thread-safe๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์€ ์‹œ์Šคํ…œ์ด๋‚˜ ๊ณต์œ  ์ž์›์ด ์•„๋‹Œ ๋ฉ”์†Œ๋“œ ๋‚ด๋ถ€์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๊ฐ๊ฐ์˜ ํŠน์ง•์„ ๊ณ ๋ คํ•ด์„œ ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ฒ ๋‹ค.

Last updated