본문 바로가기

Information Technology/C++

[C++] std::string의 길이와 용량

이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요 ;)


이번 포스팅에서는 std::string의 길이와 용량에 대해 다뤄보겠습니다.

#include <iostream>
#include <string>
using namespace std;

int main()
{
	string my_str("012345678");
	cout << my_str.size() << endl; // 9 출력

	return 0;
}

여기 코드 블록에서 my_str이라는 이름으로 std::string 자료형의 인스턴스를 "012345678"의 값으로 초기화했습니다.

그리고 my_str.size()를 통해 my_str의 크기를 출력해보았습니다.

C 스타일의 문자열이라면 배열의 끝에 null 문자가 포함되기 때문에 "012345678"의 문자열의 크기는 9+1로 10이 출력되어야 합니다.

하지만 string 자료형은 클래스 내부적으로 null문자를 제외한 문자열 자체만의 길이를 멤버를 가지고 있기 때문에 문자열 길이 그대로 9가 출력됩니다.


string my_str("012345678");
cout << std::boolalpha;			// 출력 결과를 true, false 중 하나로 보여줌
cout << my_str.empty() << endl;		// 해당 문자열이 비었는지 확인하는 기능

이번에는 empty() 기능을 사용해봤습니다. empty는 말 그대로 문자열이 저장된 인스턴스가 비었는지 확인하는 기능입니다. 비어있으면 true를, 비어있지 않으면 false를 출력합니다. 이 예제에서는 std::boolalpha를 통해 참/거짓이 0/1이 아니라 ture/false로 출력되게 설정했습니다.

my_str에는 현재 '12345678'이 저장되어있기 때문에 false가 출력됩니다.

string my_str("");		// "" 자체는 크기 1의 배열
cout << std::boolalpha; 
cout << my_str.empty() << endl; // std::string은 null문자를 취급?하지 않기 때문에 비어있다고 출력

이번에는 my_str에 아무런 문자열도 없는 빈 값인 ""로 초기화했습니다. ""자체는 속에 null문자가 있기 때문에 1의 크기를 가지고 있지만, std::string은 위에서도 봤듯이 null문자를 문자로 취급하지 않기 때문에 my_str.empty()의 결과는 true로 출력됩니다.


string my_str("01234567");
cout << my_str.size() << endl;		// 8 출력
cout << my_str.length() << endl;	// 8 출력
cout << my_str.capacity() << endl;	// 15출력

이번에는 length()와 capacity()라는 기능도 사용해보겠습니다.

우선 length는 배열의 길이를 출력해줍니다. size에서 본 것처럼 std::string은 null 문자를 문자로 다루지 않기 때문에 my_str.length() 역시 my_str.size()와 같이 글자 수 그대로 8을 출력합니다.

capacity()는 배열의 전체 용량을 알려줍니다. 그런데 우리는 my_str에 분명 8개의 문자열을 저장했는데, my_str.capacity()의 결과는 15라고 출력됩니다. 이게 어떻게 된 일일까요? 이는 std::string이 추후에 my_str에 새로운 문자열이 추가되거나 변경되었을 때 my_str 배열의 크기를 다시 할당하지 않기 위해 일부러 여분 공간을 남겨뒀기 때문입니다.

my_str.reserve(1000); 

그렇기 때문에 std::string에 저장할 문자열의 길이를 정확히 알고 있는 경우에는,

위의 코드처럼 reserve()를 사용해서 필요한 만큼의 크기를 미리 할당받으면 됩니다.