๐Ÿ’ป [Java] ๋ฌธ์ž์—ด String Constant Pool ๊ณผ ๋ฌธ์ž์—ด์—์„œ ==, equals()์˜ ์ฐจ์ด์ 

๐Ÿ’ป [Java] String - String Constant Pool ๊ณผ ๋ฌธ์ž์—ด์—์„œ ==, equals()์˜ ์ฐจ์ด์ 

์•ˆ๋…•ํ•˜์„ธ์š”. ๐Ÿ‘‹

์˜ค๋Š˜์€ ์ž๋ฐ”์˜ String - String Constant Pool ๊ณผ ๋ฌธ์ž์—ด์—์„œ ==, equals()์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๊ตํ•  ๋•Œ๋Š” == ์—ฐ์‚ฐ์ž๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š”๋ฐ
๋ฌธ์ž์—ด์„ ๋น„๊ตํ•  ๋•Œ๋Š” equals๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
 
์™œ ๊ทธ๋Ÿด๊นŒ์š”?
String ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

String ์ƒ์„ฑ ๋ฐฉ๋ฒ•์œผ๋กœ ์ธํ•œ ์ฐจ์ด

String ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

  • String literal, ์ฆ‰ ํฐ ๋”ฐ์˜ดํ‘œ(โ€œโ€œ)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  • new ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

๋‘ ๋ฐฉ๋ฒ•์—๋Š” ์ƒ๋‹นํžˆ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

test

result

์œ„์˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด

String literal๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋Š” ๋‚ด์šฉ์ด ๊ฐ™๋‹ค๋ฉด ๊ฐ™์€ ๊ฐ์ฒด, ์ฆ‰ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑํ•œ String ๊ฐ์ฒด๋Š” ๋ฌธ์ž์—ด์ด ๊ฐ™๋”๋ผ๋„ ๊ฐœ๋ณ„์ ์ธ ๊ฐ์ฒด์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

String Constant Pool

String literal๋กœ ์ƒ์„ฑํ•˜๋ฉด ํ•ด๋‹น String ๊ฐ’์€ Heap ์˜์—ญ ๋‚ด โ€œString Constant Poolโ€์— ์ €์žฅ๋˜์–ด ์žฌ์‚ฌ์šฉ๋˜์ง€๋งŒ, new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑํ•˜๋ฉด ๊ฐ™์€ ๋‚ด์šฉ์ด๋ผ๋„ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ์ฒด๊ฐ€ ๊ฐ๊ฐ Heap ์˜์—ญ์„ ์ฐจ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

string-pool

(๊ทธ๋ฆผ์—๋Š” ์ƒ๋žต๋˜์–ด ์žˆ์ง€๋งŒ) ์ƒ์„ฑ๋œ String ๊ฐ์ฒด๋Š” Stack ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค.

Heap ์˜์—ญ์—๋Š” โ€œCatโ€, โ€œDogโ€๊ณผ ๊ฐ™์€ โ€˜๊ฐ’โ€™๋“ค์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š”๋ฐ, ๊ทธ๋ฆผ์˜ ์šฐ์ธก์„ ๋ณด๋ฉด ์ค‘์š”ํ•œ ์ฐจ์ด๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค.

String literal๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋Š” โ€œString Poolโ€์— ๋“ค์–ด๊ฐ„๋‹ค. String literal๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด์˜ ๊ฐ’(ex. โ€œCatโ€)์ด ์ด๋ฏธ String Pool์— ์กด์žฌํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ๊ฐ์ฒด๋Š” String Pool์˜ reference๋ฅผ ์ฐธ์กฐํ•œ๋‹ค. ๊ทธ๋ฆผ์—์„œ s1๊ณผ s2๊ฐ€ ๊ฐ™์€ ๊ณณ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๊ฒƒ๋„ ์ด ๋•Œ๋ฌธ์ด๋‹ค. new ์—ฐ์‚ฐ์ž๋กœ ์ƒ์„ฑํ•œ String ๊ฐ์ฒด๋Š” ๊ฐ™์€ ๊ฐ’์ด String Pool์— ์ด๋ฏธ ์กด์žฌํ•˜๋”๋ผ๋„, Heap ์˜์—ญ ๋‚ด ๋ณ„๋„์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฐ ์ฐจ์ด ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ญ์ƒ String literal(ํฐ ๋”ฐ์˜ดํ‘œ)๋กœ String์„ ์ƒ์„ฑ์„ ๊ถŒ์žฅํ•œ๋‹ค.

==, equals()์˜ ์ฐจ์ด์ 

์œ„์™€ ๊ฐ™์€ ์ฐจ์ด์  ๋•Œ๋ฌธ์— ์ƒํ™ฉ๋งˆ๋‹ค ์ฐจ์ด๊ฐ€ ์ƒ๊ธด๋‹ค.

== ์—ฐ์‚ฐ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ฃผ์†Œ๊ฐ’์„ ๋น„๊ตํ•˜๋ฏ€๋กœ ๊ฐ™์€ ๋ฌธ์ž์—ด๋กœ ๋ฆฌํ„ฐ๋Ÿด์„ ์ด์šฉํ•ด ์ƒ์„ฑํ•œ String ์ด๋ผ๋ฉด == ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋™์ผํ•˜๋‹ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ๊ฐ™์€ ๋ฌธ์ž์—ด์ด๋ผ๋„ new ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ƒ์„ฑํ•œ String์ด๋ผ๋ฉด ๋ณ„๋„์˜ ๊ฐ์ฒด๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— == ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋™์ผํ•˜๋‹ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค.

ํ•˜์ง€๋งŒ String์˜ equals ๋ฉ”์†Œ๋“œ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” String ๊ฐ์ฒด์—์„œ ์‹ค์ œ ๊ฐ’์ธ ๋ฌธ์ž์—ด ์ž์ฒด์— ๋Œ€ํ•ด ๋น„๊ต๋ฅผ ํ•ด์ค€๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— String ์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ฌธ์ž์—ด์ด ๋™์ผํ•œ์ง€๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด == ์—ฐ์‚ฐ ๋ณด๋‹ค๋Š” ๋ฌธ์ž์—ด ์ž์ฒด๋ฅผ ๋น„๊ตํ•˜๋Š” equals ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

test2

result2

์ •๋ฆฌ
  • String ์ƒ์„ฑ ๋ฐฉ๋ฒ•์€ ๋ฆฌํ„ฐ๋Ÿด ๋ฐฉ๋ฒ•๊ณผ new ์—ฐ์‚ฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
  • literal ๋ฐฉ๋ฒ•์ด ๋™์ผํ•œ ๋ฌธ์ž์—ด ๊ฐ’์— ๋Œ€ํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํšจ์œจ์ ์ด๋‹ค.
  • ๋ฌธ์ž์—ด ๊ฐ’์— ๋Œ€ํ•œ ๋น„๊ต๊ฐ€ ํ•„์š”ํ•  ๋•Œ == ์—ฐ์‚ฐ๋งŒ์œผ๋กœ๋Š” ๋™์ผํ•œ ๋ฌธ์ž์—ด์ด๋”๋ผ๋„ ๋™์ผํ•œ ๋ฌธ์ž์—ด์ž„์„ ๋ณด์žฅ๋ฐ›์„ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ equals ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์•ผํ•œ๋‹ค.

๋

์ž๋ฐ”์˜ String - String Constant Pool ๊ณผ ๋ฌธ์ž์—ด์—์„œ ==, equals()์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ™

Reference

https://starkying.tistory.com/entry/what-is-java-string-pool

https://www.baeldung.com/java-string-pool

Written on June 24, 2021