๋ฐฐ๋„ˆ ์ด๋ฏธ์ง€

๋ฌธ์ž์—ด ํด๋ž˜์Šค ์ •๋ฆฌ: String vs StringBuffer vs StringBuilder

2025. 5. 25. 23:27ยทCS๊ณต๋ถ€/Java & Spring

๐ŸŽฏ ๋ชฉํ‘œ

  • Java์˜ ๋ฌธ์ž์—ด ํด๋ž˜์Šค 3๊ฐ€์ง€๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ, ๋™๊ธฐํ™” ์—ฌ๋ถ€, ์„ฑ๋Šฅ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒํ™ฉ์— ๋งž๋Š” ๋ฌธ์ž์—ด ํด๋ž˜์Šค ์„ ํƒ ๊ธฐ์ค€์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ” Java์˜ 3๊ฐ€์ง€ ๋ฌธ์ž์—ด ํด๋ž˜์Šค

๊ตฌ๋ถ„ String StringBuffer StringBuilder
์ €์žฅ ์˜์—ญ Heap ๋˜๋Š” Constant Pool Heap Heap
๋ณ€๊ฒฝ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ โŒ ๋ถˆ๋ณ€ (Immutable) โœ… ๊ฐ€๋ณ€ (Mutable) โœ… ๊ฐ€๋ณ€ (Mutable)
Thread-Safe โœ… Yes โœ… Yes โŒ No

๐Ÿ”Ž String ํด๋ž˜์Šค

โœ… ํŠน์ง•

  • ๋ถˆ๋ณ€ ๊ฐ์ฒด(Immutable): ๋ฌธ์ž์—ด ์ˆ˜์ • ์‹œ, ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ƒ์„ฑ
  • "+" ๋˜๋Š” concat() ์‚ฌ์šฉ ์‹œ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑ
  • ์˜ˆ์‹œ:
String a = "hello";
String b = a + "world"; // a ๊ฐ์ฒด ๋ณ€๊ฒฝ ์•„๋‹˜, ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑ

โœ… ์žฅ์ 

  • ๋ถˆ๋ณ€ โ†’ Thread-Safe
  • ์ฝ๊ธฐ ์ „์šฉ ์‚ฌ์šฉ ์‹œ ๋น ๋ฅด๊ณ  ์•ˆ์ •์ 

โš ๏ธ ๋‹จ์ 

  • ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์ด ๋งŽ์„ ๊ฒฝ์šฐ ๋งค๋ฒˆ ์ƒˆ ๊ฐ์ฒด ์ƒ์„ฑ โ†’ GC ๋น„์šฉ ์ฆ๊ฐ€
  • ๋‚ด๋ถ€์ ์œผ๋กœ char[] ๋ฐฐ์—ด์„ ๊ณ„์† ์ƒ์„ฑ/๋ณต์‚ฌ โ†’ ์„ฑ๋Šฅ ์ €ํ•˜

๐Ÿ”Ž StringBuffer & StringBuilder ํด๋ž˜์Šค

โœ… ๊ณตํ†ต์ 

  • ๊ฐ€๋ณ€ ๊ฐ์ฒด(Mutable): ๋ฌธ์ž์—ด ์ˆ˜์ •์ด ๊ฐ€๋Šฅ
  • ๋‚ด๋ถ€์ ์œผ๋กœ char[] ๋ฐฐ์—ด์„ ํ™•์žฅํ•˜์—ฌ ๋ฌธ์ž์—ด ๋ณ€๊ฒฝ
  • ๋ฌธ์ž์—ด ์กฐ์ž‘์ด ๋งŽ์„์ˆ˜๋ก ์„ฑ๋Šฅ ์šฐ์œ„

โœ… ์ฐจ์ด์ 

ํ•ญ๋ชฉ StringBuffer StringBuilder
Thread-Safe โœ… Yes (๋™๊ธฐํ™” ๋ณด์žฅ) โŒ No (์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ์ „์šฉ)
์†๋„ ๋А๋ฆผ ๋น ๋ฆ„
์‚ฌ์šฉ ํ™˜๊ฒฝ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ์‹ฑ๊ธ€์Šค๋ ˆ๋“œ

