본문 바로가기
발견

[오늘의 발견 / Java] String의 생성 방식에 따른 비교 결과 차이

by Dev_Green 2023. 7. 17.

String 생성 방식의 종류

String 타입의 생성 방식에는 두 가지가 있다.

  1. literal을 이용한 방식
  2. new 연산자를 이용한 방식
String str1 = "YOUTH";  // literal을 이용한 방식
String str2 = "YOUTH";  // literal을 이용한 방식
String str3 = new String("YOUTH");  // new 연산자를 이용한 방식

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

String 타입은 참조형 변수로서 == 비교를 하면 주소값 비교(Call by Reference)를 한다.

주소값에 들어있는 값을 비교하기 위해서는 equals() 메서드를 사용해야 한다.

 

서로 다른 String 객체끼리 == 비교할 때 true가 나올 수 있다?

위 코드에서 str1과 str2의 경우를 보자.

str1와 str2는 값이 "YOUTH"로 같더라도 각각 개별적으로 선언되었기 때문에 각각의 주소를 가지므로 == 비교 시에 false가 나올 것으로 예상했다. 

하지만 결과는 true 였다.

 

발견

내가 간과했던 부분은 String 객체의 생성 방식에 따라 메모리 할당 방식에 차이가 있다는 것이었다.

 

String 객체 생성 시 literal을 사용하면 string constant pool에 생성되고, new 연산자를 사용하면 Heap 영역에 생성이 되는데,

이때 literal로 생성 시 이미 같은 literal이 pool 내에 존재한다면 해당 주소값을 반환하고, 존재하지 않는다면 새로운 주소값을 할당한다.

다시 말해서, 같은 literal로 선언된 String 객체는 같은 주소를 가진다. 즉, == 비교 시 true를 반환한다.