3 ๋ถ„ ์†Œ์š”

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

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 ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค๊ณ  ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  : Stack Memory and Heap Space in Java

๋”ฐ๋ผ์„œ 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 ๊ฐ์ฒด์™€ ๋ฆฌํ„ฐ๋Ÿด ์„ ์–ธ๊ฐ„์— ์–ด๋– ํ•œ ๋‚ด๋ถ€์ ์ธ ๋™์ž‘์ด ์žˆ์—ˆ๋Š”์ง€ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Refferences

ํƒœ๊ทธ: ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: