이번 포스팅은 Java에서 문자열을 비교하는 방법을 소개합니다.
== 연산자
== 연산자는 int, float, double와 같은 기본 타입을 비교하기 위해 사용하는 연산자입니다. 다음은 == 연산자를 사용하여 String 객체를 비교합니다.
String str1 = "Java";
String str2 = "Java";
String str3 = "Programming";
System.out.println(str1 == str2);
System.out.println(str2 == str3);
실행 결과
true
false
다음은 new 키워드를 사용하여 생성된 String 객체를 비교합니다.
String str1 = "Java";
String str2 = new String("Java");
System.out.println(str1 == str2);
실행 결과
false
두 문자열은 동일한 값으로 보이지만 == 연산자의 결과는 false입니다. 문자열 값으로 비교하지 않고 객체의 주소 값을 비교하기 때문입니다.
String str1 = "Java";
String str2 = "Java";
str1과 str2이 참조하는 메모리 공간(객체의 주소 값)은 동일합니다. 이미 String str1 = "Java"에서 문자열 "Java"의 메모리 공간이 할당되었기 때문에 새로운 메모리 공간이 할당되지 않습니다.
String str1 = "Java";
String str2 = new String("Java");
하지만 new 키워드로 객체를 생성하면 동일한 문자열 값이라도 JVM은 새로운 공간(주소)을 할당합니다. 문자열 값은 동일하지만 주소가 다르므로 == 연산자는 false를 반환합니다.
String 클래스
다음은 String 클래스의 메서드입니다. String 클래스의 메서드는 주소 값이 아닌 문자열 값을 비교하므로 == 연산자보다 비교 결과가 정확합니다.
equals() 메서드
equals() 메서드는 문자열이 동일한지 비교할 때 사용합니다. 대소문자를 구분하며 동일한 문자열이면 true, 그렇지 않으면 false가 반환됩니다.
String str1 = "Java";
String str2 = new String("Java");
System.out.println(str1.equals(str2));
실행 결과
true
다음 예제처럼 equals() 메서드를 호출하는 문자열이 null인 경우 NullPointerException 예외가 발생합니다.
String str1 = null;
String str2 = new String("Java");
System.out.println(str1.equals(str2));
equalsIgnoreCase() 메서드
equlas() 메서드는 대소문자를 구분하므로 문자열 Java와 java를 비교하면 false가 반환됩니다. 대소문자가 구분 없이 문자열을 비교하고 싶은 경우 equalsIgnoreCase() 메서드를 호출합니다.
String str1 = "Java";
String str2 = new String("java");
System.out.println(str1.equals(str2));
실행 결과
true
compareTo() 메서드
compareTo() 메서드도 문자열을 비교하기 위해 사용되지만 equals() 메서드와 다른 방식으로 동작합니다. compareTo() 메서드는 문자열을 사전 순서로 값을 비교합니다.
str1이 사전 순으로 str2보다 앞서면 음수를 반환하고 사전 순으로 뒤에 있으면 양수가 반환됩니다. 동일하면 0이 반환됩니다.
String str1 = "Java";
String str2 = new String("Java");
String str3 = "java";
System.out.println(str1.compareTo(str2));
System.out.println(str2.compareTo(str3));
실행 결과
0
-32
대문자 J와 소문자 j의 유니코드 값의 차이가 -32이므로 문자열 변수 str2와 str3의 비교 결과는 -32입니다.
compareToIgnoreCase() 메서드
문자열을 사전순으로 비교하지만 대소문자를 구분하지 않는 경우 compareToIgnoreCase() 메서드를 호출합니다.
String str1 = "java";
String str2 = new String("JAVA");
String str3 = "JaVa";
System.out.println(str1.compareTo(str2));
System.out.println(str2.compareTo(str3));
실행 결과
0
0
contentEquals() 메서드
contentEquals() 메서드는 equals() 메서드에 비해 사용되지 않는 메서드입니다. contentEquals() 메서드는 CharSequences와 StringBuffers를 비교합니다.
contentEquals() 메서드는 StringBuffer와 String을 비교하는 경우 사용됩니다.
String str1 = "Java";
StringBuffer str2 = new StringBuffer("");
str2.append("J");
str2.append("a");
str2.append("v");
str2.append("a");
System.out.println(str1.contentEquals(str2));
실행 결과
true
StringUtils 클래스
Apache Commons 라이브러리는 다양한 클래스와 메서드를 제공하는 라이브러리입니다. StringUtils 클래스는 문자열 비교를 포함하여 문자열과 관련된 다양한 기능을 제공합니다.
equals() 메서드
StringUtils.equals() 메서드는 Object.equals() 메서드와 동일한 방식으로 작동합니다. 또한 null-safety 및 null 확인 기능이 있습니다.
String str1 = "Java";
String str2 = new String("Java");
System.out.println(StringUtils.equals(str1, str2));
System.out.println(StringUtils.equals(str1, null));
System.out.println(StringUtils.equals(null, null));
실행 결과
true
false
true
equalsIgnoreCase() 메서드
StringUtils.equalsIgnoreCase() 메서드는 String의 equalsIgnoreCase() 메서드와 동일한 방식으로 작동합니다.
String str1 = "Java";
String str2 = new String("JaVa");
System.out.println(StringUtils.equals(str1, str2));
System.out.println(StringUtils.equals(str1, null));
System.out.println(StringUtils.equals(null, null));
실행 결과
true
false
true
compare() 메서드
StringUtils.compare() 메서드는 String의 compare() 메서드와 동일한 방식으로 작동합니다. 또한 null-safety 및 null 확인 기능이 있습니다.
String str1 = "java";
String str2 = new String("JAVA");
String str3 = "JaVa";
System.out.println(StringUtils.compare(str1, str2));
System.out.println(StringUtils.compare(str2, str3));
실행 결과
0
-32
compareIgnoreCase() 메서드
StringUtils.compare() 메서드에서 대소문자를 구분하지 않는 경우 StringUtils.compareIgnoreCase() 메서드를 사용합니다.
String str1 = "java";
String str2 = new String("JAVA");
String str3 = "JaVa";
System.out.println(StringUtils.compareIgnoreCase(str1, str2));
System.out.println(StringUtils.compareIgnoreCase(str2, str3));
실행 결과
0
0
'Java > 문자열' 카테고리의 다른 글
[Java]문자열을 정수로 변환(String to Int) (0) | 2022.04.09 |
---|---|
[Java]문자열을 날짜로 변환하는 방법 (0) | 2022.04.09 |
[Java]문자열에서 특정 문자열이 포함되어 있는지 확인 (0) | 2022.04.08 |
[Java]특정 문자열로 시작하는지 확인하는 방법 (0) | 2022.04.08 |
[Java]문자열(String) null 체크 (0) | 2022.04.06 |
댓글