[Java] String과 new String 차이

2022. 11. 15. 11:02 JAVA/Java

String 문자열 생성 방식

String str1 = new String("Hello");
String str2 = "Hello";
String str3 = "Hello";

1. new 이용한 문자열 생성

2. 문자열 리터럴 생성

 

두 방식의 차이점

두 방식의 가장 큰 차이점은 메모리 영역에 있다.

 

new 연산자를 통해 String을 생성하면 Heap 영역에 존재하게 되고, 리터럴을 이용할 경우 string constant pool이라는 영역에 존재하게 된다. (아래 그림 참고)

 

 

 

똑같은 "Hello" 문자열을 사용하는 데 변수 str2 와 str3은 같은 객체를 바라보지만 new String으로 생성한 str1은 다른 메모리 주소의 객체를 바라보는 것이다.

 

 

문자열을 비교해보면,

 

String str1 = new String("Hello");
String str2 = "Hello";
String str3 = "Hello";

System.out.println(str1.equals(str2));   // true
System.out.println(str1 == str2);        // false
System.out.println(str2 == str3);        // true

str1과 str2는 두 변수가 가리키는 객체의 문자열은 "Hello" 인데, 왜 == 연산의 경우 false가 나오는 걸까?

 

equals 연산자는 단순 문자열을 비교한다면, == 연산자는 두 객체의 주소값을 비교하기 때문에

 

new 연산자를 통해 Heap 영역에 생성된 String str1과 리터럴을 이용해 String constant Pool 영역에 위치한 String str2과의 주소값은 같을 수가 없는 것이다 !

 

참고로 Java6까지 string constant pool의 위치는 Perm 영역이었다. Perm 영역에 위치하였던 게 Java7에서 Heap 영역으로 변경되었다.

 

출처 : https://haenny.tistory.com/18