[Java] String, StringBuffer, StringBuilder ์ด์ •๋ฆฌ

๋ฐ˜์‘ํ˜•

์˜ค๋Š˜์€ Java์˜ String์— ๋Œ€ํ•ด์„œ ์ด์•ผ๊ธฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. 

Java์—๋Š” ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ 3๊ฐ€์ง€ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

  • String
  • StringBuffer
  • StringBuilder

 

3๊ฐœ ๋ชจ๋‘ String์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค์ด์ง€๋งŒ ์—ฌ๋Ÿฌ๋ถ„๋“ค์ด ์งš์–ด์•ผํ•  ๊ฒƒ์ด ์žˆ๋Š”๋ฐ์š”. ์ด 3๊ฐ€์ง€๋Š” ๋ชจ๋‘ ๋ฌธ์ž์—ด์„ ํ‘œ๊ธฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด์ง€๋งŒ ๊ฐ์ž ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ๋ฒ•์ด ์ „ํ˜€ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค์ž…๋‹ˆ๋‹ค.

 

 

 

See Java Reference

์ž๋ฐ” ๋ ˆํผ๋Ÿฐ์Šค ๋ฌธ์„œ์— ๋‚˜์™€ ์žˆ๋Š” ์„ธ ๊ฐ€์ง€์˜ ํด๋ž˜์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค

 

  • String
    Strings are constant; their values cannot be changed after they are created.
    String์€ ์ƒ์ˆ˜์ด๋ฉฐ, ๊ฐ’์„ ๋งŒ๋“  ๋’ค์—๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค (Immutable)

  • StringBuffer
    A thread-safe, mutable sequence of characters. A stringbuffer is like a String, but can be modified.
    StringBuffer๋Š” String๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ thread-safeํ•˜๋‹ค. (Mutable)

  • StringBuilder
    A mutable sequence of characters. This class is designed for use as a drop-in replacement for StringBuffer in places where the string buffer was being used by a single thread (as is generally the case).

    StringBuilder๋Š” StringBuffer์™€ ํ˜ธํ™˜๋˜์ง€๋งŒ ๋‹จ์ผ ์Šค๋ ˆ๋“œ(Single thread)์—์„œ์˜ StringBuffer ๋Œ€์ฒดํ’ˆ์ด๋‹ค 

 

Java ๋ ˆํผ๋Ÿฐ์Šค์—์„œ ๋ณผ ๋•Œ๋Š” String, StringBuffer, StringBuilder ๋ชจ๋‘ ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค๋“ค์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ String์€ ๋ถˆ๋ณ€์ด๊ณ , StringBuffer์™€ StringBuilder๋Š” ๊ฐ€๋ณ€์ด๋ฉฐ ์ด ๋‘ ๊ฐ€์ง€์—์„œ๋„ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ์—์„œ๋„ ์ž˜ ๋™์ž‘ํ•˜๋Š” ํด๋ž˜์Šค์™€ ๊ทธ๋ ‡์ง€ ๋ชปํ•œ ํด๋ž˜์Šค๋กœ ๊ตฌ๋ถ„์ด ๋ฉ๋‹ˆ๋‹ค.

 

 

 

String is immutable ?

Java API ๋ฌธ์„œ์—์„œ ๋ณด์…จ๋‹ค์‹œํ”ผ String์€ ๋ถˆ๋ณ€(Immutable)์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•œ ๋ฒˆ String ํด๋ž˜์Šค๋กœ ์ •์˜๋œ ๋ณ€์ˆ˜๋Š” ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ...

 

์œ„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๊ณ , ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ, String ํด๋ž˜์Šค๋Š” ๋ถˆ๋ณ€์ด๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ฉด str์˜ ๊ฐ’์€ ๋ฐ”๋€” ์ˆ˜ ์—†์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€์š”?

 

