Java

[Java] String = ""; vs new String("");

📝 작성 : 2020.07.01  ⏱ 수정 : 
728x90

보통 자바를 처음 배울 때 String hello = "Hello, World"; 이렇게 작성 한 후 이걸 출력하는 예제를 따라칠 것 입니다.

그래서 자바를 처음 배우시는 분들은 new String()에 대해 생소하실 수 도 있습니다.

오늘은 두 방법의 차이점을 알아보겠습니다.

public static void main(String[] args) {
    String str1 = "Hello";
    String str2 = "Hello";
    String str3 = new String("Hello");
    String str4 = new String("Hello");
    String str5 = new String("Hello").intern();

    System.out.println(str1 == str2); // "Hello" == "Hello"                                  => true
    System.out.println(str3 == str4); // new String("Hello") == new String("Hello")          => false
    System.out.println(str1 == str3); // "Hello" == new String("Hello")                      => false
    System.out.println(str1 == str5); // "Hello" == new String("Hello").intern()             => true
    System.out.println(str3 == str5); // new String("Hello") == new String("Hello").intern() => false
}

우선, = "Hello"와 같은 방식을 리터럴을 이용하여 문자열을 생성했다고 하고 new String("Hello")와 같은 방식을 new 연산자를 이용하여 문자열을 생성했다고 합니다.

new 연산자를 통해 문자열을 생성하게되면 해당 문자열은 JVM의 Heap영역에 생성됩니다.
리터럴을 통해 문자열을 생성하게 되면 해당 문자열은 Heap영역 내부의 String constant pool(String pool)에 생성됩니다.

참고로 String pool은 Java 6까지는 PermGen이라는 영역에 생성되었고 Java 7부터는 Heap영역에 생성됩니다.
옮긴 이유는 PermGen은 런타임시 사이즈를 확장할 수 없는 fixed size이기 때문입니다.
String constant pool을 Heap영역으로 옮김으로써 내부의 문자열을 GC(Garbage Collector)의 처리대상이 되었습니다.
Java 8에서 PermGen 영역이 사라지고 Metaspace영역으로 대체되었습니다.
(출처 : http://java-performance.info/string-intern-in-java-6-7-8/)

String을 리터럴로 선언할 경우 내부적으로 String의 intern()메서드가 호출됩니다. intern()메서드는 String constant pool에 해당 문자열이 존재하는지 확인 후 존재하면 주소값을 반환, 문자열이 없다면 해당 문자열을 새로 넣고 주소값을 반환합니다.
그렇기 때문에 str1 == str2true인 이유는 String constant pool에서 같은 주소값을 반환 받았기 때문이고 같은 이유로 str1 == str5true였던 것 입니다.


new 연산자 생성방식과 리터럴 생성방식 둘다 큰 틀에서는 Heap영역이지만 엄연히 따지면 별도의 공간입니다. 따라서 str1 == str3false입니다.
그럼 str3 == str4가 왜 false냐 생각할 수 도 있습니다. 결론적으로 말하면 str3str4는 서로 다른 객체입니다.


여기까지의 내용을 알기 쉽게 간단하게 그려봤습니다.

반응형

'Java' 카테고리의 다른 글

[Java] List 중복 제거하기  (0) 2020.07.09
[Java]Immutable Object(불변객체)  (0) 2020.07.03
[Java] 배열을 ArrayList로 변환  (0) 2020.06.30
[Java] 자바 날짜, 시간 API의 형변환 방법  (0) 2020.06.29
[Java] LocalDateTime  (0) 2020.06.28