[μ‘°κΈ λ κΉμ Java] String κ³Ό String Constant Pool
μ°λ¦¬λ Java λ₯Ό μ¬μ©νλ©΄μ μμ£Ό λ§μ String μ Literal μ μ΄μ©νκ² λλ€.
μ€λμ κ·Έ Stringμ΄ μ΄λ€ νΉμ±μ κ°μ‘λμ§ μ‘°κΈ λ€λ₯Έ κ°λμμ λ΄λ³΄λ € νλ€.
String μ?
String μ Java μμ μ 곡νλ νΉλ³ν μλ£νμ΄λ€.
μ°λ¦¬λ String μ μμ±νκΈ° μν΄μ 2κ°μ§ λ°©λ²μΌλ‘ μ΄μ©νκ² λλ€.
"..."
Literal μ μ΄μ©νλ λ°©λ²new
μ°μ°μλ₯Ό ν΅ν΄ String κ°μ²΄μ μμ±μλ‘ value μ£Όμ
μ΄λ¬ν λ°©λ²μ μ΄μ©ν΄μ String
κ°μ²΄λ₯Ό μμ±νλ©΄, μ°λ¦¬κ° μΌλ°μ μΌλ‘ μκ°νλ λ°©λ²κ³Όλ μ‘°κΈ λ€λ₯Έ λ°©λ²μΌλ‘ λ¬Έμμ΄ λ°μ΄ν°κ° μ μ₯μ΄ λλ€.
μλ°μμ λͺ¨λ String μ constant ννλ‘ ν λ² μμ±μ΄ λλ€λ©΄ update λΌλ κ°λ μ΄ μ¬λΌμ§λ€.
μ¦, Java μ String μ Immutable μ΄λΌκ³ ν μ μλ€.
Immutable μ΄λΌλ μ리λ κ²°κ΅ κ°μ μμ νλ€λ©΄ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νκ³ κ·Έ κ°μ μ¬ν λΉν΄μΌ νλλ°, μ Java μ String μ Immutable ν κΉ?
String μ΄ Java μμ Immutable ν μ΄μ
κ·Έ μ΄μ λ‘λ μ¬λ¬κ°μ§κ° μμ§λ§ λνμ μΌλ‘λ λ€μ 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 λ₯Ό λ°κΏμ€ μλ μμ΄μ μ΄ λΆλΆλ κ³ λ €ν΄λ³Όλ§ νλ€.