์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์‚ดํŽด๋ณด๊ธฐ ์œ„ํ•ด String ํด๋ž˜์Šค์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€๋ดค์Šต๋‹ˆ๋‹ค. String์€ value๋ผ๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋‹ด๋Š”๋ฐ, ์ด ๊ฐ’์€ final๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋Š”๋ฐ๋‹ค private์œผ๋กœ ๋˜์–ด ์žˆ์–ด, ์™ธ๋ถ€์—์„œ๋Š” ์ ‘๊ทผ๋„, ์ˆ˜์ •๋„ ์ „ํ˜€ ์•ˆ๋˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ ๋ถˆ๋ณ€(Immutable) ๊ฐ์ฒด์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์–ด๋–ป๊ฒŒ ๊ฐ’์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ผ๊นŒ์š”?

 

System.identityHashCode ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๊ฐ์ฒด์˜ ๋ณ€ํ™”๋ฅผ ์ฒดํฌํ•ด๋ดค์Šต๋‹ˆ๋‹ค. str ๋ณ€์ˆ˜์— K.I.D๋ฅผ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. 

 

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

 

Java๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹œ๊ฐ„์ด ๋น„์‹ธ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ํ˜„์ƒ์ด ์ž์ฃผ ๋ฐ˜๋ณต๋˜๋ฉด ์„ฑ๋Šฅ์— ์ข‹์ง€ ์•Š์€ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

StringBuffer / StringBuilder

String์ด ๋ถˆ๋ณ€ ๊ฐ์ฒด์˜€๋‹ค๋ฉด, ํ•˜๋‚˜์˜ ๊ฐ์ฒด์—์„œ ์—ฌ๋Ÿฌ๋ฒˆ ๋ฌธ์ž์—ด์„ ์ง€์› ๋‹ค ์ผ๋‹ค ํ•  ์ˆ˜ ์žˆ๋Š” ๋…€์„์ด ๋ฐ”๋กœ StringBuffer์ž…๋‹ˆ๋‹ค. ๊ทธ์™€ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํด๋ž˜์Šค์—๋Š” StringBuilder๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋‘ ํด๋ž˜์Šค ๋ชจ๋‘ String ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ๋งŒ๋“œ๋Š” ํด๋ž˜์Šค๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ๋จผ์ € Buffer, Builder์—์„œ ๋ฌธ์ž์—ด ์ž‘์—…์„ ์ด๋ฃฌ ๋‹ค์Œ, ์ตœ์ข…์ ์œผ๋กœ toString() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด String ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜•์‹์œผ๋กœ String ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

StringBuffer ํด๋ž˜์Šค์˜ sb ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  append๋ฅผ ์ด์šฉํ•ด์„œ memory์— ๊ฐ’์„ append ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ฌธ์ž์—ด์„ ๋’ค์— ๋ผ์›Œ ๋ถ™์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. System.identityHashcode ํ•จ์ˆ˜๋กœ ํ™•์ธํ•ด๋ณด๋ฉด sb๋Š” ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋กœ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ , ์›๋ž˜ ๊ฐ์ฒด์—์„œ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ค„์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฐ™์€ ์ฝ”๋“œ๋กœ StringBuffer ํด๋ž˜์Šค๋ฅผ StringBuilder ํด๋ž˜์Šค๋กœ๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. StringBuffer์™€ StringBuilder๋Š” ๋ชจ๋‘ AbstractStringBuilder ํด๋ž˜์Šค๋ฅผ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ capacity๋„ ๊ธฐ๋ณธ๊ฐ’์ด 16์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ๋‘ ํด๋ž˜์Šค์—๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ syncronization์˜ ์ ์šฉ ์œ ๋ฌด์ž…๋‹ˆ๋‹ค. StringBuffer์—๋Š” ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ์— syncronized๊ฐ€ ์ ์šฉ๋˜์–ด ์žˆ์ง€๋งŒ StringBuilder์—๋Š” ์ ์šฉ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

๋ฐ˜ํ™˜ํ•˜๋Š” ํด๋ž˜์Šค์— ๋”ฐ๋ผ์„œ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ StringBuffer์—๋งŒ syncronized๊ฐ€ ์ ์šฉ๋œ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‘ ๊ฐ’์„ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋น„๊ตํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

3๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ StringBuffer ๋ณ€์ˆ˜์™€ StringBuilder ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

