본문 바로가기

Coding/개인적으로 헷갈렸던 부분

C-스트링과 string 클래스의 차이

우리는 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?"}

와 같은 느낌으로 생각하면 편할 것 같다.

 

문자 배열과 문자열의 메모리 사용 방식에도 차이점이 있는 것 같은데,

이 부분은 나중에 다루어 보도록 하겠다.