시작에 앞서
숫자의 경우, 비교연산자로 쉽게 비교를 할 수 있습니다만, 문자와 날짜의 경우 어떻게 비교를 할지 조금은 난감합니다. 그럴때 사용할 수 있는 메소드인 compareTo에 대해 알아보도록 합시다.
CompareTo의 문법
int result = a.compareTo(b);
비교의 결과값은 정수로 표현됩니다. 리턴되는 정수의 값이 음수인가 양수인가 0인가에 따라 대소를 표현합니다.
결과 | 설명 |
---|---|
result < 0 (음수) | a < b |
result = 0 | a = b |
result > 0 (양수) | a > b |
사용 예
1. 숫자의 비교
숫자의 비교에 앞서 주의해야 할 점이 있습니다.
compareTo는 클라스 메소드 이기 때문에 int나 double등은 컴파일 에러가 발생합니다.
Integer클래스로 비교의 예를 한 번 살펴보도록 합시다.
Integer test1 = 1;
Integer test2 = -5;
Integer test3 = 3;
// 1과 -5의 비교 -> 1 (양수 a > b)
System.out.println(test1.compareTo(test2));
// 1과 3의 비교 -> -1 (음수 a < b)
System.out.println(test1.compareTo(test3));
// 1과 1의 비교 -> 0 (a = b)
System.out.println(test1.compareTo(test1));
int의 비교를 잠깐 살펴 봅시다.
int는 서문에서 언급한 비교연산자로 비교가 가능하지만 리턴값은 boolean(true / false)이므로 int를 리턴하는 비교함수와는 결과값이 달라 집니다.
그럼, compareTo와 같은 비교함수는 없을까요?
Integer클래스 내부함수 compare를 사용하면 compareTo와 같은 int값이 리턴됩니다.
int result = Integer.compare(a,b);
대소관계에 따른 결과값은 compareTo와 동일합니다.
그럼 예를 살펴봅시다.
int test1 = 1;
int test2 = -5;
int test3 = 3;
// 1과 -5의 비교 -> 1 (양수 a > b)
System.out.println(Integer.compare(test1, test2));
// 1과 3의 비교 -> -1 (음수 a < b)
System.out.println(Integer.compare(test1, test3));
// 1과 1의 비교 -> 0 (a = b)
System.out.println(Integer.compare(test1, test1));
2. 문자열의 비교
문자열 String의 비교의 경우 각 문자열의 '아스키코드'를 비교합니다.
String test1 = "a";
String test2 = "e";
// 아스키코드 확인
System.out.format("0x%02X%n", (int) test1.charAt(0)); // 0x61
System.out.format("0x%02X%n", (int) test2.charAt(0)); // 0x65
// a(0x61)와 e(0x65)의 비교 -> -4 (음수 a < b 61-65)
System.out.println(test1.compareTo(test2));
// e(0x65)와 a(0x61)의 비교 -> 4 (양수 a > b 65-61)
System.out.println(test2.compareTo(test1));
// a(0x61)와 a(0x61)의 비교 -> 0 (a = b 61-61)
System.out.println(test1.compareTo(test1));
위의 예시처럼 문자코드의 차가 출력이 됩니다.
문자비교에서 주의해야 할 점은 대문자와 소문자의 비교입니다.
앞서 확인했듯이 아스키코드를 비교하기 때문에 대문자와 소문자는 다른 문자로서 인식합니다.
대문자와 소문자를 구분하지 않고, 문자를 비교하기 위해서는 compareToIgnoreCase함수를 사용합니다.
예시를 한번 확인해 봅시다.
String test1 = "a";
String test2 = "A";
System.out.format("0x%02X%n", (int) test1.charAt(0)); // 0x61
System.out.format("0x%02X%n", (int) test2.charAt(0)); // 0x41
// compareTo 를 이용한 비교
// a(0x61)와 A(0x41)의 비교 -> 32 (양수 a < b 65-41)
System.out.println(test1.compareTo(test2));
// compareToIgnoreCase 를 이용한 비교
// a(0x61)와 A(0x41)의 비교 -> 0 (a = b)
System.out.println(test1.compareToIgnoreCase(test2));
3. 날짜의 비교
마지막으로 날짜 Date의 비교를 확인해 봅시다.
문자열 비교처럼 차이가 출력되는 것이 아니라, 숫자비교처럼 대소결과만 출력됩니다.
예를 살펴봅시다.
Calendar calendar = Calendar.getInstance();
calendar.set(2022, 7, 13);
Date test1 = calendar.getTime();
System.out.println(test1); // 2022/8/13
calendar.add(calendar.MONTH, 2);
Date test2 = calendar.getTime();
System.out.println(test2); // 2022/10/13
// 2022/8/13과 2022/10/13의 비교 -> -1 (음수 a < b)
System.out.println(test1.compareTo(test2));
// 2022/10/13과 2022/8/13의 비교 -> 1 (양수 a > b)
System.out.println(test2.compareTo(test1));
// 2022/8/13과 2022/8/13의 비교 -> 0 (a = b)
System.out.println(test1.compareTo(test1));
'Language > Java' 카테고리의 다른 글
Java~문자열 속 특정 문자 찾기 contains와 matches (0) | 2023.06.20 |
---|---|
Java~Math를 이용한 제곱, 제곱근 (0) | 2023.02.13 |
Java~Arrays를 이용한 문자열의 올림차순, 내림차순 (0) | 2023.02.08 |
Java~비트 연산자 (0) | 2022.06.20 |