우리는 C언어를 배울 때 문자열을 배웠다.
char str1[20] = "Hello world!";
C언어에서는 '\0'으로 끝나는 문자 배열을 문자열로 취급하는 방법을 이용해 왔었고,
이는 C-스트링이라고 부른다.
그런데 우리는 C++을 배우면서 문자열을 다루는 방법에 C-스트링이 아닌 다른 방법이 있다는 것을 배우게 되었다.
우리는 그것을 string 클래스라고 부른다.
우선, string 클래스를 사용하기 위해서는 다음 코드가 필요하다.
#include <string>
using namespace std;
다음의 예시를 확인하도록 하자.
char str1[20] = "Hello World!";
string str2 = "Hello World!";
cout << "str1의 길이 : " << strlen(str1) << endl;
cout << "str2의 길이 : " << str2.size() << endl;
cout << endl;
이 코드의 실행 결과는 다음과 같다.
str1의 길이 : 12
str2의 길이 : 12
여기에서, 우리는 C-스트링 방식과 string 클래스 방식에 크게 차이점이 없다고 생각을 할 수 있다.
하지만, C-스트링 방식은 초기에 할당받은 메모리 크기 이상의 문자열을 저장할 수 없다.
다음의 예시를 확인하도록 하자.
char str3[10] = "I love you";
string str4 = "I love you";
cout << "str3의 길이 : " << strlen(str3) << endl;
cout << "str4의 길이 : " << str4.size() << endl;
이 코드를 Visual Studio에 작성을 해보면,
C-스트링 방식으로 선언된 str3의 "I love you"에 빨간 밑줄이 생기며
컴파일 에러가 발생하는 것을 확인할 수 있다.
이 때 우리는, 다음과 같은 에러 메시지를 확인할 수 있다.
"const char [11]" 형식의 값을 사용하여 char [10] 형식의 엔터티를 초기화할 수 없습니다.
왜 그럴까?
혹시 문자 배열의 크기에서 문제가 발생하지 않았나라는 생각을 할 수 있을 것이다.
그렇다면 문자 배열의 크기를 한 개 늘려보도록 하자.
char str3[11] = "I love you";
string str4 = "I love you";
cout << "str3의 길이 : " << strlen(str3) << endl;
cout << "str4의 길이 : " << str4.size() << endl;
이제 이 코드를 실행해보도록 하자.
str3의 길이 : 10
str4의 길이 : 10
분명히 str3의 길이와 str4의 길이는 동일하다.
그런데 왜 str3 문자 배열의 크기를 10으로 하면 오류가 발생하는 것일까?
그 이유는 바로 C-스트링 방식에서 문자열을 선언과 동시에 초기화 하는 경우
문자열의 맨 마지막을 의미하는 널문자를 자동으로 넣어주기 때문이다.
반면에, string 클래스 방식을 사용하는 경우에는
문자열의 크기에 맞추어 스스로 메모리 크기를 조절하기 때문에 사용하기 매우 편리하다.
그렇다면 C-스트링 방식에서 사용하는 문자 배열과 string 클래스 방식에서 사용하는
문자열의 차이는 무엇일까?
간단하게 정리하면 위에서 말했다시피 C-스트링 방식의 문자 배열은 문자 배열의 길이가
고정되어 있고, string 클래스 방식의 문자열은 문자열의 크기에 맞추어 유동적으로 변하는 것이
가장 큰 차이점이라고 보면 될 거 같다.
추가적으로, 문자 배열과 문자열 배열의 차이를 가볍게만 살펴 보면,
문자 배열은 마치
char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'}
와 같은 느낌이고,
문자열 배열은 마치
string str[5] = {"Hello world!", "Nice to meet you!", "How are you?"}
와 같은 느낌으로 생각하면 편할 것 같다.
문자 배열과 문자열의 메모리 사용 방식에도 차이점이 있는 것 같은데,
이 부분은 나중에 다루어 보도록 하겠다.