본문 바로가기

자바

자바 String이 메모리에 저장되는 방식

String을 생성하는 방법은 두 가지이다.

1. new 연산자를 이용하는 방식

2. 리터럴을 이용하는 방식

    String text1 = "text";
    String text2 = "text";
    String text3 = new String("text");
    
    System.out.println(text1 == text2);          //true
    
    System.out.println(text1 == text3);          //false
    
    System.out.println(text1.equals(text2));     //true
    
    System.out.println(text1.equals(text3));     //true
    
    text2 = "text" + "change";
    
    System.out.println(text1 == text2);          //false
    
    System.out.println(text1.equals(text2));     //false

1. text1을 리터럴로 선언할 때 "text" 문자열은 String constant pool에 저장된다.

2. text2를 리터럴로 선언할 때, 이미 String constant pool에 동일한 내용의 문자열 "text"가 존재하면 그 주소 값을 참조한다. String constant pool은 중복된 문자열을 허용하지 않고, 동일한 내용의 문자열 리터럴을 재사용한다.

3. text3을 new 연산자로 선언할 때, 새로운 String 객체가 Heap 영역에 생성된다. 이때 "text"라는 리터럴이 이미 String constant pool에 존재하더라도, new String("text")는 새로운 객체를 생성하므로 Heap 영역에 저장된다.

4. text1과 text2는 같은 리터럴을 참조하고 있으므로 주소 값이 같고, text3는 새로운 객체를 생성하여 주소 값이 다르다.

5. text1과 text3의 주소 값을 비교할 때는 == 대신 equals()를 사용한다. equals() 메서드는 객체의 내용을 비교하기 위해 사용한다.

6. 즉, equals() 메서드는 객체의 내용을 비교하며, == 연산자는 참조 변수들의 주소 값을 비교한다.

7. text2 = "text" + "change";를 수행하면 String constant pool에 "textchange" 문자열이 생성되고, text2는 그 주소 값을 참조한다.

 

'자바' 카테고리의 다른 글

자바 가비지 컬렉션과 Heap 메모리 구조  (0) 2023.07.24
자바 컴파일 언어와 인터프린터 언어  (0) 2023.07.24
자바 Map  (0) 2023.07.24
자바 Set  (0) 2023.07.24
자바 동기화  (0) 2023.07.24