C++

[C++] string_view와 C 스타일 문자열 비교

코딩 메모장 2025. 4. 20. 21:17
728x90

[C++] string_view와 C 스타일 문자열 비교

C++에서는 문자열을 다루는 방식이 다양합니다. 그중에서 아래 두 코드처럼 "Hello"라는 문자열을 다르게 표현할 수 있습니다.

char const msg[] = "Hello";
std::string_view msg2 = "Hello"sv;

두 표현 모두 "Hello"라는 같은 문자열 데이터를 가지고 있지만, 데이터 타입메모리 관리 방식에서 중요한 차이가 있습니다.

1. msg — C 스타일 문자열

char const msg[] = "Hello";
  • 타입: const char[6] (문자 배열)
  • 내용: "Hello"는 5글자지만, 문자열 끝을 알리기 위해 \0(널 문자)이 포함되어 총 6바이트입니다.
  • 메모리: 문자열 리터럴은 정적 메모리에 저장되고, msg는 이를 담은 배열입니다.
  • 특징: 컴파일 타임에 크기를 알 수 있으며, C 스타일 문자열로 효율적이지만 안전성은 개발자가 직접 관리해야 합니다.

2. msg2 — C++ 스타일 std::string_view

std::string_view msg2 = "Hello"sv;
  • 타입: std::string_view
  • 내용: msg2는 문자열 데이터를 복사하지 않고 참조합니다.
  • 메모리: 문자열 자체는 정적 메모리에 있으며, string_view는 이를 포인터와 길이 정보로 참조합니다.
  • 특징: 복사 없이 빠르게 문자열을 다룰 수 있으며, 소유권이 없기 때문에 원본 문자열의 생존 기간을 신경 써야 합니다.

💡 "Hello"sv에서 svstd::string_view 리터럴 접미사입니다.
이를 사용하려면 <string_view> 헤더와 함께 다음 네임스페이스를 사용해야 합니다:
using namespace std::literals; 또는 std::literals::string_view_literals

주요 차이점 요약

항목 msg (C 스타일) msg2 (std::string_view)
타입 const char[6] std::string_view
데이터 소유 문자열을 직접 저장 문자열을 참조만 함
메모리 구조 정적 메모리의 배열 포인터 + 길이
복사 여부 배열에 복사됨 복사 없음 (뷰 객체)
크기 정보 컴파일 타임에 알 수 있음 객체 내부에 저장됨
장점 단순하고 빠름 유연하고 안전하게 문자열 처리 가능
주의할 점 경계 체크 없음 dangling 참조 발생 가능

📌 string_view 사용 시 주의할 점

std::string_view는 문자열을 복사하지 않아 빠르고 편리하지만, 원본 문자열이 사라지면 참조가 무효(dangling) 되어 예기치 않은 동작이 발생할 수 있습니다.

std::string_view bad_view;
{
    std::string temp = "Hello";
    bad_view = temp; // temp는 블록을 벗어나면서 소멸됨
}
std::cout << bad_view; // 정의되지 않은 동작!

✅ 따라서 string_view는 임시 문자열이나 지역 변수 문자열을 참조할 때 주의가 필요합니다.

✅ 정리

  • msg는 C 스타일 문자열로, 고정된 크기의 배열을 사용해 직접 데이터를 담습니다.
  • msg2는 C++17 이후 도입된 std::string_view를 이용한 문자열 참조 방식입니다.
  • 각 방식은 목적과 상황에 따라 선택해서 사용하는 것이 좋습니다.
728x90