서비스에서 문자열을 비교하던 중 같은 값을 비교했는데 false가 나오는 상황이 발생했습니다.
원인을 찾아보니 == 연산자로 문자열을 비교했기 때문이었습니다.
== 연산자는 객체의 주소를 비교하여 일치하는지 확인하고, equals() 메서드는 객체의 내용을 비교하여 같은지 확인하는 메서드입니다.
객체의 주소값
문자열의 내용은 같아도 리터럴로 선언하였는지, new 연산자로 선언하였는지에 따라 주소(참조)값이 다를 수 있습니다.
String str1 = "strong"; //리터럴로 선언
String str2 = "strong";
String str3 = new String("strong"); //new 연산자로 선언
String str4 = new String("strong");
문자열 리터럴을 사용하는 경우, 자바 컴파일러는 String Constant Pool이라는 영역에 같은 값의 문자열을 공유하여 메모리 사용량을 최적화합니다. 따라서 str1과 str2의 주소값은 같습니다.
하지만 new 연산자를 사용하여 새로운 문자열 객체를 생성하는 경우에는 Heap 영역에 저장되며 다른 주소값을 할당받습니다. str1과 str3의 주소값은 다르며, str3과 str4의 주소값도 다릅니다.
== 연산자
== 연산자는 두 문자열의 주소(참조)값이 같은지 비교합니다. 다시 말해 두 객체가 메모리에서 동일한 위치를 가리키는지를 확인합니다.
String str1 = "strong"; //리터럴로 선언
String str2 = "strong";
String str3 = new String("strong"); //new 연산자로 선언
System.out.println(str1 == str2); //true
System.out.println(str1 == str3); //false
문자열 리터럴을 사용한 str1과 str2는 주소값이 같으므로 == 비교는 true를 리턴합니다.
new 연산자로 생성한 문자열 객체 str3은 주소값이 다르므로 == 비교는 false를 리턴합니다.
equals() 메서드
equals() 메서드는 두 문자열의 내용을 비교합니다. 다시 말해, 두 문자열이 동일한 값을 가지고 있는지를 확인합니다.
String str1 = "strong";
String str2 = "strong";
String str3 = new String("strong");
System.out.println(str1.equals(str2)); //true
System.out.println(str1.equals(str3)); //true
str1, str3은 주소값이 다르더라도 문자열의 내용이 같으므로 equals() 메서드로 비교하면 true를 리턴합니다.
결론
문자열의 내용을 비교하려할 때에는 == 비교 대신 equals() 메서드를 사용해야 합니다.
'Programming > JAVA' 카테고리의 다른 글
[Java] 배열 요소의 중복을 제거하는 방법 (0) | 2023.06.15 |
---|---|
[Java] Arrays.asList() (0) | 2022.08.29 |
[Java] equalsIgnoreCase() / equals() / toUpperCase() / toLowerCase() (0) | 2022.08.26 |
댓글