Programming Language/C/C++

[C/C++] string 문자열 비교 ==? compare? strcmp?

깐요 2017. 4. 30. 14:31

문자열 비교

값을 비교할 때 보통 == 연산자를 이용하여 동일 여부를 알아낸다

하지만 문자열의 경우 == 연산자를 사용하면 원치 않은 결과를 가져올 수도 있다

이는 값은 같을지라도 값이 저장된 메모리 주소가 다르기 때문이다

char 배열을 이용한 문자열의 경우 변수는 주소를 가리키므로 == 연산자를 사용하지 않고 strcmp() 함수를 사용한다

하지만 C++에서는 string 문자열일 경우 == 연산자를 사용할 수 있다

이 이유는 연산자 오버로딩에 있다


strcmp(), compare()

char 배열 형식의 문자열을 비교할 때는 strcmp() 함수를 사용한다

strcmp( string1, string2 )

라고 가정하자

위 값이 0보다 작을 경우 string1이 string2보다 사전적으로 앞에 있다

값이 0일 경우 string1과 string2가 같다

값이 0보다 클 경우 string1이 string2보다 사전적으로 뒤에 있다

string 형식의 문자열을 비교할 때는 compare() 함수를 사용한다

string1.compare(string2)

라고 가정했을 때 strcmp와 같은결과값을 가진다


연산자 오버로딩

연산자 오버로딩이란 객체 지향 컴퓨터 프로그래밍에서 다형성의 특정 경우로 다른 연산자들이 함수 인자를 통해서 구현을 할 때를 말한다

기존의 연산자에 기능을 더 추가한다고 이해하면 편하다

string 문자열을 비교할 때 == 연산자는 아래와 같이 오버로딩이 된다

template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
	const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{
	return __lhs.compare(__rhs) == 0;
}

즉, compare() 함수와 비슷하게 기능한다

이것은 C++에만 해당한다


비교 연산자? compare?

그렇다면 == 연산자와 compare 중에 어떤 것을 사용해야 할까?

사실 둘의 차이는 크지 않다

다만 어셈블리 언어 차원에서 접근해보면 약간의 속도 차이가 있다

디버그 빌드 시 == 연산자가 compare() 함수에 비해 과정이 길어진다

하지만 릴리즈 빌드 시 거의 차이가 없이 비슷하다

320x100