์์ํ๋ฉฐ
๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ๋งค์ฐ ๋น๋ฒํ๊ฒ String Class ๋ฅผ ์ฌ์ฉํ๋ค. ํ์ง๋ง ๋ค๋ฅธ ์์์๋ฃํ์ฒ๋ผ ๋ฆฌํฐ๋ด ์ ์ธ์ด ๊ฐ๋ฅํ์ง์ ๋ํด์๋ ๊ณ ๋ฏผํด๋ณธ์ ์ด ์์๋ค. ํด๋น ๋ด์ฉ์ผ๋ก ์กฐ์ฌ๋ฅผ ์์ํ ๊ฒฐ๊ณผ String Class ์ ๋ํ ํฅ๋ฏธ๋ก์ด ์ฌ์ค๋ค์ ๋ง์ด ์๊ฒ ๋์๊ณ ์ด๋ฅผ ์ ๋ฆฌํด๋๋ ค๊ณ ํ๋ค.
String Class ๋ง์ด ๋ฆฌํฐ๋ด ์ ์ธ์ด ๊ฐ๋ฅํ๊ฒ ๋ ์ด์
๊ฐ๋จํ๊ฒ ๋งํด์, ํธ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ค๋ฅธ ํด๋์ค์ฒ๋ผ ๋งค๋ฒ new ์ฐ์ฐ์๋ฅผ ํตํด char ๋ฐฐ์ด์ ์ธ์๋ก ๋ฃ๊ณ ์ ์ธํ๊ฒ ๋๋ค๋ฉด, ๊ฐ๋ฐ์๋ค์ ๋งค๋ฒ String ์๋ฃํ์ ์ ์ธํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ ์ธ๋ฌธ์ ์ฌ์ฉํด์ผ ํ ๊ฒ์ด๋ค.
String hello = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });
๋ชจ๋ ๋ฌธ์์ด์ ์์ ๊ฐ์ ์ฝ๋๋ก ์ ์ธํ๋ ๊ฒ์ ๋งค์ฐ ์์๊ฐ ์ฌํ ์ผ์ด๊ณ , ๋ฐ๋ผ์ ์๋ฐ์์๋ String Class ๋ ํน๋ณํ๊ฒ ๋ฆฌํฐ๋ด ์ ์ธ์ด ๊ฐ๋ฅํ๋๋ก ๋์์ธ ๋์๋ค. ํ์ง๋ง String Class๊ฐ ํน๋ณํ ์ทจ๊ธ์ ๋ฐ๋ ๊ฒ์ ์ ์ธ๋ฐฉ์ ๋ฟ์ผ๊น? ๊ทธ๋ ์ง ์๋ค. ๋ฆฌํฐ๋ด ์ ์ธ ์ String Class ๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ธก๋ฉด์์๋ ์ ๋นํ ์ผ์ด ์ผ์ด๋๋ค.
String Literal ์ ์ธ ์ ์ผ์ด๋๋ ์ผ๋ค
๋ค์๊ณผ ๊ฐ์ ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ๋ค๊ณ ๊ฐ์ ํ์.
String strA = "hello";
๋ฐฉ๊ธ ์ ์ธํ strA
๋ ์ด๋ค ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ์ฅ๋ ๊น? ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์๋ฐ์์ ์ด๋ ํ ์ฐธ์กฐํ ๊ฐ์ฒด ํน์ ๋ฐฐ์ด์ ์ ์ธํ ๊ฒฝ์ฐ ํด๋น ๊ฐ์ฒด๋ Heap ์์ญ์ ์ ์ฅ๋๋ค๊ณ ์๊ณ ์๋ค.
์ฐธ๊ณ : Stack Memory and Heap Space in Java
https://www.baeldung.com/java-stack-heap
๋ฐ๋ผ์ String ๊ฐ์ฒด ๋ํ ์ ์ธ ์ Heap ์์ญ์ ์ ์ฅ ๋ ๊ฒ ๊ฐ์ง๋ง ์ฌ์ค JVM์ ์ ์ธํ ๋ฌธ์์ด์ String Pool ์ด๋ผ๊ณ ํ๋ ํน๋ณํ ์์ญ์์ ๊ด๋ฆฌํ๋ค. ๋ฐ๋ผ์ ์์์ ์ ์ธํ strA๋ String Pool ์ด๋ผ๊ณ ํ๋ ํน์ํ ์์ญ์ ํ ๋น๋์ด์ ๊ด๋ฆฌ๋๋ค. String Pool ์ ์ด๋ ํ ์์ญ์ด๊ณ , ์ String ๊ฐ์ฒด๋ง ๋ณ๋์ ์์ญ์์ ๊ด๋ฆฌํ๊ฒ ๋ ๊ฒ์ผ๊น?
String Pool
๊ฐ๋ฐํ๊ณ ์๋ ํ๋ก๊ทธ๋จ์ ๊ท๋ชจ๊ฐ ์ปค์ ธ์ ์์์ ์ ์ธํ hello
๋ผ๋ ๋ฌธ์์ด์ ๊ณณ๊ณณ์์ 10๋ง๋ฒ ์ ๋ ์ถ๊ฐ๋ก ์ฌ์ฉํด์ผ ํ๋ค๊ณ ๊ฐ์ ํ์. ๋ง์ฝ String ๊ฐ์ฒด๋ฅผ Heap ์์ญ์์ ๊ด๋ฆฌํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ ๋น ๋ ๊ฒ์ด๋ค.
๋ฌธ์์ด์ ํ๋ก๊ทธ๋จ์์ ๋งค์ฐ ๋งค์ฐ ๋น๋ฒํ๊ฒ ์ฌ์ฉ๋๋ ์๋ฃํ์ด๊ณ , ๋ด์ฉ์ด ์์ ํ ๋์ผํ ๋ฌธ์์ด์ ๋ํด ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค๋ฉด ์์ฒญ๋ ๋ญ๋น๋ผ๊ณ ์๊ฐ๋์ง ์๋๊ฐ? ํ์ง๋ง String ๊ฐ์ฒด๊ฐ ๋ฆฌํฐ๋ด๋ก ์ ์ธ๋จ์ ๋ฐ๋ผ String Pool ์ ํ ๋น๋๋ค๋ฉด ์์ ์ํฉ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณํ๊ฒ ๋๋ค.
10๋ง๊ฐ์ ๋ณ์๊ฐ hello
๋ผ๊ณ ํ๋ ํ๋์ ๋ฌธ์์ด์ ๊ฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋นํ๋ ๊ฒ์ด ์๋ String Pool ์ ํ ๋นํ๋ ํ๋์ ๋ฌธ์์ด์ ์ฐธ์กฐํ๊ฒ ๋๋ค. ์ด๋ป๊ฒ ์ด๊ฒ์ด ๊ฐ๋ฅํ ๊น? ๋ง์ฝ ํ๋์ ๋ฌธ์์ด ๋ณ์์์ hello
๋ผ๊ณ ํ๋ ๋ฌธ์์ด์ ๋ด์ฉ์ ๋ณ๊ฒฝํ๋ ค ํ๋ค๋ฉด 10๋ง๊ฐ์ ๋ณ์์ ์ ์ฅ๋ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ๋ณ๊ฒฝ๋๋๊ฒ์ด ์๋๊น? ๊ทธ ๋น๊ฒฐ์ ๋ถ๋ณ์ ์๋ค.
String Immutable
String Class ์ ๋ด๋ถ๋ฅผ ํ๋ฒ ์ดํด ๋ณด์.
๋ฌธ์์ด ๋ฐฐ์ด์ ํ ๋น๋ฐ๋ value
๋ณ์๊ฐ final
๋ก ์ ์ธ๋์ด ์์์ ์ ์ ์๋ค. ํ๋ฒ ์ ์ธ๋๊ณ ์ ๋ ๋ณ๊ฒฝ๋์ง ์๋๋ค. ๋ฐ๋ผ์ ์์์ ์ ์ธ ํ 10๋ง๊ฐ์ ๋ฌธ์์ด ๋ณ์ ์ค ๋ค๋ฅธ ๋ฌธ์์ด์ ์๋กญ๊ฒ ์ ์ธํ๊ฑฐ๋, +
์ฐ์ฐ์๋ฅผ ํตํด ๋ฌธ์์ด์ ๋ณ๊ฒฝํ๊ฑฐ๋ ํ์ฌ๋ ์ฒ์ ์ ์ธํ hello
๋ฌธ์์ด ๊ฐ์ฒด์ ๊ฐ์ ์ ๋๋ก ๋ณ๊ฒฝ๋์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ๊ทธ ์ธ์๋ String Class
๊ฐ ๋ถ๋ณ์ผ ๋ ๋ณด์, ๋์์ฑ ๋ฑ ์ถ๊ฐ์ ์ธ ์ด์ ์ด ์์ง๋ง ์ด๋ ์ถํ์ ๋ณ๋๋ก ์ ๋ฆฌํ๋๋ก ํ๊ฒ ๋ค.
Interning
๋ฌธ์์ด์ ๋ฆฌํฐ๋ด๋ก ์ ์ธํจ์ผ๋ก์จ String Pool ์ ์ ์ฅ๋๊ณ , ๋์ผํ ๋ฌธ์์ด์ ์ฐธ์กฐํ๋ค๋ ๊ฒ์ ์ดํดํ ์ ์์๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ฆฌํฐ๋ด๋ก ์ ์ธํ์ง ์์ ๋์๋ ์ด๋จ๊น? ๋ค์๊ณผ ๊ฐ์ ์ ์ธ์ด ์๋ค๊ณ ๊ฐ์ ํ์.
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
์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค๋ฉด ๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋์ง ์์๊น ํ
์คํธ ํด๋ณด์๋ค.
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 ๊ฐ์ฒด์ ๋ฆฌํฐ๋ด ์ ์ธ๊ฐ์ ์ด๋ ํ ๋ด๋ถ์ ์ธ ๋์์ด ์์๋์ง ์์๋ณผ ์ ์์๋ค.
๋ง์น๋ฉฐ
String Class ๋ ์ฌ์ค ๊ฐ๋ฐ์ ๊ณต๋ถํ๋ฉด์ ๋ถ๋ณ์ด๋ผ๋ ์ , ํน๋ณํ๊ฒ ๊ด๋ฆฌ๋๋ค๋ ์ ๋ฑ ์ฌ๋ฌ ํน์์ฑ์ด ์๋ค๊ณ ๋ฐฐ์ฐ๊ฒ ๋๋ ์๋ฃํ์ด๋ค. ํ์ง๋ง ์ ์ด๋ฌํ ํน์ฑ์ ๊ฐ๊ฒ ๋์๋์ง, ๋ด๋ถ์ ์ผ๋ก ์ด๋ ํ ๋์์ด ์๋์ง ์ถ์์ ์ธ ๋ ๋ฒจ์์๋ผ๋ ํ๋ฒ ์ฏค ์ ๋ฆฌํด๋๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์๋ค. ๋์ค์ ๊ธฐํ๊ฐ ๋๋ค๋ฉด ๋ถ๋ณ์ฑ์ ๋ํด๋ ์ถ๊ฐ๋ก ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
์ฐธ๊ณ ํ ๋ด์ฉ :
'๋ ธํธ > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Mybatis์ Apache POI ๋ฅผ ์ด์ฉํ ๋์ฉ๋ ์์ ๋ค์ด๋ก๋ ๊ฐ์ (1) | 2024.01.31 |
---|---|
[JAVA] Thread ๊ธฐ์ด (0) | 2022.06.15 |
[JAVA] ํท๊ฐ๋ฆฌ๋ ์์ ์ ๋ฆฌ (0) | 2022.05.11 |
[JAVA] clone() ๋ฉ์๋ ์ ๋ฆฌ (0) | 2022.04.20 |
[JAVA/๋ฒ์ญ] Static ๋ฉค๋ฒ๋ฅผ ์ํ JVM ์คํ ๋ฆฌ์ง (0) | 2022.04.12 |