개발 낙서장

[JAVA] compareTo 본문

Java

[JAVA] compareTo

권승준 2024. 11. 26. 00:35

자바의 래퍼 클래스에는 compareTo라는 메소드가 있다.
두 객체를 비교하여 int 형식으로 비교 결과값을 반환하는 메소드이다.
다만, 재밌는 점이 있는데 숫자형과 문자형 두 경우에 따라 비교 기준이 달라진다.

숫자형의 경우 -1(작음), 0(같음), 1(큼)을 반환하고 문자형의 경우 0(같음) 외 다양한 기준에 따라 음수와 양수를 반환한다.

숫자형

    public static void main(String[] args) throws Exception {
        Integer a = 0;
        Integer b = 2;

        System.out.println(a.compareTo(b));	// 0, 2		=> -1
        System.out.println(a.compareTo(b - 2));	// 0, 0		=> 0
        System.out.println(a.compareTo(b - 5));	// 0, -3	=> -1
    }

숫자형의 경우 위처럼 단순히 크고 작음만 비교해 결과를 반환한다.

문자형

    public static void main(String[] args) throws Exception {
        // 1. 문자열이 다를 경우
        String s1 = "c";
        String s2 = "abcd";

        System.out.println(s1.compareTo(s2));		// 2
        System.out.println(s1.compareTo(s2 + "e"));	// 2

        // 2. 비교 문자열에 포함된 경우
        s1 = "ab";
        s2 = "abcd";

        System.out.println(s1.compareTo(s2));		// -2
        System.out.println(s1.compareTo(s2 + "e"));	// -3
        System.out.println(s1.compareTo("abc"));	// -1
    }

문자형의 경우 두 가지 경우에 따라 비교 기준이 달라진다.

먼저 어느 한 문자열이 포함되지 않고 다른 경우 앞 자리부터 비교해 아스키 코드의 차이를 반환한다.
즉, '하나의 문자열 전체가 다른 하나의 문자열에 포함된 경우'가 아니라면 앞 자리부터 아스키 코드를 비교한다.

반대로 어느 한 문자열 전체가 다른 문자열에 포함된 경우에는 두 문자열의 자릿수 차이를 반환한다.

코드에서 첫 번째의 경우 s1과 s2 서로 포함되지 않으므로 앞 자리부터 아스키 코드의 차이인 2를 반환하는 것이다.
s2에 e를 더해봤지만 결과는 같다.

근데 여기서 이상한 점이 있는데 분명 "c"는 "abcd"에 포함돼있는데 왜 아스키 코드로 비교할까?
문자열의 시작부터 포함돼있는지를 검증하기 때문에 시작부터 하나라도 문자가 다를 경우 바로 아스키 코드로 비교한다.
즉, 위의 경우에선 s1이 "a", "ab", "abc", "abcd", "abcd ..."이 아닐 경우에는 전부 아스키 코드로 비교하는 것이다.

두 번째 경우가 하나의 문자열이 다른 문자열에 포함돼 자릿수로 비교하는 경우이다.
"ab"(2) - "abcd"(4) = -2
"ab"(2) - "abcde"(5) = -3
"ab"(2) - "abc"(3) = -1

'Java' 카테고리의 다른 글

[JSP] API 연동 및 데이터 출력  (1) 2024.12.13
[JSP] SpringBoot + JSP 설정  (0) 2024.12.12
[Spring] @RequestPart 테스트 HttpMediaTypeNotSupportedException  (0) 2024.05.17
Spring + Redis Cache  (0) 2024.05.13
JDK 17을 쓰는 이유  (1) 2024.05.02
Comments