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
에서sv
는std::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
'C++' 카테고리의 다른 글
[C++] 가상 함수 (virtual function) (0) | 2025.04.23 |
---|---|
[C++] static_cast 란? (0) | 2025.04.22 |
[C++] type-specifier-seq / 타입 지정자 시퀀스란? (0) | 2025.04.19 |
[C++]init-statementopt condition의 개념과 활용 (0) | 2025.02.03 |
[C++] const static data member (1) | 2024.11.27 |