티스토리 뷰

Study/Java

[Java] 문자열 비교 방법 (equals)

코딩하는 앤지 2023. 6. 21.
728x90
반응형

Python 언어에 익숙한 개발자라면, Java에서 문자열을 비교할 때 예상치 못한 결과를 마주할 수 있다.

Python에서 문자열을 비교하는 경우 == 연산자만 사용해도 문제가 없다.

하지만 Java에서는 같은 문자열을 비교하더라도 == 연산자를 사용하면 false를 반환하는 경우가 있다.

그 이유를 알기 위해서는 먼저 Java의 메모리 모델을 이해해야 한다.

 

Java 메모리 모델

Java에서 문자열이 메모리에 저장되는 방식을 이해하면 문자열 비교 방법을 이해하는데 도움이 된다.

  • 문자열 리터럴: 문자열 리터럴은 String Pool에 저장되며, 컴파일 시점에 동일한 값이라면 같은 메모리 주소를 공유한다.
  • new 키워드로 생성된 문자열: new 키워드를 사용해 생성한 문자열은 Heap에 저장되며, 동일한 값을 가진 문자열이라도 서로 다른 주소를 갖게 된다.

이러한 이유로, 같은 문자열 값이라도 저장 방식에 따라 메모리 주소가 다를 수 있다.

문자열 비교 방법

Java에는 문자열을 비교할 때 == 연산자equals() 메서드 두 가지 방법이 있다.

1. == 연산자

  • == 연산자는 두 객체의 주소를 비교한다.
  • 즉, 두 문자열이 동일한 메모리 주소를 가리키는지 확인한다.
  • 따라서 같은 값을 가진 서로 다른 객체라면 == 연산자는 false를 반환한다.
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");

System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
  • 위의 예시에서 str1과 str2는 String Pool에 저장된 같은 주소를 가리키기 때문에 true를 반환한다.
  • 하지만, str3는 new 키워드를 사용해 생성되었기 때문에 str1과는 다른 메모리 주소를 가지며, false가 출력된다.

2. equals() 메서드

  • equals() 메서드는 두 문자열의 데이터 을 비교한다.
  • 즉, 문자열의 값이 동일하다면 true를 반환한다.
String str1 = "Hello";
String str2 = new String("Hello");
String str3 = new String("Hello");

System.out.println(str1.equals(str2)); // true
System.out.println(str2.equals(str3)); // true
  • equals() 메서드를 사용하면 문자열의 내용만을 비교하므로, 메모리 주소에 상관없이 동일한 값을 가진 문자열이라면 true를 반환합니다.

결론

Java에서 문자열을 비교할 때는 문자열의 주소가 아닌 데이터 값을 비교하기 위해 equals() 메서드를 사용하는 것이 권장된다. 특히 new 키워드를 사용해 문자열을 생성하는 경우, 메모리 주소가 달라질 수 있으므로 == 연산자는 피하는 것이 좋다.

728x90
반응형
댓글