๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’Š Java & Kotlin & Spring/- Java & kotlin

[์กฐ๊ธˆ ๋” ๊นŠ์€ Java] String ๊ณผ String Constant Pool

by Wonit 2021. 11. 23.

 

์šฐ๋ฆฌ๋Š” Java ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์•„์ฃผ ๋งŽ์€ String ์˜ Literal ์„ ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

 

์˜ค๋Š˜์€ ๊ทธ String์ด ์–ด๋–ค ํŠน์„ฑ์„ ๊ฐ€์กŒ๋Š”์ง€ ์กฐ๊ธˆ ๋‹ค๋ฅธ ๊ฐ๋„์—์„œ ๋ด๋ณด๋ ค ํ•œ๋‹ค.

 

String ์€?

 

String ์€ Java ์—์„œ ์ œ๊ณตํ•˜๋Š” ํŠน๋ณ„ํ•œ ์ž๋ฃŒํ˜•์ด๋‹ค.

 

์šฐ๋ฆฌ๋Š” String ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

 

  1. "..." Literal ์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  2. new ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด String ๊ฐ์ฒด์˜ ์ƒ์„ฑ์ž๋กœ value ์ฃผ์ž…

 

์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•ด์„œ String ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ์ด ๋œ๋‹ค.

 

์ž๋ฐ”์—์„œ ๋ชจ๋“  String ์€ constant ํ˜•ํƒœ๋กœ ํ•œ ๋ฒˆ ์ƒ์„ฑ์ด ๋œ๋‹ค๋ฉด update ๋ผ๋Š” ๊ฐœ๋…์ด ์‚ฌ๋ผ์ง„๋‹ค.

 

์ฆ‰, Java ์˜ String ์€ Immutable ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Immutable ์ด๋ผ๋Š” ์†Œ๋ฆฌ๋Š” ๊ฒฐ๊ตญ ๊ฐ’์„ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ๊ฐ’์„ ์žฌํ• ๋‹นํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์™œ Java ์˜ String ์€ Immutable ํ• ๊นŒ?

 

String ์ด Java ์—์„œ Immutable ํ•œ ์ด์œ 

 

๊ทธ ์ด์œ ๋กœ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ๋‹ค์Œ 3๊ฐ€์ง€๋ฅผ ๊ผฝ๋Š”๋‹ค.

 

  1. ์บ์‹ฑ
  2. ๋™๊ธฐํ™”
  3. ๋ณด์•ˆ์„ฑ

 

์บ์‹ฑ

์•„๋ž˜์—์„œ ๋‚˜์˜ค๊ฒ ์ง€๋งŒ JVM์ด String Constant Pool ์ด๋ผ๋Š” ์˜์—ญ์„ ๋งŒ๋“ค๊ณ  ๋ฌธ์ž์—ด๋“ค์„ Constant ํ™” ํ•˜์—ฌ ๋‹ค๋ฅธ ๋ณ€์ˆ˜ ํ˜น์€ ๊ฐ์ฒด๋“ค๊ณผ ๊ณต์œ ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ ์บ์‹ฑ์ด ์ผ์–ด๋‚˜๊ณ  ๊ทธ ๋งŒํผ ์„ฑ๋Šฅ์  ์ด๋“์„ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋™๊ธฐํ™”

์ผ๋‹จ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋“  Immutable ํ•˜๋‹ค๋ฉด Multi-Thread ํ™˜๊ฒฝ์—์„œ ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋”์šฑ safe ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

๋ณด์•ˆ์  ์ด์œ 

์—ฌ๋Ÿฌ ์ž๋ฃŒ๋ฅผ ์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ, String ์ด Immutable ํ•œ ์ด์œ ๋กœ Security ๋ฅผ ๊ผฝ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

If we don't make the String immutable, it will pose a serious security threat to the application. For example, database usernames, passwords are passed as strings to receive database connections. The socket programming host and port descriptions are also passed as strings. The String is immutable, so its value cannot be changed. If the String doesn't remain immutable, any hacker can cause a security issue in the application by changing the reference value

 

