Java String Pool

λ°•μš°ν˜„ (Joshua)Β·2023λ…„ 4μ›” 12일

ν•­ν•΄99_TIL

λͺ©λ‘ 보기
10/20

πŸ“‹ String Pool

String Literal(λ¦¬ν„°λŸ΄)을 μ €μž₯ν•˜λŠ” μžλ°” heap λ©”λͺ¨λ¦¬ μ˜μ—­μ— μœ„μΉ˜ν•œ μ €μž₯ 곡간.


πŸ“ String 객체 생성법

μžλ°”μ—μ„œλŠ” String을 μƒμ„±ν•˜λŠ” 두 κ°€μ§€ λ°©λ²•μ΄μžˆλ‹€.
1. String Literal : 주둜 μ•Œκ³  μžˆλŠ” ""(쌍 λ”°μ˜΄ν‘œ)λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±ν•˜λŠ” 것이닀.

String str1 = "Python";
String str2 = "Java";
String str3 = "Programming";
  1. new μ—°μ‚°μž : new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒμ„±ν•˜λŠ” 것이닀.
String str1 = new String ("Python");
String str2 = new String ("Java");
String str3 = new String ("Programming");

πŸ“ String Pool μ΄λž€?

μœ„ μ—μ„œ μ ν˜€μžˆλ“―μ΄, String Pool λ˜λŠ”, String Constant Pool μ΄λž€, String Literal λ°©μ‹μœΌλ‘œ μƒμ„±λœ String 객체듀이 μ €μž₯λ˜λŠ” μ €μž₯ 곡간이닀. λ˜ν•œ, 이 μ €μž₯곡간은 JVM의 Heap λ©”λͺ¨λ¦¬ μ˜μ—­μ— μœ„μΉ˜ν•΄ μžˆλ‹€. String ν΄λž˜μŠ€κ°€ κ΄€λ¦¬ν•œλ‹€.

그림을 보면 적어도 3κ°€μ§€λ₯Ό μ•Œ 수 μžˆλ‹€.
1. String Literal 은 String Pool μ•ˆμ— μ €μž₯ λœλ‹€.
2. μƒˆλ‘œμš΄ String Literal의 값이 이미 String Pool에 μ‘΄μž¬ν•œλ‹€λ©΄, κ·Έ 객체의 값은 μƒˆλ‘­κ²Œ μ €μž₯λ˜μ§€ μ•ŠλŠ”λ”°. 그리고 κ·Έ κ°μ²΄λŠ” String Pool의 referenceλ₯Ό μ°Έμ‘°ν•œλ‹€. (κ·Έλ¦Όμ—μ„œ s1κ³Ό s2κ°€ 같은 곳을 가리킀고 μžˆλŠ” 것도 이 λ•Œλ¬Έμ΄λ‹€).
3. 그에 λΉ„ν•΄, new μ—°μ‚°μžλ‘œ μƒμ„±λœ String κ°μ²΄λŠ” κ·Έ 값이 이미 String pool에 μ‘΄μž¬ν•˜λ”λΌλ„, String Pool λ°–, Heap μ˜μ—­μ— λ³„λ„λ‘œ μ €μž₯λœλ‹€.

그럼 μš°λ¦¬κ°€ μ•Œ 수 μžˆλŠ” 점은, String 객체λ₯Ό String Literal λ°©λ²•μœΌλ‘œ 생성해야 Heap λ©”λͺ¨λ¦¬ μ˜μ—­μ„ 더 효율적으둜 μ‚¬μš©ν•œλ‹€λŠ” 것이닀.

πŸ’» μ˜ˆμ‹œ

μ½”λ“œλ‘œ μ‹€ν—˜ν•΄λ³΄μ•˜λ‹€.

