C++ 표준 라이브러리는 스트링을 좀 더 잘 표현하도록 std::string 클래스를 제공한다.
string 클래스는 std 네임스페이스에 속하며 <string> 헤더에 정의돼 있다.
1. string 클래스 사용법
string은 실제로 클래스지만 기본 타입인 것처럼 사용한다.
그래서 코드를 작성할 때 기본 타입처럼 취급하면 된다.
C++ string에 연산자 오버로딩을 적용하면 C 스타일 스트링보다 훨씬 사용하기 편하다.
예를 들어 다음과 같이 + 연산자를 string에 적용하면 스트링 결합 연산을 수행하도록 정의할 수 있다.
string A("12");
string B("34");
string C;
C = A + B; // C는 "1234"다.
마찬가지로 += 연산자가 스트링 뒤에 덧붙이는 연산을 수행하도록 오버로딩할 수 있다.
string A("12");
string B("34");
A += B; // A는 "1234"다.
C 스타일 스트링은 == 연산자로 비교할 수 없다는 단점이 있다.
예를 들어 다음과 같은 두 개의 스트링이 있다고 하자.
char* a = "12";
char b[] = "12";
두 스트링을 비교하는 문장을 다음과 같이 작성하면 스트링의 내용이 아닌 포인터값을 비교하기 때문에
항상 false가 리턴된다.
if (a == b) // false 리턴
C 언어에서 스트링을 비교하려면 다음과 같이 작성한다.
if (strcmp(a, b) == 0)
또한 C 스트링은 <, <=, >=, >로 비교할 수 없기 때문에 주어진 스트링을 사전식 나열 순서에 따라 비교해서
-1, 0 또는 1을 리턴하는 strcmp()를 사용했다.
C++에서 제공하는 string에서는 ==, !=, <와 같은 연산자를 오버로딩해서 스트링에 적용할 수 있다.
string myString = "hello";
myString += ", there";
string myOtherString = myString;
if (myString == myOtherString) {
myOtherString[0] = 'H';
}
cout << myString << endl;
cout << myOtherString << endl;
결과
위 예제에서는 몇가지 특징이 있다.
1. 스트링을 할당하거나 크기를 조절하는 코드가 여러 군데 흩어져 있어도 메모리 누수가 발생하지 않는다.
string 객체는 모두 스택 변수로 생성되기 때문이다.
2. 연산자를 원하는 방식으로 작동하게 할 수 있다.
예를 들어 = 연산자를 스트링을 복사하거나 + 연산자로 스트링을 연결할 수 있다.
2. std::string 리터럴
소스 코드에 나온 스트링 리터럴은 주로 const char*로 처리한다.
표준 사용자 정의 리터럴 's'를 사용하면 스트링 리터럴을 std::string으로 만들 수 있다.
auto string1 = "Hello World"; // string1의 타입은 const char*이다.
auto string2 = "Hello World"s; // string2의 타입은 std::string이다.
표준 사용자 정의 리터럴 's' 를 사용하려면 using namespace std::string_literals; 또는
using namesapce std;를 추가한다.
'💻프로그래밍 내용 정리 > C++17' 카테고리의 다른 글
[C++ 2.1.4] std::string_view 클래스 (1) | 2022.08.20 |
---|---|
[C++ 2.1.3-2] 하이레벨 숫자 변환(to_string, stoi), 로우레벨 숫자 변환(to_chars, from_chars) (0) | 2022.08.20 |
[C++ 2.1.2] 스트링 리터럴(리터럴 폴링, 로 스트링 리터럴, 확장 로스트링 리터럴) (0) | 2022.08.19 |
[C++ 2.1.1] 동적 스트링(C 스타일 스트링), strlen, strcpy, strcat (0) | 2022.08.19 |
[C++ 1.6.4] 사용자 인터페이스 (0) | 2022.08.19 |