본문 바로가기

Language/Java

Java~문자열, 숫자, 날짜 비교 (compareTo)

반응형

시작에 앞서

숫자의 경우, 비교연산자로 쉽게 비교를 할 수 있습니다만, 문자와 날짜의 경우 어떻게 비교를 할지 조금은 난감합니다. 그럴때 사용할 수 있는 메소드인 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));
반응형