C++에서 문자열을 비교하는 방법은 크게 두 가지가 있습니다. 바로 관계 연산자(==)와 std::string::compare() 함수입니다. 흥미롭게도 이 둘 사이에는 단 하나의 차이점만 있는데, 그것은 바로 반환 값입니다. 내부적으로 string::operator==()는 string::compare()를 이용해 구현되어 있기 때문입니다.
관계 연산자(==)는 두 문자열이 같은지 여부만 알려주는 불리언(bool) 값을 반환합니다. 반면 compare()는 두 문자열이 서로 어떤 관계에 있는지를 나타내는 정수(int)를 반환합니다.
compare()의 반환 값은 다음과 같이 해석할 수 있습니다.
- 0 : 두 문자열이 완전히 동일함
- 음수 : 첫 번째 문자열이 두 번째 문자열보다 사전순으로 앞에 위치함
- 양수 : 첫 번째 문자열이 두 번째 문자열보다 사전순으로 뒤에 위치함
사용 사례를 살펴보면, 두 문자열이 서로 다를 때 어느 쪽이 앞서는지(더 작은지 혹은 더 큰지)까지 알아야 한다면 compare()가 유용합니다. 예를 들어 정렬 알고리즘을 직접 구현하거나 사전식 순서를 비교해야 하는 상황에서 특히 유용하게 활용됩니다.
예제 코드
#include <iostream>
using namespace std;
int main() {
string s1 = "Tutorials Point";
string s2 = "Hello World";
cout << (s1 == s2) << endl; // 0 (false) : 두 문자열이 다름
cout << s1.compare(s2) << endl; // 양수 : 'T'가 'H'보다 큼
cout << s2.compare(s1) << endl; // 음수 : 'H'가 'T'보다 작음
return 0;
}
실행 결과
0 12 -12
위 예제에서 s1 == s2는 두 문자열이 서로 다르므로 0(false)을 출력합니다. s1.compare(s2)는 가장 먼저 일치하지 않는 문자인 'T'와 'H'를 비교하여 'T'가 더 크기 때문에 양수를 반환하고, s2.compare(s1)은 그 반대이므로 음수를 반환합니다.
참고로 반환되는 정수의 절댓값은 C++ 표준에서 엄격하게 규정하지 않기 때문에 컴파일러 구현에 따라 달라질 수 있습니다. 따라서 실제 코드에서는 반환 값 자체보다는 부호(양수·음수·0)를 기준으로 판단하는 것이 안전합니다.