๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โŒจ๏ธ Language/Java

[Java] String vs StringBuilder vs StringBuffer

by hyebin (Helia) 2025. 5. 20.
๋ฐ˜์‘ํ˜•

Java์—์„œ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃฐ ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค๋Š” String์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ, ๋™๊ธฐํ™” ์—ฌ๋ถ€, ์ˆ˜์ • ๊ฐ€๋Šฅ์„ฑ ๋“ฑ์— ๋”ฐ๋ผ StringBuilder, StringBuffer๋„ ํ•จ๊ป˜ ์•Œ์•„๋‘๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ด ์„ธ ๊ฐ€์ง€ ๋ฌธ์ž์—ด ํด๋ž˜์Šค์˜ ์ฐจ์ด์ ๊ณผ ์ƒํ™ฉ์— ๋”ฐ๋ฅธ ์ ์ ˆํ•œ ์„ ํƒ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


โœ… String

String์€ Java์—์„œ ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

๋ถˆ๋ณ€ ๊ฐ์ฒด(immutable) ์ด๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ ๋ฒˆ ์ƒ์„ฑ๋œ ๋ฌธ์ž์—ด์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ˆ˜์ •์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ, ๊ธฐ์กด ๊ฐ์ฒด๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

String str1 = "hello";
str1 += " world";  // ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด ๊ฐ์ฒด ์ƒ์„ฑ
์œ„ ์ฝ”๋“œ๋Š” "hello"์™€ "hello world" ๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ“Œ ํŠน์ง•

  • ๊ฐ’์ด ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ
  • ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์ด ๋งŽ์„์ˆ˜๋ก ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐœ์ƒ
  • + ์—ฐ์‚ฐ์€ ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด StringBuilder๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์Œ

 

String Pool

Java๋Š” ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด String Pool์ด๋ผ๋Š” ํŠน๋ณ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ์ด ํ’€์— ์ €์žฅ๋˜๊ณ , ๋™์ผํ•œ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์€ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

String str1 = "Hello";  // String Pool์— "Hello" ์ƒ์„ฑ
String str2 = "Hello";  // ์ด๋ฏธ ํ’€์— ์žˆ๋Š” "Hello"๋ฅผ ์žฌ์‚ฌ์šฉ
String str3 = new String("Hello");  // ํ•ญ์ƒ ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑ (ํž™ ๋ฉ”๋ชจ๋ฆฌ)

System.out.println(str1 == str2);  // true (๊ฐ™์€ ๊ฐ์ฒด ์ฐธ์กฐ)
System.out.println(str1 == str3);  // false (๋‹ค๋ฅธ ๊ฐ์ฒด ์ฐธ์กฐ)

 

์žฅ์ 

  • ๋ถˆ๋ณ€์„ฑ์œผ๋กœ ์ธํ•ด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „
  • ํ•ด์‹œ์ฝ”๋“œ ์บ์‹ฑ ๋•๋ถ„์— HashMap, HashSet ๋“ฑ์—์„œ ์„ฑ๋Šฅ ์šฐ์ˆ˜
  • ์ค‘์š”ํ•œ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๊ฐ€ ์šฐ๋ฐœ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€

๋‹จ์ 

  • ๋ฌธ์ž์—ด์„ ์ž์ฃผ ์ˆ˜์ •ํ•˜๋Š” ์ž‘์—…์—์„  ๋น„ํšจ์œจ์ 
  • ๋งŽ์€ ์ž„์‹œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, GC ๋ถ€๋‹ด ์ฆ๊ฐ€

๐Ÿงฑ StringBuilder

StringBuilder๋Š” ๋ฌธ์ž์—ด์„ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋ณ€ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

append(), insert(), delete() ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ  ๊ฐ€๋ณ์Šต๋‹ˆ๋‹ค.

StringBuilder sb = new StringBuilder("hello");
sb.append(" world");
System.out.println(sb);  // hello world

 

๐Ÿ“Œ ํŠน์ง•

  • ๋‚ด๋ถ€ ๋ฒ„ํผ์—์„œ ๋ฌธ์ž์—ด์„ ์ง์ ‘ ์ˆ˜์ •
  • ๋™๊ธฐํ™” ๋ฏธ์ง€์› → ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์— ์ ํ•ฉ
  • ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์ด ๋งŽ์„์ˆ˜๋ก String๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ„

 

์ฃผ์š” ๋ฉ”์„œ๋“œ

StringBuilder sb = new StringBuilder();

// ๋ฌธ์ž์—ด ์ถ”๊ฐ€
sb.append("Hello");
sb.append(" ").append("World");

// ๋ฌธ์ž์—ด ์‚ฝ์ž…
sb.insert(5, " Beautiful");  // "Hello Beautiful World"

// ๋ฌธ์ž์—ด ์‚ญ์ œ
sb.delete(5, 15);  // "Hello World"

// ๋ฌธ์ž์—ด ๋Œ€์ฒด
sb.replace(0, 5, "Hi");  // "Hi World"

// ๋ฌธ์ž์—ด ์—ญ์ˆœ
sb.reverse();  // "dlroW iH"

