C++에서는 두 개의 문자열을 비교할 때 == 연산자와 compare() 함수, 두 가지 방법을 사용할 수 있습니다. 그렇다면 왜 같은 기능을 하는 방법이 두 가지나 존재하는 걸까요? 아니면 실제로 차이가 있는 것일까요?
결론부터 말하자면, 두 방법 사이에는 중요한 차이점이 존재합니다. 각각의 동작 방식과 반환값을 자세히 살펴보겠습니다.
== 연산자의 동작 방식
C++에서 == 연산자는 string 클래스에 대해 연산자 오버로딩되어 있어, 두 문자열이 서로 같은지 여부만을 판단합니다.
- 두 문자열이 같으면 →
true(1)반환 - 두 문자열이 다르면 →
false(0)반환
즉, == 연산자는 불리언(Boolean) 타입처럼 동작하며 단순히 '같다/다르다'라는 이진 판단만 수행합니다.
compare() 함수의 동작 방식
반면 compare() 함수는 좀 더 상세한 정보를 제공합니다. 두 문자열을 사전순(lexicographical order)으로 비교하며, 각 문자를 아스키(ASCII) 코드 값을 기준으로 대조합니다.
- 두 문자열이 완전히 같으면 →
0반환 - 호출한 문자열(
s)이 인자로 전달된 문자열(t)보다 사전순으로 앞서면 → 음수 값 반환 - 호출한 문자열(
s)이 인자로 전달된 문자열(t)보다 사전순으로 뒤에 있으면 → 양수 값 반환
참고로 표준에 따르면 반환값은 반드시 -1 또는 +1일 필요는 없으며, '0보다 작은 값' 또는 '0보다 큰 값'이라는 점만 보장됩니다. 따라서 실제 코드에서는 반환값을 직접 숫자와 비교하기보다는 부등호(<, >)를 사용해 판단하는 것이 안전합니다.
예제 코드
#include <iostream>
using namespace std;
int main() {
string str1 = "Hello";
string str2 = "Help";
string str3 = "Hello";
cout << "== 연산자로 str1과 str2 비교, 결과: " << (str1 == str2) << endl; // 다름 → 0
cout << "== 연산자로 str1과 str3 비교, 결과: " << (str1 == str3) << endl; // 같음 → 1
cout << "compare()로 str1과 str2 비교, 결과: " << str1.compare(str2) << endl; // 크기 관계 확인
cout << "compare()로 str1과 str3 비교, 결과: " << str1.compare(str3) << endl; // 같음 → 0
}실행 결과
== 연산자로 str1과 str2 비교, 결과: 0 == 연산자로 str1과 str3 비교, 결과: 1 compare()로 str1과 str2 비교, 결과: -1 compare()로 str1과 str3 비교, 결과: 0
예제 분석
"Hello"와 "Help"를 비교해 보겠습니다. 앞의 세 글자 'H', 'e', 'l'은 동일하지만, 네 번째 문자에서 'l'(아스키 코드 108)과 'p'(아스키 코드 112)가 일치하지 않습니다. 'l'이 'p'보다 작으므로 str1.compare(str2)는 음수인 -1을 반환합니다.
반면 == 연산자는 두 문자열이 다르다는 사실만 판단하므로 0(false)을 반환합니다.
정리: 어떤 것을 사용해야 할까?
| 구분 | == 연산자 | compare() 함수 |
|---|---|---|
| 반환 정보 | 같음/다름 여부만 판단 | 크기 관계까지 상세히 제공 |
| 반환값 | true(1) / false(0) | 음수 / 0 / 양수 |
| 적합한 용도 | 동등성 검사 | 정렬, 사전순 비교 등 순서 판단 |
두 문자열이 같은지만 확인하고 싶다면 가독성이 좋은 == 연산자를 사용하는 것이 적절하고, 문자열 간의 대소 관계가 필요한 경우(예: 정렬 알고리즘 구현)에는 compare() 함수를 사용하는 것이 바람직합니다.