public class test {
    public static void main(String[] args) {
        String str1 = "Java";
        String str2 = "Programming";
        String str3 = "Java";
        String[] strArray = {"Java", "Programming"};
        String str4 = new String("Java");
        String str5 = new String("Programming");
        String str6 = new String("Java");
		//좜λ ₯
        System.out.println("str1 == str3? : " + (str1==str3));
        System.out.println("str1 == strArray[0]? : " + (str1==strArray[0]));
        System.out.println("str2 == strArray[1]? : " + (str2==strArray[1]));
        System.out.println("str1 == str4? : " + (str1==str4));
        System.out.println("str2 == str5? : " + (str2==str5));
        System.out.println("str4 == str6? : " + (str4==str6));
        System.out.println("str1.equals(str3)? : " + str1.equals(str3));
        System.out.println("str1.equals(str4)? : " + str1.equals(str4));
        System.out.println("str2.equals(str5)? : " + str2.equals(str5));
        System.out.println("str4.equals(str6)? : " + str4.equals(str6));
    }
}
//κ²°κ³Ό
str1 == str3? : true
str1 == strArray[0]? : true
str2 == strArray[1]? : true
str1 == str4? : false
str2 == str5? : false
str4 == str6? : false
str1.equals(str3)? : true
str1.equals(str4)? : true
str2.equals(str5)? : true
str4.equals(str6)? : true
  • λ³΄μ΄λŠ” 것과 String Literal둜 μƒμ„±λœ String 객체듀은 비ꡐ μ—°μ‚°μž ( == ) 둜 λΉ„κ΅ν•˜μ˜€μ„ λ•Œ Trueλ₯Ό λ°˜ν™˜ν•˜μ˜€λ‹€. 이 μ΄μœ λŠ” String Literal 객체듀은 값이 같을 경우, κ·Έ 값을 μ €μž₯ ν•˜κ³  μžˆλŠ” String Pool의 Referenceλ₯Ό μ°Έμ‘°ν•˜κ³  (String Pool λ‚΄ ν•΄λ‹Ή κ°’μ˜ μ£Όμ†Œ 값을 κ°€μ§€κ³ ) 있기 λ•Œλ¬Έμ΄λ‹€.
  • λ˜ν•œ, new μ—°μ‚°λ‘œ μƒμ„±λœ 객체와 비ꡐ ν•˜μ˜€μ„λ•ŒλŠ” falseλ₯Ό λ°˜ν™˜ν•˜μ˜€λ‹€. μœ„μ—μ„œ λ§ν–ˆλ“―μ΄ new μ—°μ‚°μžλ‘œ μƒμ„±λœ κ°μ²΄λŠ” String Pool이 μ•„λ‹Œ, Heap λ©”λͺ¨λ¦¬ μ˜μ—­μ— μ €μž₯되기 λ•Œλ¬Έμ΄λ‹€.
    이둜 String Pool 이 μ •μƒμ μœΌλ‘œ μž‘λ™ 되고 μžˆλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.
  • 그리고 String [] 배열에 λ‹΄κ²¨μžˆλŠ” 값이라도 Literal ν˜•μ‹μœΌλ‘œ μƒμ„±λ˜κ³  같은 값을 κ°€μ§€κ³  μžˆλ‹€λ©΄ κΈ°λ³Έ String literal λ³€μˆ˜μ™€ 비ꡐ ν•˜μ˜€μ„ λ•Œ True 값을 λ°˜ν™˜ ν•œλ‹€λŠ” 것을 μ•Œ 수 μžˆλ‹€.
  • λ³„λ„λ‘œ, 두 객체가 λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ μƒμ„±λ˜μ–΄λ„ 값이 κ°™λ‹€λ©΄ .equals() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ True 값을 λ°˜ν™˜ν•  수 μžˆλ‹€. κ·Έ μ΄μœ λŠ”, .equals()λ©”μ„œλ“œλŠ” μ‹€μ œ 값을 비ꡐ ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

πŸ“ String.intern() λ©”μ„œλ“œ

이 λ©”μ„œλ“œλŠ” ν˜ΈμΆœν•œ String 객체와 값이 같은 (.equals) String 객체의 값이 이미 String Pool μ•ˆμ— μ‘΄μž¬ν•  경우, κ·Έ 객체λ₯Ό κ·ΈλŒ€λ‘œ λ¦¬ν„΄ν•œλ‹€. κ·Έλ ‡μ§€ μ•Šλ‹€λ©΄, 호좜된 String 객체의 값을 String Pool에 μΆ”κ°€ν•˜κ³  객체의 referenceλ₯Ό λ¦¬ν„΄ν•œλ‹€.
μ˜ˆμ‹œ

public class test {
    public static void main(String[] args) {
        //μ˜ˆμ‹œ 1 : String Pool μ•ˆμ— 이미 값이 같은 객체가 μžˆλŠ” 경우
        String str1 = "Java";
        String str2 = new String("Java");
		//좜λ ₯ 1 
        System.out.println("str1 == str2? : " + (str1==str2));
        System.out.println("str1.equals(str2)? : " + (str1.equals(str2)));
        str2 = str2.intern();
        System.out.println("str1 == str2? : " + (str1==str2));
		//μ˜ˆμ‹œ 2 : String Pool μ•ˆμ— 값이 같은 객체가 μ—†λŠ” 경우
        String str3 = new String ("Programming").intern();
        String str4 = "Programming";
		//좜λ ₯ 2
        System.out.println("str3 == str4? : " + (str3==str4));
    }
}
//κ²°κ³Ό
//예제 1 
str1 == str2? : false
str1.equals(str2)? : true
str1 == str2? : true
//예제 2
str3 == str4? : true

πŸ““ 였늘 λŠλ‚€ 점 ν•œμ€„ μš”μ•½

"String Pool" πŸŠβ€β™‚οΈ

좜처:
좜처1
좜처2
좜처3
좜처4

20230412 TIL

profile
맀일 맀일 μ„±μž₯ν•˜μž

0개의 λŒ“κΈ€