๐Ÿ“˜ Web/Spring, JPA

[Spring] String Constant Pool

a n u e 2022. 8. 2. 17:33

 

 

@DisplayName("String literal๋กœ ์ƒ์„ฑํ•œ ๋‘ ๊ฐ์ฒด๋Š” ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ๋™์ผํ•˜๋‹ค.")
@Test
void stringLiteral() {
  String str1 = "abc";
  String str2 = "abc";
  assertThat(str1).isSameAs(str2);
}

@DisplayName("new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑํ•œ ๋‘ ๊ฐ์ฒด๋Š” ๊ฐ’์ด ๊ฐ™์•„๋„ ๋™์ผํ•˜์ง€ ์•Š๋‹ค.")
@Test
void stringNew() {
  String str1 = new String("abc");
  String str2 = new String("abc");
  assertThat(str1).isNotSameAs(str2);
}

 

String literal๋กœ ์ƒ์„ฑํ•˜๋ฉด, JVM Heap ์˜์—ญ ๋‚ด String Constant Pool์— ์ €์žฅ๋˜์–ด ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ

new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑํ•˜๋ฉด, ๊ฐ™์€ ๋‚ด์šฉ์ž„์—๋„ ๋‹ค๋ฅธ ๊ฐ์ฒด์ด๋ฏ€๋กœ ๊ฐ๊ธฐ Heap ์˜์—ญ์„ ์ฐจ์ง€ํ•œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ์ƒ, ๊ทธ๋ฆฌ๊ณ  ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์—๋Š” String literal๋กœ String ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


๐Ÿšฉ intern()

intern() : equals()ํ•ด์„œ String ๊ฐ์ฒด๊ฐ€ String Pool์— ์กด์žฌํ•˜๋ฉด ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๊ณ ,

                ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ํ˜ธ์ถœ๋œ String ๊ฐ์ฒด๋ฅผ String Pool์— ์ถ”๊ฐ€ํ•˜๊ณ , ์ถ”๊ฐ€๋œ ๊ฐ์ฒด์˜ reference๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

@Test
void internString() {
  String str = "abc";
  String newStr = new String("abc");
  assertThat(str).isNotSameAs(newStr);
  
  String internStr = newStr.intern();
  assertThat(str).isSameAs(internStr);
}

๋‹จ์  : String ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์•ผํ•จ. equals() ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์ฐพ์•„ ๋น„๊ตํ•ด์•ผํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„์ด ์†Œ์š”. String constant Pool ์˜์—ญ์— ๋“ค์–ด๊ฐ€์„œ, GC ๋Œ€์ƒ์ด ๋˜์ง€ ๋ชปํ•จ.