크리스의 개발일기

[JAVA] 자바에서 문자열(String) 비교하는 방법 / '==' , .equals() 본문

JAVA

[JAVA] 자바에서 문자열(String) 비교하는 방법 / '==' , .equals()

ChrisJang 2020. 12. 21. 15:47
반응형

 보통 자바에서 equals를 사용하여 문자열이 동일한지 확인합니다. 

다른 언어와 다르게 ==로 문자열이 같은지 확인하지 않습니다.

=> '=='는 object가 동일한지를 체크하기 때문에 object가 갖고 있는 문자열이 동일하다는 것을 보장하지 않기 때문입니다. 또한 compare 메소드를 이용하여 문자열을 비교할 수 있습니다.

 

equals()으로 문자열 비교

String str1 = "Hello";
String str2 = "World";
String str3 = "Hello";

System.out.println("str1.equals(str2) : " + str1.equals(str2));
System.out.println("str2.equals(str1) : " + str2.equals(str1));
System.out.println("str1.equals(str3) : " + str1.equals(str3));

결과 : 

str1.equals(str2) : false
str2.equals(str1) : false
str1.equals(str3) : true

 

equals()는 모든 객체의 부모 클래스인 Object에 정의되어있는 메소드입니다. String 클래스는 다음과 같이 equals()를 오버라이드하여 인자로 전달된 String의 문자열을 비교하고 있습니다. 간단히 코드를 보면 == 키워드로 객체가 갖다면 더 확인하지 않고 true를 리턴합니다. 객체가 다른 경우 인자가 String이라면 문자열을 비교하여 동일한지 결과를 리턴해 줍니다.

 

// String.java
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

 

equals()를 사용하면서 주의할 점은 다음과 같이 str1이 null이라면 NullPointerException이 발생합니다.

String str1 = null;
String str2 = "World";
System.out.println("a.equals(b) : " + str1.equals(str2));

반대로 인자로 전달되는 객체는 null이라도 NullPointerException가 발생하지 않습니다.

String str1 = "Hello";
String str2 = null;
System.out.println("a.equals(b) : " + str1.equals(str2));

사실 이런 NullPointerException이 발생하는 것을 신경쓰고 싶지 않다면 Objects.equals()를 사용하여 두개의 객체를 비교할 수 있습니다.

System.out.println("str1 == str2 ? " + Objects.equals(str1, str2));
System.out.println("str1 == str3 ? " + Objects.equals(str1, str3));

Objects 클래스에 구현되어있는 코드를 보면 Null을 체크하기 때문에 NullPointerException이 발생하지 않습니다.

// Objects.java
public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}

그리고 문자열을 비교할 떄 대소문자도 비교합니다. 대소문자를 구분하지 않고 알파벳이 같은지만 보려면 equalsIgnoreCase()를 사용해야 합니다.

String str = "Hello";

System.out.println("equals ? " + "Hello".equals(str));
System.out.println("equalsIgnoreCase ? " + "hello".equalsIgnoreCase(str));

결과 :

equals ? true
equalsIgnoreCase ? true

 

"== "를 이용하여 문자열 비교

"=="를 이용하여 문자열을 비교하면 안됩니다.

다음 예제를 보시면, 문자열이 같지만 false를 리턴하는 경우도 있다는 것을 알 수 있습니다.

 

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

System.out.println("str1 == str2 ? " + (str1 == str2));
System.out.println("str1 == str3 ? " + (str1 == str3));

System.out.println("str1 hashCode ? " + System.identityHashCode(str1));
System.out.println("str2 hashCode ? " + System.identityHashCode(str2));
System.out.println("str3 hashCode ? " + System.identityHashCode(str3));

결과 : 

str1 == str2 ? true
str1 == str3 ? false
str1 hashCode ? 1789447862
str2 hashCode ? 1789447862
str3 hashCode ? 38997010

'=='는 객체가 같은지를 비교하지만 객체가 갖고 있는 문자열을 비교하지는 않습니다.

str1과 str2는 모두 동일한 문자열 "Hello"를 가리키기 때문에 같은 object입니다. 하지만 str3는 new String()으로 만든 객체로 이 둘과 다릅니다. System.identityHashCode()는 object의 hashCode를 리턴하는 메소드인데요. 이것을 이용하면 str1과 str3는 문자열은 같지만 서로 다른 객체라는 것을 알 수 있습니다.

 

 

 

 

출처 :

codechacha.com/ko/java-string-compare/

반응형
Comments