자바에서 문자열 비교하기
자바에서 문자열을 비교하는 방법에는 여러 가지가 있습니다. 이번 글에서는 가장 기본적인 방법인 == 연산자와 equals() 메소드, 그리고 사전 순서를 기준으로 비교하는 compareTo() 메소드와 compareToIgnoreCase() 메소드에 대해 알아보겠습니다.
== 연산자로 문자열 비교하기
== 연산자는 두 객체의 주소값이 같은지를 비교합니다. 따라서 문자열의 내용이 같더라도 서로 다른 객체를 생성한 경우에는 false를 리턴합니다. 예를 들어,
String a = "가나다";
String b = "가나다";
String c = new String("가나다");
System.out.println(a == b); // true
System.out.println(a == c); // false
‼️ 중요포인트! ✨
위 코드에서 a와 b는 문자열 리터럴로 생성되었기 때문에 동일한 객체를 참조하므로 true를 출력합니다. 자바에서 문자열은 기본자료형이(primitive type) 아니기 때문에 문자열을 비교할 때 "==" 연산자를 사용하면 안됩니다. 하지만 위에서 true를 리턴하는 이유는 아까 설명한 것처럼 Java는 메모리와 속도를 높이기 위해서 문자열 리터럴(" - string literal)로 문자열을 생성할 때 Java는 이미 생성된 문자열이 있는지 확인 후, 새로운 객체를 생성하지 않고 기존의 이미 생성된 객체의 주소를 참조합니다. 그래서 문자열 리터럴로 생성했을 경우 같은 내용이었을 때 동일한 객체의 주소를 참조하기에 true를 출력합니다. 하지만 c는 new String()으로 생성되었기 때문에 새로운 객체를 참조하므로 false를 출력합니다.
equals() 메소드로 문자열 비교하기
equals() 메소드는 두 객체의 내용이 같은지를 비교합니다. 따라서 문자열의 내용이 같으면 true를 리턴하고, 다르면 false를 리턴합니다. 예를 들어,
String a = "가나다";
String b = "가나다";
String c = new String("가나다");
System.out.println(a.equals(b)); // true
System.out.println(a.equals(c)); // true
위 코드에서 a와 b, a와 c 모두 문자열의 내용이 같으므로 true를 출력합니다. equals() 메소드는 대소문자도 구분하여 비교합니다. 대소문자 구분 없이 비교하려면 equalsIgnoreCase() 메소드를 사용할 수 있습니다.
compareTo() 메소드로 문자열 비교하기
compareTo() 메소드는 두 문자열을 사전 순서(lexicographical order)로 비교하여 정수 값을 리턴합니다. 사전 순서란 알파벳 순서 혹은 유니코드 값 순서와 같은 기준으로 두 문자열의 우선 순위를 결정하는 방식입니다. compareTo() 메소드의 리턴 값은 다음과 같습니다.
- 두 문자열이 사전 순으로 같으면 0을 리턴합니다.
- 호출한 문자열(this)이 매개변수로 받은 문자열(anotherString)보다 사전 순으로 앞선 경우 음수를 리턴합니다.
- 호출한 문자열(this)이 매개변수로 받은 문자열(anotherString)보다 사전 순으로 뒤질 경우 양수를 리턴합니다. 예를 들어,
String a = "apple";
String b = "banana";
String c = "apple";
System.out.println(a.compareTo(b)); // -1
System.out.println(b.compareTo(a)); // 1
System.out.println(a.compareTo(c)); // 0
위 코드에서 a와 b는 알파벳 순서대로 apple이 banana보다 앞섭니다. 따라서 a.compareTo(b)는 음수(-1), b.compareTo(a)는 양수(1)을 리턴합니다. a와 c는 동일한 문자열입니다. 따라서 a.compareTo(c)는 0을 리턴합니다. 이것을 가지고 각 케이스에 맞는 것들을 할 수 있습니다.
compareToIgnoreCase() 메소드로 문자열 비교하기
compareToIgnoreCase() 메소드는 compareTo() 메소드와 같은 방식으로 문자열을 사전 순서로 비교하지만 대소문자를 구분하지 않습니다. 예를 들어,
String a = "Java";
String b = "java";
String c = "JAVA";
System.out.println(a.compareTo(b)); // -32
System.out.println(a.compareTo(c)); // -32
System.out.println(a.compareToIgnoreCase(b)); // 0
System.out.println(a.compareToIgnoreCase(c)); // 0
위 코드에서 a와 b, a와 c는 대소문자가 다르므로 compareTo() 메소드는 음수(-32)를 리턴합니다. 하지만 compareToIgnoreCase() 메소드는 대소문자를 무시하고 비교하므로 0을 리턴합니다.
마치며
이렇게 자바에서 문자열을 비교하는 방법에는 == 연산자와 equals(), equalsIgnoreCase(), compareTo(), compareToIgnoreCase() 메소드가 있습니다. == 연산자는 객체의 주소값을 비교하므로 문자열의 내용이 같더라도 false를 리턴할 수 있습니다. 따라서 문자열의 내용을 비교하려면 equals() 메소드나 compareTo() 메소드를 사용해야 합니다. 또한 대소문자 구분 없이 비교하려면 equalsIgnoreCase() 메소드나 compareToIgnoreCase() 메소드를 사용할 수 있습니다. 여러분도 자바에서 문자열을 비교하는 방법에 익숙해지고 활용해보세요. 혹시 궁금한 점이나 의견이 있으시다면 댓글로 남겨주세요.
'개발일지' 카테고리의 다른 글
미 국방부가 왜 TCP/IP가 극심한 전시 상황에서도 신뢰성을 유지할 수 있다고 판단한 이유 (0) | 2023.03.24 |
---|---|
[TIL] 자료구조와 알고리즘 재귀에 대하여 feat.Java (0) | 2023.03.21 |
[TIL] Generic, List, Set, Map 에 대하여 (0) | 2023.03.15 |
[KPT] Section 1을 마치며 하는 회고 feat. 코드스테이츠 백엔드 (0) | 2023.03.13 |
[TIL] Java 객체지향프로그래밍 - 생성자와 생성자 오버로딩 (0) | 2023.03.01 |