자바의 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) 를 입력받아, 문자열이 정규식과 일치하는지 확인하는 데 사용되지만 위에서와 같이 문자열 비교에도 이용할 수 있습니다.
'IT > Java' 카테고리의 다른 글
자바 랜덤 문자열 함수(RandomString) (0) | 2015.03.25 |
---|---|
자바 랜덤함수(Java Random) (0) | 2015.03.24 |
BigInteger 클래스 - 아주 큰 정수 표현하기 (0) | 2015.03.14 |
BigDecimal 클래스 - 오차없이 실수 표현하기 (0) | 2015.03.13 |
자바 버전 확인 (0) | 2015.03.09 |