[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 ํด๋์ค๋ฅผ ์ด์ฉํ์๋ฉด ์ข๊ฒ ์ต๋๋ค.