Java에서 문자열(String)을 비교하는 방법은 여러 가지가 있습니다. 각 방법마다 동작 방식과 용도가 다르기 때문에 상황에 맞는 메서드를 선택하는 것이 중요합니다.
1. compareTo() 메서드 사용
compareTo() 메서드는 두 문자열을 사전순(lexicographically)으로 비교합니다. 비교 기준은 문자열 내 각 문자의 유니코드(Unicode) 값이며, 현재 String 객체가 나타내는 문자 시퀀스와 인수로 전달된 문자열의 문자 시퀀스를 순서대로 비교합니다.
예제
import java.util.Scanner;
public class StringComparison {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter string1: ");
String str1 = sc.next();
System.out.println("Enter string2: ");
String str2 = sc.next();
int result = str1.compareTo(str2);
if (result < 0) {
System.out.println("str1 is not equal to str2");
} else if (result == 0) {
System.out.println("str1 is equal to str2");
} else {
System.out.println("str1 is not equal to str2");
}
}
}실행 결과 1
Enter string1: Hello Enter string2: Hello str1 is equal to str2
실행 결과 2
Enter string1: hello Enter string2: hi str1 is not equal to str2
2. == 연산자 사용
== 연산자로도 두 문자열을 비교할 수 있습니다. 하지만 주의할 점은, == 연산자는 문자열의 값이 아니라 참조(reference)를 비교한다는 것입니다. 즉, 두 변수가 동일한 객체를 가리키는지 여부만 판단하므로, 실제 문자열 내용 비교에는 적합하지 않습니다.
예제
import java.util.Scanner;
public class StringComparison {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str1 = "hello";
String str2 = "hello";
if (str1 == str2 ){
System.out.println("Both are equal");
} else {
System.out.println("Both are not equal");
}
}
}실행 결과
Both are equal
위 예제에서 "Both are equal"이 출력되는 이유는 Java의 문자열 리터럴 풀(string pool) 덕분에 동일한 리터럴은 같은 객체를 공유하기 때문입니다. 그러나 new 키워드로 생성한 문자열 객체끼리는 == 연산자로 비교하면 false가 반환될 수 있으므로 항상 주의해야 합니다.
3. equals() 메서드 사용
String 클래스의 equals() 메서드는 문자열을 매개변수로 받아 현재 문자열과 비교합니다. 대소문자까지 포함하여 문자 시퀀스가 완전히 동일한 경우에만 true를 반환합니다.
예제
import java.util.Scanner;
public class StringComparison {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter string1: ");
String str1 = sc.next();
System.out.println("Enter string2: ");
String str2 = sc.next();
boolean bool = str1.equals(str2);
if (bool) {
System.out.println("Both are equal");
} else {
System.out.println("Both are not equal");
}
}
}실행 결과 1
Enter string1: Hello Enter string2: hello Both are not equal
실행 결과 2
Enter string1: Hello Enter string2: Hello Both are equal
대소문자를 구분하지 않는 문자열 비교
대소문자 차이를 무시하고 문자열을 비교하고 싶다면 String 클래스의 equalsIgnoreCase() 메서드를 사용하면 됩니다. 이 메서드는 equals() 메서드와 유사하지만, 비교 시 대소문자를 구분하지 않는다는 점이 다릅니다.
예제
import java.util.Scanner;
public class StringComparison {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter string1: ");
String str1 = sc.next();
System.out.println("Enter string2: ");
String str2 = sc.next();
boolean bool = str1.equalsIgnoreCase(str2);
if (bool) {
System.out.println("Both are equal");
} else {
System.out.println("Both are not equal");
}
}
}실행 결과
Enter string1: Hello Enter string2: hello Both are equal
정리
- compareTo(): 두 문자열을 사전순으로 비교하며, 정렬 등에 활용됩니다.
- == 연산자: 값이 아닌 참조(객체 주소)를 비교하므로 문자열 내용 비교에는 부적합합니다.
- equals(): 대소문자를 포함한 문자열 내용을 정확히 비교합니다.
- equalsIgnoreCase(): 대소문자를 무시하고 문자열 내용을 비교합니다.
사용자 입력 검증, ID·이메일 비교 등 대소문자 차이를 허용해야 하는 경우에는 equalsIgnoreCase()를 사용하는 것이 가장 안전하고 간편한 방법입니다.