C++ 프로그래밍에서 문자열을 다룰 때 std::string과 char[](문자 배열) 중 어떤 것을 사용해야 할지 고민해 본 적이 있을 것입니다. 이번 글에서는 두 방식의 차이점을 살펴보고, 각각의 특징과 장단점을 자세히 알아보겠습니다.
char 배열(char[])의 특징
char[]는 기본적으로 문자들이 모인 배열입니다. 이 배열에는 몇 가지 중요한 특성이 있으며, 아래와 같습니다.
- 스택(stack) 영역에 할당된
char[]는 항상 256바이트의 공간을 차지합니다. 실제 저장되는 텍스트의 크기와는 무관합니다. malloc()이나calloc()을 사용해 힙(heap) 영역에 동적으로 메모리를 할당하는 경우, 사용 후 메모리를 직접 해제해야 하는 책임이 개발자에게 있으며, 항상 힙 할당에 따른 오버헤드가 발생합니다.- 문자 배열의 크기가 256자를 초과하면 프로그램이 비정상 종료(크래시)될 수 있으며, 코드에 불쾌한 assertion 오류 메시지가 출력될 수 있습니다.
- 문자열의 길이를 구하려면 매번 널 종료 문자('\0')를 만날 때까지 전체 문자 배열을 처음부터 끝까지 스캔해야 합니다.
C++ std::string 클래스의 특징
반면 C++은 표준 네임스페이스(std)에 string 클래스를 제공합니다. 이 클래스는 내부적으로 문자 배열을 포함하고 있으며, 사용자를 대신해 메모리를 자동으로 관리해 줍니다. 대부분의 경우 내장 버퍼 크기는 16자로 설정되어 있어, 짧은 문자열은 힙 영역을 추가로 사용하지 않고 처리되며(Small String Optimization), 더 긴 문자열의 경우에만 힙 영역을 활용합니다.
std::string의 주요 장점
- 내부적으로 '\0' 종료 문자를 자동으로 처리합니다.
- 매번 계산할 필요 없이 문자열의 길이를 미리 저장하고 있어 즉시 조회할 수 있습니다.
- 짧은 텍스트는 힙을 사용하지 않으므로 버퍼 오버런(buffer overrun)으로부터 상대적으로 안전합니다.
- 무엇보다도 C++에서 문자열을 훨씬 쉽고 편리하게 사용할 수 있습니다.
정리
결론적으로 char[]는 저수준 메모리 제어나 C API와의 호환성이 필요한 경우에 유용하지만, 메모리 관리와 안전성 측면에서 개발자의 부담이 큽니다. 반면 std::string은 자동 메모리 관리, 길이 정보 저장, 버퍼 오버런 방지 등 다양한 이점을 제공하므로, 일반적인 C++ 프로그래밍에서는 std::string 사용이 권장됩니다.