'equalsIgnoreCase()'에 해당되는 글 1건

  1. 2015.03.17 자바 문자열 비교 - equals(), equalsIgnoreCase()

자바의 String 형을 선언하는 방법에는 2가지가 있습니다.

 

1. 기본 자료형(Primitive Type) : 실제 값을 저장

String apple = "apple";

 

2. 참조형(Reference Type) : 클래스를 사용하여 값이 저장되어 있는 주소를 저장

String banana = new String("banana");

 

두 가지 모두 애용되는 방법이지만

문자열을 비교하는 연산을 수행할 때 원하지 않는 오류를 발생시킬수 도 있습니다.

 

오늘은 기본 자료형과 참조형에 대한 등위 연산자의 차이와

문자열 비교에 이용되는 다양한 String 메소드에 대해서 알아 보도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class StringTest {
    
    public static void printResult(boolean result) {
        if (result) {
            System.out.println("같다");
        } else {
            System.out.println("다르다");            
        }
    }
 
    public static void main(String[] args) {
        // 기본 자료형(primitive type)
        String str1 = "apple";
        String str2 = "apple";
                
        // 참조형(reference type) : class
        String str3 = new String("apple");
        String str4 = new String("apple");
 
        // 등위 연산자( == )
        printResult(str1 == str2);        
        printResult(str2 == str3);
 
        // equals(), equalsIgnoreCase()
        printResult(str2.equalsIgnoreCase(str3));
        printResult(str3.equalsIgnoreCase(str4));
 
        // compareTo(), compareToIgnoreCase()
        printResult(str2.compareToIgnoreCase(str3) == 0);
        
        // matches(regex)
        printResult(str2.matches(str3));
    }
}
 
cs

 

"apple" 이라는 문자열을 대해 기본 자료형 변수와(str1, str2) 참조형 변수(str3, str4) 가 각각 2개씩 선언하였습니다.

 

 

1. 등위 연산자 ( == )

 

첫 번째로 비교에서 가장 많이 사용되는 등위 연산자를 적용해 보았습니다.

 

1
2
3
// 등위 연산자( == )
printResult(str1 == str2);    // 같다
printResult(str2 == str3);    // 다르다
cs

 

같은 기본 자료형을 비교했을 때에는 "같다"

기본 자료형과 참조형을 비교했을 때에는 "다르다"는 결과가 출력되었습니다.

 

두 연산의 결과가 다른 이유는 무엇이었을까요?

그 이유는 기본 자료형으로 선언한 경우 변수가 다르더라도 같은 내용(문자열)을 갖고 있다면 동일한 주소값을 가리키고 있기 때문입니다. 따라서 처음의 등위 연산자는 "같다" 는 결과를 출력하게 된 것 입니다.

 

이와 반대로 참조형의 경우에는 각각 메모리의 일정한 공간을 차지하기 때문에 기본 자료형과 같은 내용(문자열)을 갖고 있다 하더라도 다른 주소를 가리키게 됩니다. 그래서 다음의 등위 연산자는 "다르다" 는 결과를 나타내게 됩니다.

 

printResult(str3 == str4); // 다르다 

참조형 변수를 비교하더라고 마찬가지로 "다르다" 라는 결과를 얻게 될 것입니다.

 

결국 등위 연산자가 비교한 값은 실제 문자열이 아닌 문자열이 저장된 주소인 것이지요.

 

 

2. equals(), equalsIgnoreCase()

 

우리가 비교하고 싶은 것은 실제 문자열! 입니다.

 

1
2
3
4
// equals(), equalsIgnoreCase()
printResult(str2.equalsIgnoreCase(str3));    // 같다
printResult(str3.equalsIgnoreCase(str4));    // 같다
cs

 

그래서 문자열의 비교에는 String 클래스에서 제공해주는 equals(), equalsIgnoreCase() 메소드를 사용합니다. 실제 문자열을 비교하기 때문에 기본 자료형과 참조형의 비교에도 우리가 원하는 "같다" 는 결과를 제대로 돌려줍니다.

 

1
2
3
4
5
printResult("apple".equals("APPLE"));    // 다르다
printResult("apple".equals("apple"));    // 같다
        
printResult("apple".equalsIgnoreCase("APPLE"));    // 같다
printResult("apple".equalsIgnoreCase("apple")); // 같다
cs

 

equals() 메소드는 대소문자를 구분하여 비교하고

equalsIgnoreCase() 메소드는 대소문자를 구분하지 않고 비교하므로

원하는 비교 형태를 확인하시고 선택 / 사용하면 더욱 유용합니다.

 

 

3. 그 외의 방법들  : compareTo(), compareToIgnoreCase(), matches()

 

equals(), equalsIgnoreCase() 메소드 이외에도 

String 클래스에서 제공해주는 다양한 메소드를 활용할 수도 있습니다.

 

1
2
3
4
5
// compareTo(), compareToIgnoreCase()
printResult(str2.compareToIgnoreCase(str3) == 0);    // 같다
        
// matches(regex)
printResult(str2.matches(str3));    // 같다
cs

 

두 문자열의 길이가 같은지, 각각의 순서에 맞게 char 로 비교한 결과를 리턴하는

compareTo(), compareToIgnoreCase() 메소드는 두 문자열이 같다면 0 를 반환하게 됩니다.

 

또한 matches() 메소드는 파라미터로 정규식(regex) 를 입력받아, 문자열이 정규식과 일치하는지 확인하는 데 사용되지만 위에서와 같이 문자열 비교에도 이용할 수 있습니다.

 

Posted by maze1008
,