// ์ตœ์ข… String์œผ๋กœ ๋ณ€ํ™˜
String result = sb.toString();

 

์žฅ์ 

  • ๋ฌธ์ž์—ด ์กฐ์ž‘์ด ๋งŽ์€ ๊ฒฝ์šฐ ํƒ์›”ํ•œ ์„ฑ๋Šฅ
  • ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ์šฐ์ˆ˜

๋‹จ์ 

  • ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ ์—†์Œ: ๋™์‹œ ์ ‘๊ทผ ์‹œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
  • ๋‹จ์ˆœํ•œ ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์—๋Š” ์˜คํžˆ๋ ค ์ดˆ๊ธฐ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿงต StringBuffer 

StringBuffer๋Š” StringBuilder์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ,

๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ synchronized๋กœ ์ฒ˜๋ฆฌ๋˜์–ด ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

StringBuffer sbf = new StringBuffer("hello");
sbf.append(" world");
System.out.println(sbf);  // hello world

 

๐Ÿ“Œ ํŠน์ง•

  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๊ณต์œ ๋˜๋Š” ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ์— ์ ํ•ฉ
  • StringBuilder๋ณด๋‹ค ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฌ์ง€๋งŒ ๋™๊ธฐํ™”๋กœ ์•ˆ์ •์„ฑ ํ™•๋ณด

์žฅ์ 

  • ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ ๋ณด์žฅ
  • StringBuilder์ฒ˜๋Ÿผ ๊ฐ€๋ณ€์  ์กฐ์ž‘ ๊ฐ€๋Šฅ

๋‹จ์ 

  • ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„  ๋А๋ฆด ์ˆ˜ ์žˆ์Œ
  • ๋™๊ธฐํ™”๋กœ ์ธํ•œ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ

๐Ÿ” ๋น„๊ต ์ •๋ฆฌ

ํ•ญ๋ชฉ String StringBuilder StringBuffer
๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ โŒ ๋ถˆ๋ณ€ โœ… ๊ฐ€๋ณ€ โœ… ๊ฐ€๋ณ€
์“ฐ๋ ˆ๋“œ ์•ˆ์ „์„ฑ โœ… (๋ถˆ๋ณ€์ด๋ผ ์•ˆ์ „) โŒ (๋น„๋™๊ธฐ) โœ… (๋™๊ธฐํ™” ์ง€์›)
์„ฑ๋Šฅ ๋А๋ฆผ ๋น ๋ฆ„ ์ค‘๊ฐ„
์‚ฌ์šฉ ํ™˜๊ฒฝ ์ผ๋ฐ˜ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ์—ฐ์‚ฐ ๋งŽ์€ ๊ฒฝ์šฐ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ

๐Ÿ’ก ์–ธ์ œ ์–ด๋–ค ๊ฑธ ์จ์•ผ ํ• ๊นŒ?

String์„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ

  • ๋ฌธ์ž์—ด ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
  • ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์ด ์ ์€ ๊ฒฝ์šฐ
  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•œ ๋ฌธ์ž์—ด์„ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

StringBuilder๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ

  • ๋‹จ์ผ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฌธ์ž์—ด์„ ์ž์ฃผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ
  • ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ, ์‚ญ์ œ, ์‚ฝ์ž… ๋“ฑ์˜ ์กฐ์ž‘์ด ๋งŽ์€ ๊ฒฝ์šฐ
  • ์ตœ๋Œ€ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

StringBuffer๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ

  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜์—ฌ ์กฐ์ž‘ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ

๐Ÿ™Œ ๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Java์˜ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ ํด๋ž˜์Šค์ธ String, StringBuilder, StringBuffer์˜ ํŠน์ง•๊ณผ ์ฐจ์ด์ ์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด์„ ๋‹ค๋ฃฐ ๋•Œ๋Š” ๋ฌด์กฐ๊ฑด String๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๊ฐ€์žฅ ์ ์ ˆํ•œ ๋ฌธ์ž์—ด ํด๋ž˜์Šค๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ถˆ๋ณ€์„ฑ์„ ์›ํ•œ๋‹ค๋ฉด String
  • ๋น ๋ฅธ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด StringBuilder
  • ์“ฐ๋ ˆ๋“œ ์•ˆ์ „์„ฑ์ด ์ค‘์š”ํ•˜๋‹ค๋ฉด StringBuffer

๋ฌธ์ž์—ด์€ Java์—์„œ ๋งค์šฐ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋‹ค๋ฃจ๋Š” ๋ฐ์ดํ„ฐ์ด๋ฏ€๋กœ,

๊ฐ ํด๋ž˜์Šค์˜ ํŠน์„ฑ์„ ์ดํ•ดํ•˜๊ณ  ์ƒํ™ฉ์— ๋งž๊ฒŒ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์˜ ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

 

๋‹ค์Œ ๊ธ€์—์„œ๋Š” Java ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ถ๊ธˆํ•œ ๋‚ด์šฉ์ด๋‚˜ ์ถ”๊ฐ€๋กœ ์•Œ๊ณ  ์‹ถ์€ ๊ฐœ๋…์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š” ๐Ÿ˜Š

๋ฐ˜์‘ํ˜•