โ€‹์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰ํ•ด๋ณด๋ฉด StringBuffer ๋ณ€์ˆ˜์˜ ๊ธธ์ด๋Š” 380์œผ๋กœ ๋™์ผํ•˜์ง€๋งŒ StringBuilder ๋ณ€์ˆ˜๋Š” ๋Š˜ ๋ณ€ํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” StringBuffer๊ฐ€ ์ข€ ๋” thread-safeํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. StringBuffer์—์„œ๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ํ•ด๋‹น ์ž์›์„ ๋™์‹œ์— ์ ์œ ํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

 

๋”ฐ๋ผ์„œ ์ž์› ๋™์‹œ ์ ์œ  ์ด์Šˆ๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๊ฒฝ์šฐ๋Š” StringBuffer๊ฐ€ ๋” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

String is Primitive type ?

์•ž์„œ String์€ ํด๋ž˜์Šค๋ผ๊ณ  ์„ค๋ช…ํ•œ ๋ฐ” ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์ฝ”๋“œ์—์„œ๋Š” String ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ Primitive type์ฒ˜๋Ÿผ  Literal(๋ฆฌํ„ฐ๋Ÿด, ์†Œ์Šค ์ฝ”๋“œ์— ํ‘œ๊ธฐํ•˜๋Š” ์ƒ์ˆซ๊ฐ’) ํ˜•ํƒœ๋กœ ์„ ์–ธํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์‚ฌ์‹ค ์ด๋ ‡๊ฒŒ ํ‘œ์‹œํ•œ ์ฝ”๋“œ๋Š” new String("Neon")์ฒ˜๋Ÿผ new String ์—ฐ์‚ฐ์ž๋ฅผ ์ƒ๋žตํ•œ ๊ฒƒ์ด์ง€, Primitive type์€ ์•„๋‹™๋‹ˆ๋‹ค. Java์—์„œ String์€ Literal์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. 

 

๊ทธ ๊ทผ๊ฑฐ๋กœ ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ Primitive type์„ ๋น„๊ตํ•  ๋•Œ๋Š” ์—ฐ์‚ฐ์ž "==" ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํด๋ž˜์Šค์—์„œ๋Š” "=="๋ฅผ ์‚ฌ์šฉํ•ด ๋น„๊ตํ•˜๋ฉด ๊ฐ์ฒด์˜ ๊ฐ’์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— false๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿด ๋•Œ๋Š” Object ํด๋ž˜์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” equals ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

equals ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ true๋ฅผ ํ‘œ์‹œํ•˜๋ฏ€๋กœ String์€ Primitive type์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ....

 

Primitive type์ฒ˜๋Ÿผ String ํด๋ž˜์Šค๋ฅผ Literal๋กœ ์„ ์–ธํ•˜๊ณ  ๋น„๊ตํ•˜๋‹ˆ equals๋ž‘ ๋˜‘๊ฐ™์ด ๋น„๊ต๊ฐ€ ์ž˜๋˜๋Š”๋ฐ์š”?

 

 

 

String Pool

๋ถ„๋ช…, new String ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด์„œ๋Š” "==" ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๋‘ ๋ฌธ์ž์—ด ๊ฐ’์„ ๋น„๊ตํ•˜์ง€ ๋ชปํ•˜๊ณ , ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•ด false๊ฐ€ ๋‚˜์˜จ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ์š”. 

 

Literal๋กœ ์„ ์–ธํ•ด์„œ ๋น„๊ตํ–ˆ์„ ๋•Œ๋Š” "==" ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด์„œ๋„ ๋‘ ๋ฌธ์ž์—ด ๊ฐ’์„ ์ž˜ ๋น„๊ตํ–ˆ๋Š”๋ฐ, ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ๋ฐ”๋กœ new String ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์™€ Literal๋กœ ์„ ์–ธํ–ˆ์„ ๋•Œ ๋ฌธ์ž์—ด ์ƒ์„ฑ ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์ด๋ฒˆ์—” 3๊ฐœ์˜ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ, ๋‘ ๋ฒˆ์งธ ๋ณ€์ˆ˜๋Š” Literal์„ ์‚ฌ์šฉํ–ˆ๊ณ , ์„ธ ๋ฒˆ์งธ ๋ณ€์ˆ˜๋Š” new String ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค. ๊ฐ๊ฐ ๋น„๊ตํ–ˆ์„ ๋•Œ Literal ๋ผ๋ฆฌ๋Š” ์„œ๋กœ ์—ฐ์‚ฐ์ž๋กœ ๋น„๊ต๋˜๊ณ , new String์€ ์—ฐ์‚ฐ์ž๋กœ๋Š” ๋น„๊ต๊ฐ€ ์•ˆ๋˜๋Š” ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

 