โœ… ์˜ˆ์‹œ

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

๐Ÿง  ์–ธ์ œ ์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ์จ์•ผ ํ• ๊นŒ?

์ƒํ™ฉ ์ถ”์ฒœ ํด๋ž˜์Šค
๋ฌธ์ž์—ด ์กฐ์ž‘ ๊ฑฐ์˜ ์—†์Œ / ๋‹จ์ˆœ ์ฝ๊ธฐ String
๋ฌธ์ž์—ด ์กฐ์ž‘ ๋งŽ๊ณ , ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ StringBuilder
๋ฌธ์ž์—ด ์กฐ์ž‘ ๋งŽ๊ณ , ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ StringBuffer

๐Ÿ”„ ๊ฒฐ๋ก 

  • JDK 1.5 ์ด์ „์—๋Š” "a" + "b" ์—ฐ์‚ฐ์ด ์ƒˆ๋กœ์šด String ๊ฐ์ฒด๋ฅผ ๊ณ„์† ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ์กด์žฌ
  • JDK 1.5 ์ดํ›„ "a" + "b"๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ StringBuilder๋กœ ๋ณ€ํ™˜
  • ๊ทธ๋Ÿฌ๋‚˜ ๋ฃจํ”„ ๋‚ด์—์„œ ๋ฌธ์ž์—ด ๋ˆ„์  ๋“ฑ ๋ฐ˜๋ณต์ ์ธ ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์€ ์—ฌ์ „ํžˆ ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ์žˆ์Œ

โœ… ํ•™์Šต ์ •๋ฆฌ

  • String: ์ฝ๊ธฐ ์ค‘์‹ฌ, ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ž์—ด
  • StringBuffer: ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•œ ๋ฌธ์ž์—ด ์กฐ์ž‘
  • StringBuilder: ๋น ๋ฅธ ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๋ฌธ์ž์—ด ์กฐ์ž‘์— ์ตœ์ 

๐Ÿ“Œ ์„ฑ๋Šฅ ๊ธฐ์ค€์œผ๋กœ๋Š”
StringBuilder > StringBuffer >>> String

'CS๊ณต๋ถ€ > Java & Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

OAuth2 ๊ธฐ๋ฐ˜ Google & Kakao ๋กœ๊ทธ์ธ ๊ตฌ์ถ• ๋ฐฉ๋ฒ•  (0) 2025.06.30
collect(Collectors.toList()) vs Stream.toList()  (1) 2025.06.07
JWT ์ธ์ฆ ๋ฐ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ ์ •๋ฆฌ  (0) 2025.04.28
์ฆ‰์‹œ ๋กœ๋”ฉ(Eager Loading)๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)  (0) 2025.04.23
Spring Boot์˜ Bean๊ณผ ์–ด๋…ธํ…Œ์ด์…˜  (1) 2025.04.23
'CS๊ณต๋ถ€/Java & Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • OAuth2 ๊ธฐ๋ฐ˜ Google & Kakao ๋กœ๊ทธ์ธ ๊ตฌ์ถ• ๋ฐฉ๋ฒ•
  • collect(Collectors.toList()) vs Stream.toList()
  • JWT ์ธ์ฆ ๋ฐ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์‹œ์Šคํ…œ ์ •๋ฆฌ
  • ์ฆ‰์‹œ ๋กœ๋”ฉ(Eager Loading)๊ณผ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)
quokkaST
quokkaST
  • quokkaST
    stquokka
    quokkaST
    • ๊ฐœ๋ฐœ์ž (77)
      • n8n (2)
      • CS๊ณต๋ถ€ (46)
        • Java & Spring (15)
        • ์ธํ”„๋ผ (7)
        • ์šด์˜์ฒด์ œ & ์‹œ์Šคํ…œ (9)
        • ๊ธฐํƒ€ CS์ง€์‹ (7)
        • ๋„คํŠธ์›Œํฌ (6)
        • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (2)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (16)
      • ํ”„๋กœ์ ํŠธ (8)
        • ๊ฐ์ •&๊ธˆ์œต์ฑ—๋ด‡ (8)
      • ๋ฆฌํŒฉํ† ๋ง (5)
        • horong (5)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”