์ฆ‰, ๋งŒ์•ฝ Mutable ํ•˜๋‹ค๋ฉด ํŠน์ • ๊ณต๊ฒฉ ๋ฒกํ„ฐ์— ์˜ํ•ด์„œ Integrity ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๊ฒŒ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

String Constant Pool

 

์•ž์„œ ์ž ์‹œ String ์€ Constant Pool ์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์กฐ๊ธˆ ๋” ์•Œ์•„๋ณด์ž.

 

 

String ์€ ํ•œ๋ฒˆ ์‚ฌ์šฉ์ด ๋˜๋ฉด ๋˜๋‹ค์‹œ ์žฌ์‚ฌ์šฉ๋  ํ™•๋ฅ ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ๋Œ€์ฒ˜ ๋ฐฉ๋ฒ•์œผ๋กœ Heap ์˜์—ญ ๋‚ด์— ๋ฌธ์ž์—ด ์ƒ์ˆ˜์˜ Pool ์„ ์œ ์ง€ํ•˜๊ณ  ํ•ด๋‹น Pool ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ, ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” value ๋“ค์„ ๋‹ด๊ฒŒ ๋œ๋‹ค.

 

์ด ๊ณผ์ •์—์„œ String value ๋“ค์ด Immutable ํ•œ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋˜๊ณ  Constant Pool ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ž์„œ ์ด์•ผ๊ธฐํ•œ ์žฅ์ ๋“ค์„ ์–ป์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค

 

๊ทธ๋Ÿผ ๋ชจ๋“  String ์ด Constant Pool ์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ๊นŒ?

 

์•„๋‹ˆ๋‹ค.

 

String Constant Pool ์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•ž์„œ ๋ณธ 2๊ฐ€์ง€ String ์ƒ์„ฑ ๋ฐฉ๋ฒ• ์ค‘ Literal์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ด๋ฅผ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด์ž

 

String a = "AAAA";
String b = "AAAA";

assertTrue(a == b);

// --- new ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ

String c = new String("BBBB");
String d = new String("BBBB");

assertFalse(a == b);

 

์œ„์˜ ์ฝ”๋“œ๋กœ ์•Œ ์ˆ˜ ์žˆ๋“ฏ, Literal ๋กœ String ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด Constant Pool ์— ํ•ด๋‹น ๋ฌธ์ž์—ด์˜ ๊ฐ’์ด ๋‹ด๊ธด ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ณต์œ ํ•˜์—ฌ ๋‹ค๋ฅธ String ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  ๊ทธ ๋งŒํผ ์ด๋“์„ ์ทจํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์„ฑ๋Šฅ์„ ์œ„ํ•œ ๊ณ ๋ฏผ์€?

 

์ด๋Ÿฌํ•œ Constant Pool์€ Java 6 ์ด์ „์— Permenent Generation ์— ์žˆ์–ด ๊ณ ์ •๋œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์ด์ฆˆ๋กœ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ์—ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ Java 7, 8 ... ์„ ๊ฑฐ์ณ์˜ค๋ฉฐ Heap Size ๋ฅผ ํ†ตํ•ด ์ง์ ‘ Constant Pool ์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋„๋ก Heap ์˜์—ญ์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

 

๊ทธ๋ž˜์„œ Constant Pool ์˜ Heap Size ๋ฅผ ์กฐ์ ˆํ•˜์—ฌ ๋” ๋งŽ์€ Constant ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ถ”๊ฐ€์ ์œผ๋กœ String Constant Pool ์€ ๋‚ด๋ถ€์ ์œผ๋กœ HashTable ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

 

๊ฐ String Constant ์„ hashing ํ•˜๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ key ๋กœ value๋ฅผ ์ฐพ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ๋„ Constant Pool ์˜ ์„ฑ๋Šฅ์€ ์–ด๋Š ์ •๋„ ๋ณด์žฅ์ด ๋˜์–ด์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

 

๊ฒŒ๋‹ค๊ฐ€ StringTableSize ๋ฅผ ๋ฐ”๊ฟ”์ค„ ์ˆ˜๋„ ์žˆ์–ด์„œ ์ด ๋ถ€๋ถ„๋„ ๊ณ ๋ คํ•ด๋ณผ๋งŒ ํ•˜๋‹ค.

๋Œ“๊ธ€