Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java)에서 문자열을 비교하는 올바른 방법 총정리

자바에서 문자열의 동등성을 비교하려면 String 객체의 equals() 또는 equalsIgnoreCase() 메서드를 사용해야 합니다. 이 글에서는 각 메서드의 사용법과 함께, == 연산자로 문자열을 비교하면 안 되는 이유까지 예제 코드와 함께 자세히 살펴보겠습니다.

equals() 메서드로 문자열 비교하기

두 문자열을 비교할 때 대소문자까지 구분해야 한다면 equals() 메서드를 사용합니다.

다음 예제는 두 String 인스턴스가 대소문자를 포함한 모든 문자가 일치하는지 확인합니다.

public class CompareTwoStrings {

    public static void main(String[] args) {
        String firstString = "Test123";
        String secondString = "Test" + 123;
        String thirdString = "TEST123";

        if (firstString.equals(secondString)) {
            System.out.println("첫 번째와 두 번째 문자열이 같습니다");
        }

        if (firstString.equals(thirdString)) {
            System.out.println("첫 번째와 세 번째 문자열이 같습니다");
        }
    }
}

실행 결과:

첫 번째와 두 번째 문자열이 같습니다

참고: 두 번째 if 문은 실행되지 않습니다. firstString과 thirdString의 대소문자가 서로 일치하지 않기 때문입니다.

equalsIgnoreCase() 메서드로 문자열 비교하기

두 문자열을 비교하되 대소문자를 구분하지 않아도 된다면 equalsIgnoreCase() 메서드를 사용합니다.

위 예제에서 .equals().equalsIgnoreCase()로 바꾸면 어떻게 되는지 확인해 보겠습니다.

public class CompareTwoStrings {

    public static void main(String[] args) {
        String firstString = "Test123";
        String secondString = "Test" + 123;
        String thirdString = "TEST123";

        if (firstString.equalsIgnoreCase(secondString)) {
            System.out.println("첫 번째와 두 번째 문자열이 같습니다");
        }

        if (firstString.equalsIgnoreCase(thirdString)) {
            System.out.println("첫 번째와 세 번째 문자열이 같습니다");
        }
    }
}

실행 결과:

첫 번째와 두 번째 문자열이 같습니다
첫 번째와 세 번째 문자열이 같습니다

이번에는 대소문자가 달라도 모든 조건문이 실행되는 것을 확인할 수 있습니다.

  • 자바에서 toString()을 재정의해야 하는 이유
  • 자바에서 문자열을 거꾸로 뒤집는 방법
  • 문자열에서 숫자만 추출하는 방법
  • 자바에서 String을 Int로 변환하는 방법

== 연산자로 문자열을 비교하면 안 되는 이유

주의: 자바에서 두 문자열을 비교할 때 == 또는 != 연산자를 사용해서는 안 됩니다.

이 연산자들은 실제로 참조(reference)를 비교합니다. 여러 개의 String 객체가 동일한 문자열 값을 가질 수 있기 때문에, 의도와 다른 잘못된 결과가 나올 가능성이 큽니다.

대신 문자열의 을 기준으로 객체를 비교하는 String.equals(Object) 메서드를 사용해야 합니다.

public class CompareTwoStrings {

    public static void main(String[] args) {
        String firstString = "Test123";
        String secondString = "Test123";
        String thirdString = new String("Test123");

        if (firstString == secondString) {
            System.out.println("첫 번째와 두 번째 문자열이 같습니다");
        }

        if (firstString == thirdString) {
            System.out.println("첫 번째와 세 번째 문자열이 같습니다");
        }
    }
}

실행 결과:

첫 번째와 두 번째 문자열이 같습니다

참고: 두 번째 if 문은 실행되지 않습니다. new String("Test123")으로 생성된 객체는 리터럴과 참조가 다르기 때문입니다. 값은 같지만 참조가 다른 것이죠.

상수 값과 문자열 비교하기

문자열을 상수 값과 비교할 때는 상수를 equals()왼쪽에 두는 것이 좋습니다. 이렇게 하면 비교 대상 문자열이 null이더라도 NullPointerException이 발생하지 않습니다.

예를 들어 다음과 같습니다.

"baz".equals(foo)

foo.equals("baz")는 foo가 null일 경우 NullPointerException을 던지지만, "baz".equals(foo)는 안전하게 false를 반환합니다.

더 가독성이 좋은 대안으로 Objects.equals()를 사용할 수도 있습니다. 이 메서드는 두 매개변수 모두에 대해 null 검사를 내부적으로 수행합니다.

예: Objects.equals(foo, "baz")

switch 문에서 문자열 비교하기

Java 1.7부터는 switch 문에서 String 변수를 리터럴 값과 비교할 수 있습니다. 단, String 변수가 null이 아닌지 반드시 확인해야 합니다. null이면 항상 NullPointerException이 발생합니다. 또한 내부적으로 String.equals를 사용해 값을 비교하므로 대소문자를 구분한다는 점도 유의해야 합니다.

public class CompareTwoStrings {

    public static void main(String[] args) {
        String stringToSwitch = "A";

        switch (stringToSwitch) {
            case "a":
                System.out.println("a");
                break;

            case "A":
                System.out.println("A"); // 이 부분이 실행됩니다
                break;

            case "B":
                System.out.println("B");
                break;

            default:
                break;
        }
    }
}

마무리

이 글에서는 코드 예제와 함께 자바에서 문자열을 비교하는 다양한 방법을 살펴보았습니다. 정리하면 다음과 같습니다.

  • 대소문자가 중요한 경우에는 .equals()를 사용합니다.
  • 대소문자를 구분할 필요가 없다면 .equalsIgnoreCase()를 사용합니다.
  • == 연산자는 값이 아닌 참조를 비교하므로 문자열 비교에 절대 사용해서는 안 됩니다.
  • null 안전성을 위해 상수를 왼쪽에 두거나 Objects.equals()를 활용하는 것도 좋은 습관입니다.