Java์—์„œ String์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด String Pool(String Constant Pool)์ด๋ผ๋Š” ์˜์—ญ์„ Heap ์˜์—ญ์— ๋ณ„๋„๋กœ ์˜ˆ์•ฝํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. String Pool์€ ๊ธฐ๋ณธ์ ์œผ๋กœ HashMap ํ˜•ํƒœ๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ์œผ๋ฉฐ ๋ฏธ๋ฆฌ ์„ ์–ธํ•ด๋‘” ์ƒ์ˆ˜ ๋ฌธ์ž์—ด์ด ํ’€์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ stack ์˜์—ญ์— ์ƒ์„ฑ๋œ ๋ณ€์ˆ˜๊ฐ€ ์ด๋ฅผ ์ ‘๊ทผํ•  ๋•Œ ํ•ด๋‹น ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ’ ๋ฆฌํ„ดํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•˜๋Š” ์šฉ๋„์ž…๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ fir ๋ณ€์ˆ˜์™€ sec ๋ณ€์ˆ˜๋Š” String Pool์—์„œ ๊ฐ™์€ Heap ์˜์—ญ์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— "==" ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด์„œ๋„ true๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

String ํด๋ž˜์Šค์—์„œ๋Š” intern() ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. new String ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ–ˆ๋”๋ผ๋„ String Pool์—์„œ ๊ทธ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด intern() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ, String Constant Pool์— ํ•ด๋‹น ๋ฌธ์ž์—ด์ด ์—†๋‹ค๋ฉด ํ’€์— ๊ทธ ๋ฌธ์ž์—ด์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

 

 

๋งˆ์น˜๋ฉฐ...

Java์˜ String์— ๋Œ€ํ•ด ์ข€ ๋” ์‹ฌ์˜คํ•˜๊ฒŒ ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. String์€ ์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์‰ฝ๊ฒŒ ์ ‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋งค๊ฐœ์ฒด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์–ด๋–ป๊ฒŒ ์“ฐ๋ƒ์— ๋”ฐ๋ผ์„œ ์„ฑ๋Šฅ์„ ์ขŒ์ง€์šฐ์ง€ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„ ๋˜ํ•œ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

ํŠนํžˆ Java์˜ ๊ฒฝ์šฐ๋Š” ๋ฌด์‹ฌ์ฝ” ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด์ฒ˜๋Ÿผ String์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์„ฑ๋Šฅ ์ฐจ์ด์— ๋งŽ์€ ์˜ํ–ฅ์„ ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด์ „ Java, String Constant Pool์ด ์—†๋˜ Java์—์„œ๋Š” + ์—ฐ์‚ฐ์ž์ฒ˜๋Ÿผ String ๋ถˆ๋ณ€ ๊ฐ์ฒด์— ๊ณ„์† ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ์ถ”๊ฐ€ํ•ด์ฃผ๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ Heap ์˜์—ญ์— ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋ฉฐ GC๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

 

๋ถˆ๋ณ€์„ฑ์ด๋ผ๋Š” ์žฅ์ ์„ ๋ˆ„๋ฆฌ๋ฉด์„œ ์„ฑ๋Šฅ์— ๋ถ€๋‹ด์„ ๋œ์ค€ ๊ฒƒ์ด ๋ฐ”๋กœ String Constant Pool์ด๋ฉฐ ์ด๋ฅผ ์ž˜ ์ˆ™์ง€ํ•˜์—ฌ String ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•˜์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments