문자열 비교
값을 비교할 때 보통 == 연산자를 이용하여 동일 여부를 알아낸다
하지만 문자열의 경우 == 연산자를 사용하면 원치 않은 결과를 가져올 수도 있다
이는 값은 같을지라도 값이 저장된 메모리 주소가 다르기 때문이다
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() 함수에 비해 과정이 길어진다
하지만 릴리즈 빌드 시 거의 차이가 없이 비슷하다
'Programming Language > C/C++' 카테고리의 다른 글
[C/C++] atan2 함수로 각도 구하기 (극 좌표계) (0) | 2017.05.11 |
---|---|
[C/C++] 포인터와 const (0) | 2017.05.10 |
[C/C++] error C2872, 모호한 기호입니다 (0) | 2017.04.24 |
[C/C++] error C4996: 'strcpy' 'strcat' 오류 해결 (0) | 2017.04.21 |
[C/C++] 숫자를 포함한 문자열 입력 시 오류 해결 (0) | 2017.04.20 |