[Java] String Literal ๊ณผ String Pool
์์ํ๋ฉฐ
String Class ๋ Java Language ์ฌ์ฉ ์ ์๋นํ ์์ฃผ ์ฌ์ฉํ๊ฒ ๋๋ ํด๋์ค ์ ๋๋ค. ํ์ง๋ง ๋ค๋ฅธ ํด๋์ค๋ค๊ณผ๋ ๋ค๋ฅด๊ฒ ์์์๋ฃํ์ฒ๋ผ ์ ์ธ์ด ๊ฐ๋ฅํ์ฃ . ์ด๋ฌํ ๋ถ๋ถ์ ๋ํด ์ Java ์ ๋ฌธ์์ด ํด๋์ค๋ ํน๋ณํ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ํน๋ณํ์ง ์กฐ์ฌํด๋ณด์์ต๋๋ค.
String Class ๋ง์ด ๋ฆฌํฐ๋ด ์ ์ธ์ด ๊ฐ๋ฅํ๊ฒ ๋ ์ด์
๊ฐ๋จํ๊ฒ ๋งํด์ ํธ๋ฆฌํ๊ธฐ ๋๋ฌธ์
๋๋ค. ย ๋ค๋ฅธ ํด๋์ค์ฒ๋ผ ๋งค๋ฒ new
์ฐ์ฐ์๋ฅผ ํตํด char ๋ฐฐ์ด์ ์ธ์๋ก ๋ฃ๊ณ ์ ์ธํ๊ฒ ๋๋ค๋ฉด, ๊ฐ๋ฐ์๋ค์ ๋งค๋ฒ String ์๋ฃํ์ ์ ์ธํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ ์ธ๋ฌธ์ ์ฌ์ฉํด์ผ ํ ๊ฒ์
๋๋ค.
1
String hello = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });
๋ชจ๋ ๋ฌธ์์ด์ ์์ ๊ฐ์ ์ฝ๋๋ก ์ ์ธํ๋ ๊ฒ์ ๋งค์ฐ ์์๊ฐ ์ฌํ ์ผ์ด๊ณ , ๋ฐ๋ผ์ ์๋ฐ์์๋ String Class ๋ ํน๋ณํ๊ฒ ๋ฆฌํฐ๋ด ์ ์ธ์ด ๊ฐ๋ฅํ๋๋ก ๋์์ธ ๋์์ต๋๋ค. ํ์ง๋ง String Class๊ฐ ํน๋ณํ ์ทจ๊ธ์ ๋ฐ๋ ๊ฒ์ ์ ์ธ๋ฐฉ์ ๋ฟ์ผ๊น์? ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ฆฌํฐ๋ด ์ ์ธ ์ String Class ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐฉ์๋ ์กฐ๊ธ ํน์ดํฉ๋๋ค.
String Literal ์ ์ธ ์ ์ผ์ด๋๋ ์ผ๋ค
๋ค์๊ณผ ๊ฐ์ ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค.
1
String strA = "hello";
๋ฐฉ๊ธ ์ ์ธํ strA
๋ ์ด๋ค ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ์ฅ๋ ๊น์? ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์๋ฐ์์ ์ด๋ ํ ์ฐธ์กฐํ ๊ฐ์ฒด ํน์ ๋ฐฐ์ด์ ์ ์ธํ ๊ฒฝ์ฐ ์ ์ธ๋ ๊ฐ์ฒด๋ Heap ์์ญ์ ์ ์ฅ๋๋ค๊ณ ์๊ณ ์์ต๋๋ค.
๋ฐ๋ผ์ String ๊ฐ์ฒด ๋ํ ์ ์ธ ์ Heap ์์ญ์ ์ ์ฅ ๋ ๊ฒ ๊ฐ์ง๋ง ์ฌ์ค JVM์ ์ ์ธํ ๋ฌธ์์ด์ String Pool ์ด๋ผ๊ณ ํ๋ ํน๋ณํ ์์ญ์์ ๊ด๋ฆฌํฉ๋๋ค. ๋ฐ๋ผ์ ์์์ ์ ์ธํ strA๋ String Pool ์ด๋ผ๊ณ ํ๋ ํน์ํ ์์ญ์ ํ ๋น๋์ด์ ๊ด๋ฆฌ๋ฉ๋๋ค. String Pool ์ ์ด๋ ํ ์์ญ์ด๊ณ , ์ String ๊ฐ์ฒด๋ง ๋ณ๋์ ์์ญ์์ ๊ด๋ฆฌํ๊ฒ ๋ ๊ฒ์ผ๊น์?
String Pool
๊ฐ๋ฐํ๊ณ ์๋ ํ๋ก๊ทธ๋จ์ ๊ท๋ชจ๊ฐ ์ปค์ ธ์ ์์์ strA
๋ณ์์ ์ ์ธํ hello
๋ผ๋ ๋ฌธ์์ด์ ๊ณณ๊ณณ์์ 10๋ง๋ฒ ์ ๋ ์ถ๊ฐ๋ก ์ฌ์ฉํด์ผ ํ๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. ๋ง์ฝ String ๊ฐ์ฒด๋ฅผ Heap ์์ญ์์ ๊ด๋ฆฌํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ๋น ๋ ๊ฒ์
๋๋ค.
๋ฌธ์์ด์ ํ๋ก๊ทธ๋จ์์ ๋งค์ฐ ๋งค์ฐ ๋น๋ฒํ๊ฒ ์ฌ์ฉ๋๋ ์๋ฃํ์ด๊ณ , ๋ด์ฉ์ด ์์ ํ ๋์ผํ ๋ฌธ์์ด์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค๋ฉด ์์ฒญ๋ ๋ญ๋น๋ผ๊ณ ์๊ฐ๋์ง ์์ผ์ ๊ฐ์? ํ์ง๋ง String ๊ฐ์ฒด๊ฐ ๋ฆฌํฐ๋ด๋ก ์ ์ธ๋จ์ ๋ฐ๋ผ String Pool ์ ํ ๋น๋๋ค๋ฉด ์์ ์ํฉ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณํ๊ฒ ๋ฉ๋๋ค.
10๋ง๊ฐ์ ๋ณ์๊ฐ hello
๋ผ๊ณ ํ๋ ํ๋์ ๋ฌธ์์ด์ ๊ฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋นํ๋ ๊ฒ์ด ์๋ String Pool ์ ํ ๋นํ๋ ํ๋์ ๋ฌธ์์ด์ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค. ์ด๋ป๊ฒ ์ด๊ฒ์ด ๊ฐ๋ฅํ ๊น์? ๊ทธ๋ผ ๋ฐ๋๋ก ๋ง์ฝ ํ๋์ ๋ฌธ์์ด ๋ณ์์์ hello
๋ผ๊ณ ํ๋ ๋ฌธ์์ด์ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ ค ํ๋ค๋ฉด 10๋ง๊ฐ์ ๋ณ์์ ์ ์ฅ๋ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ๋ณ๊ฒฝ๋๋๊ฒ์ด ์๋๊น์? ๊ทธ ๋น๊ฒฐ์ ๋ฐ๋ก String Class ์ ํน์์ฑ ์ค ํ๋์ธ ๋ถ๋ณ(Immutable) ์ ์์ต๋๋ค.
String Immutable
String Class ์ ๋ด๋ถ๋ฅผ ํ๋ฒ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
๋ฌธ์์ด ๋ฐฐ์ด์ ํ ๋น๋ฐ๋ value
๋ณ์๊ฐ final
๋ก ์ ์ธ๋์ด ์์์ ์ ์ ์์ฃ . ํ๋ฒ ์ ์ธ๋๊ณ ์ ๋ ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ ๋ป์
๋๋ค. ๋ฐ๋ผ์ ์์์ ์ ์ธ ํ 10๋ง๊ฐ์ ๋ฌธ์์ด ๋ณ์ ์ค ๋ค๋ฅธ ๋ฌธ์์ด์ ์๋กญ๊ฒ ์ ์ธํ๊ฑฐ๋, +
์ฐ์ฐ์๋ฅผ ํตํด ๋ฌธ์์ด์ ๋ณ๊ฒฝํ๊ฑฐ๋ ํ์ฌ๋ ์ฒ์ ์ ์ธํ hello
๋ฌธ์์ด ๊ฐ์ฒด์ ๊ฐ์ ์ ๋๋ก ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ ๊ฒ์ด์ฃ .
Interning
๋ฌธ์์ด์ ๋ฆฌํฐ๋ด๋ก ์ ์ธํจ์ผ๋ก์จ String Pool ์ ์ ์ฅ๋๊ณ , ๋์ผํ ๋ฌธ์์ด์ ์ฐธ์กฐํ๋ค๋ ๊ฒ์ ์ดํดํ ์ ์์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ฆฌํฐ๋ด๋ก ์ ์ธํ์ง ์์ ๋์๋ ์ด๋จ๊น์? ๋ค์๊ณผ ๊ฐ์ ์ ์ธ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
1
2
3
4
String strLiteral = "abc";
String strObject = new String("abc");
boolean equalityA = strLiteral == strObject;
equalityA
๋ณ์์ ๊ฐ์ ์ด๋ป๊ฒ ๋ ๊น์?
ํ์ธํด๋ณด๋ฉด false
๊ฐ ๋์ค๊ฒ ๋๋ ๊ฒ์ ์ ์์์ต๋๋ค.
๊ฐ์ฒด ๊ฐ ๋์ผ์ฑ ์ฐ์ฐ์(==
)๋ ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐธ์กฐํ๊ณ ์๋์ง ๋น๊ตํ๋ฏ๋ก strLiteral
๊ฐ์ฒด์ strObject
๊ฐ์ฒด๋ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๊ณ ์์์ ์ ์ ์์ต๋๋ค. ์์์ ๊ธฐ์ ํ ๋๋ก ๋ String ๊ฐ์ฒด๊ฐ ๋ชจ๋ String Pool ์ ์กด์ฌํ๋ค๋ฉด, ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํด์ผ ํ๋๋ฐ, ์ด์งธ์ ์์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋๊ฒ ๋์๊น์.
ํ๋ฒ ๋ String Class ์ ๋ด๋ถ๋ฅผ ์ดํด๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋ฉ์๋๋ฅผ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค.
ํด๋น ๋ฉ์๋์ ๋์คํฌ๋ฆฝ์
์์ ๋ชจ๋ ๋ฆฌํฐ๋ด ๋ฌธ์์ด๊ณผ ๋ฌธ์์ด ์์ ํํ์์ ์ ์ธ๊ณผ ๋์์ intern
์ฒ๋ฆฌ ๋๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ heap ์์ญ์ ์กด์ฌํ๋ ๋ฌธ์์ด ๊ฐ์ฒด๋ฅผ ๋ด๋ถ์ ์ผ๋ก String Pool ์์ญ์ผ๋ก ์ฎ๊ธฐ๋ ์์
์ด๋ผ๊ณ ํฉ๋๋ค. ํ์ง๋ง ์์ฑ์๋ฅผ ํตํด ์ ์ธ ๋ String ๋ฌธ์์ด ๊ฐ์ฒด๋ ์ด intern
๊ณผ์ ์ ๊ฑฐ์น์ง ์์ผ๋ฉฐ ๋ฐ๋ผ์ ์์์ ๋น๊ต์ฐ์ฐ์๋ฅผ ํตํด strLiteral
๊ฐ์ฒด์ strObject
๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ์ฃผ์๊ฐ์ ๊ฐ๋ฅดํค๊ณ ์๋ ์ด์ ์ ๋ํด ์ ์ ์์ฃ .
๊ทธ๋ ๋ค๋ฉด ์๋์ผ๋ก intern
์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค๋ฉด ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋์ง ์์๊น ํ
์คํธ ํด๋ณด์์ต๋๋ค.
1
2
3
4
5
6
7
String strLiteral = "abc";
String strObject = new String("abc");
boolean equalityA = strLiteral == strObject; // false
String strInterned = strObject.intern();
boolean equalityB = strLiteral == strInterned; // true
equalityB
์ ๊ฒฐ๊ณผ๋ก true
๊ฐ ๋ฐํ๋จ์ ๋ฐ๋ผ String ๊ฐ์ฒด์ ๋ฆฌํฐ๋ด ์ ์ธ๊ฐ์ ์ด๋ ํ ๋ด๋ถ์ ์ธ ๋์์ด ์์๋์ง ์์๋ณผ ์ ์์์ต๋๋ค.