πŸ’Š Java & Kotlin & Spring/- Java & kotlin

[쑰금 더 κΉŠμ€ Java] String κ³Ό String Constant Pool

Wonit 2021. 11. 23. 02:50

 

μš°λ¦¬λŠ” 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 λ₯Ό 바꿔쀄 μˆ˜λ„ μžˆμ–΄μ„œ 이 뢀뢄도 κ³ λ €ν•΄λ³Όλ§Œ ν•˜λ‹€.