std::string과 std::string_view: 문자열을 안전하게 다루는 기준
12강. std::string과 std::string_view: 문자열을 안전하게 다루는 기준
이번 강의에서 해결할 문제
읽기만 하는 함수가 매번 문자열을 복사하면 불필요한 할당이 생깁니다. 그렇다고 항상 문자 포인터를 받으면 길이와 수명 계약이 모호합니다. string_view는 복사 없이 문자열을 보지만 원본을 소유하지 않아 수명을 잘못 다루면 댕글링 뷰가 됩니다.
학습 목표
string의 소유와string_view의 비소유 관찰을 구분합니다.- 읽기 전용 함수 인자에
string_view를 사용합니다. - 뷰가 원본보다 오래 살아서는 안 되는 이유를 설명합니다.
먼저 알아야 할 핵심 개념
std::string은 문자 저장 공간을 소유하고 복사·이동·수정을 관리합니다. std::string_view는 문자 시작 위치와 길이만 가진 가벼운 뷰입니다. 문자열 리터럴과 string을 모두 복사 없이 받을 수 있지만 원본 문자가 파괴되거나 재할당되면 뷰는 유효하지 않습니다.
가장 작은 실행 가능한 예제
#include <iostream>
#include <string>
#include <string_view>
bool startsWith(const std::string_view text, const std::string_view prefix) {
return text.size() >= prefix.size()
&& text.substr(0, prefix.size()) == prefix;
}
int main() {
const std::string playerName{"Knight_Mina"};
std::cout << std::boolalpha
<< startsWith(playerName, "Knight_") << '\n';
}
핵심 코드 줄별 설명
- 함수는 문자열을 저장하지 않고 호출 중 읽기만 합니다.
- 길이를 먼저 비교해 짧은 문자열에서 잘못된 범위를 기대하지 않습니다.
substr가 만드는 것도 문자 복사가 없는string_view입니다.- 소유 문자열
playerName은main이 끝날 때까지 살아 있습니다. - 문자열 리터럴도 같은 함수에 전달할 수 있습니다.
실행 결과와 값 변화
true
접두사를 Mage_로 바꾸면 false가 됩니다. 함수는 두 입력을 수정하거나 보관하지 않습니다.
단계별 실습
실습 목표
아이템 이름의 접미사와 길이를 복사 없이 검사합니다.
시작 전 상태와 실행 방법
예제 함수와 std::string itemName{"Potion_Large"}를 준비합니다.
1단계: 최소 코드 작성
string_view를 받는 isLongName 함수를 만들고 길이 10 이상인지 반환합니다.
2단계: 값 또는 조건을 바꿔 결과 비교
이름과 길이 기준을 바꾸어 결과를 비교합니다.
3단계: 작은 기능 확장
마지막 6글자가 _Large인지 검사하는 함수를 추가합니다.
4단계: 스스로 해결하기
함수 안에서 만든 지역 string의 뷰를 반환하면 왜 위험한지 코드 실행 없이 수명 순서로 설명하세요.
막혔을 때
string_view는 C++17 기능이므로 표준 설정과 <string_view> 포함을 확인합니다. 뷰를 멤버에 저장한다면 원본이 객체보다 오래 사는지 증명할 수 있어야 합니다.
흔한 실수와 해결 방법
- 지역 string의 뷰 반환: 함수 종료와 함께 문자가 사라집니다.
- null 종료를 항상 기대: 뷰는 길이를 가지며 끝에
\0이 있다고 보장하지 않습니다. - 소유해야 하는 데이터까지 view 사용: 보관하거나 수정해야 하면
string으로 복사해 소유합니다.
게임 개발 연결
즉시 파싱하는 명령, 태그 이름 비교처럼 호출 중에만 읽는 문자열에 유용합니다. 엔진 문자열 타입과 변환할 때는 임시 변환 버퍼의 수명, 문자 인코딩과 API가 복사하는지 여부를 확인합니다.
이해 점검 질문 3개
string_view가 문자열 복사를 피할 수 있는 이유는 무엇인가요?- 뷰를 함수 밖에 저장할 때 가장 먼저 확인할 것은 무엇인가요?
- 문자열을 수정·보관해야 할 때 어떤 타입이 더 적합한가요?
핵심 요약
string은 문자를 소유하고 string_view는 기존 문자를 잠시 관찰합니다. 복사 비용보다 수명 계약이 먼저이며, 원본보다 오래 사용할 가능성이 있으면 소유 문자열을 선택합니다.
다음 강의 연결
13강. vector 기초에서 여러 값을 연속 목록으로 소유하고 안전하게 추가·순회합니다.
std::string과 std::string_view: 문자열을 안전하게 다루는 기준 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.