Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 문자열 비교 방법: == 연산자와 compare() 함수의 차이점

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() 함수를 사용하는 것이 바람직합니다.