어제 오늘 내일

[Java] 문자열 사전순 비교 방법 (compareTo, 정렬, 대소문자 무시) 본문

IT/Java

[Java] 문자열 사전순 비교 방법 (compareTo, 정렬, 대소문자 무시)

hi.anna 2025. 8. 22. 00:12

 
프로그래밍을 하다 보면 문자열을 서로 비교하거나 정렬해야 할 때가 있습니다.
예를 들어,

  • 학생 이름을 가나다순/알파벳 순으로 정렬
  • 단어 목록을 정리
  • 검색 기능에서 입력한 값과 비교

이럴 때 자바(Java)에서는 문자열을 사전순(lexicographical order) 으로 비교할 수 있는 여러 가지 방법을 제공합니다.
이번 글에서는 compareTo(), compareToIgnoreCase(), 그리고 대소문자 구분 없는 정렬의 확실한 방법까지 차근차근 살펴보겠습니다.
 


 

1. compareTo() 기본 사용법

자바에서 문자열 비교의 핵심은 compareTo() 메서드입니다.
이 메서드는 두 문자열을 비교해 정수(int) 값을 반환합니다.

  • 음수(-) → 앞 문자열이 뒤 문자열보다 사전순으로 먼저 옴
  • 0 → 두 문자열이 같음
  • 양수(+) → 앞 문자열이 뒤 문자열보다 사전순으로 늦게 옴

예제 1: 문자열 두 개 비교

public class CompareExample1 {
    public static void main(String[] args) {
        String a = "apple";
        String b = "banana";

        int result = a.compareTo(b);

        if (result < 0) {
            System.out.println(a + " < " + b);
        } else if (result == 0) {
            System.out.println(a + " == " + b);
        } else {
            System.out.println(a + " > " + b);
        }
    }
}

실행 결과

apple < banana

👉 "apple"이 "banana"보다 사전에서 앞에 오므로 음수가 반환됩니다.
 


 

2. 대소문자 구분 없는 비교: compareToIgnoreCase()

기본적으로 compareTo()는 대소문자를 구분합니다.
즉 "Apple"과 "apple"은 서로 다른 문자열로 인식합니다.

예제 2: 대소문자 구분 비교

public class CompareExample2 {
    public static void main(String[] args) {
        String a = "Apple";
        String b = "apple";

        System.out.println(a.compareTo(b)); // 결과: -32
    }
}

대문자 "A"와 소문자 "a"의 유니코드 값 차이 때문에 -32가 반환됩니다.
만약 대소문자를 무시하고 비교하고 싶다면 compareToIgnoreCase()를 사용합니다.
 

예제 3: 대소문자 무시 비교

public class CompareExample3 {
    public static void main(String[] args) {
        String a = "Apple";
        String b = "apple";

        System.out.println(a.compareToIgnoreCase(b)); // 결과: 0
    }
}

실행 결과

0

👉 "Apple"과 "apple"을 동일한 문자열로 취급합니다.
 


 

3. 여러 문자열 정렬하기

문자열이 여러 개 있을 때는 정렬 기능을 활용하면 더 편리합니다.
자바에서는 Collections.sort()나 Arrays.sort()를 이용해서 문자열 리스트를 사전순으로 정렬할 수 있습니다.

예제 4: 기본 정렬

import java.util.*;

public class SortExample1 {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("banana", "Apple", "cherry", "apple");

        Collections.sort(words);
        System.out.println("대소문자 구분 정렬: " + words);
    }
}

실행 결과

대소문자 구분 정렬: [Apple, apple, banana, cherry]

👉 기본 정렬은 대문자가 소문자보다 먼저 나옵니다.
 


 

4. 대소문자 구분 없는 정렬 

많은 분들이 String.CASE_INSENSITIVE_ORDER를 사용하면 대소문자 무시 정렬이 될 거라 생각하지만,
사실은 같은 단어일 때 원래 순서에 영향을 받습니다.
따라서 완전한 대소문자 무시 정렬을 원한다면, 문자열을 소문자나 대문자로 변환해서 정렬 기준으로 삼는 것이 가장 확실합니다.

예제 5: 대소문자 무시 정렬

import java.util.*;

public class SortExample2 {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("banana", "Apple", "cherry", "apple", "Banana");

        // 대소문자 무시 정렬 (추천 방식)
        words.sort(Comparator.comparing(String::toLowerCase));

        System.out.println("대소문자 무시 정렬 결과: " + words);
    }
}

실행 결과

대소문자 무시 정렬 결과: [Apple, apple, banana, Banana, cherry]

👉 "Apple"과 "apple", "banana"와 "Banana"를 같은 단어로 취급하면서도 원본 값은 그대로 유지됩니다.


5. 정리

  • 문자열 비교 기본: compareTo()
  • 대소문자 무시 비교: compareToIgnoreCase()
  • 리스트 정렬: Collections.sort() / Arrays.sort()
  • 대소문자 무시 정렬: Comparator.comparing(String::toLowerCase)

이번 글의 핵심은 "문자열 비교와 정렬 시, 대소문자를 어떻게 다룰 것인가"입니다.

  • 단순 비교에는 compareTo()
  • 대소문자 무시는 compareToIgnoreCase()
  • 여러 문자열 정렬은 Collections.sort()
  • 진짜 대소문자 무시 정렬은 Comparator.comparing(String::toLowerCase)

이 네 가지를 기억해 두면 문자열을 다룰 때 혼란 없이 원하는 결과를 얻을 수 있습니다.
 
 

반응형
Comments