[JAVA] String Literal ๊ณผ String Pool

์‹œ์ž‘ํ•˜๋ฉฐ

๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ๋งค์šฐ ๋นˆ๋ฒˆํ•˜๊ฒŒ 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 ๋Š” ์‚ฌ์‹ค ๊ฐœ๋ฐœ์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋ถˆ๋ณ€์ด๋ผ๋Š” ์ , ํŠน๋ณ„ํ•˜๊ฒŒ ๊ด€๋ฆฌ๋œ๋‹ค๋Š” ์  ๋“ฑ ์—ฌ๋Ÿฌ ํŠน์ˆ˜์„ฑ์ด ์žˆ๋‹ค๊ณ  ๋ฐฐ์šฐ๊ฒŒ ๋˜๋Š” ์ž๋ฃŒํ˜•์ด๋‹ค. ํ•˜์ง€๋งŒ ์™œ ์ด๋Ÿฌํ•œ ํŠน์„ฑ์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ๋Š”์ง€, ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋– ํ•œ ๋™์ž‘์ด ์žˆ๋Š”์ง€ ์ถ”์ƒ์ ์ธ ๋ ˆ๋ฒจ์—์„œ๋ผ๋„ ํ•œ๋ฒˆ ์ฏค ์ •๋ฆฌํ•ด๋‘๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค. ๋‚˜์ค‘์— ๊ธฐํšŒ๊ฐ€ ๋œ๋‹ค๋ฉด ๋ถˆ๋ณ€์„ฑ์— ๋Œ€ํ•ด๋„ ์ถ”๊ฐ€๋กœ ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

 


์ฐธ๊ณ ํ•œ ๋‚ด์šฉ :

 

Guide to Java String Pool | Baeldung

Learn how the JVM optimizes the amount of memory allocated to String storage in the Java String Pool.

www.baeldung.com

 

Java String ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ๊ณ ์ฐฐ

Java ์–ธ์–ด์—์„œ String์€ ๋ฌด์‹ฌ์ฝ” ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค ์ค‘์— ํ•˜๋‚˜๊ฐ€ ์•„๋‹๊นŒ ์ƒ๊ฐ์ด ๋“ ๋‹ค. String์€ ๋‘ ๊ฐ€์ง€ ์ƒ์„ฑ ๋ฐฉ์‹์ด ์žˆ๊ณ  ๊ฐ๊ฐ์˜ ์ฐจ์ด์ ์ด ์กด์žฌํ•œ๋‹ค.

medium.com

 

String Initialization in Java | Baeldung

Learn about the difference between declaration and initialization of String in Java.

www.baeldung.com