본문으로 건너뛰기
모던 C++LESSON 12

std::string과 std::string_view: 문자열을 안전하게 다루는 기준

난이도초급 → 중급 입문
예상 시간45분
선수지식이전 강의

12강. std::string과 std::string_view: 문자열을 안전하게 다루는 기준

이번 강의에서 해결할 문제​

읽기만 하는 함수가 매번 문자열을 복사하면 불필요한 할당이 생깁니다. 그렇다고 항상 문자 포인터를 받으면 길이와 수명 계약이 모호합니다. string_view는 복사 없이 문자열을 보지만 원본을 소유하지 않아 수명을 잘못 다루면 댕글링 뷰가 됩니다.

학습 목표​

  • string의 소유와 string_view의 비소유 관찰을 구분합니다.
  • 읽기 전용 함수 인자에 string_view를 사용합니다.
  • 뷰가 원본보다 오래 살아서는 안 되는 이유를 설명합니다.

먼저 알아야 할 핵심 개념​

std::string은 문자 저장 공간을 소유하고 복사·이동·수정을 관리합니다. std::string_view는 문자 시작 위치와 길이만 가진 가벼운 뷰입니다. 문자열 리터럴과 string을 모두 복사 없이 받을 수 있지만 원본 문자가 파괴되거나 재할당되면 뷰는 유효하지 않습니다.

가장 작은 실행 가능한 예제​

string_view_prefix.cpp
#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';
}

핵심 코드 줄별 설명​

  1. 함수는 문자열을 저장하지 않고 호출 중 읽기만 합니다.
  2. 길이를 먼저 비교해 짧은 문자열에서 잘못된 범위를 기대하지 않습니다.
  3. substr가 만드는 것도 문자 복사가 없는 string_view입니다.
  4. 소유 문자열 playerName은 main이 끝날 때까지 살아 있습니다.
  5. 문자열 리터럴도 같은 함수에 전달할 수 있습니다.

실행 결과와 값 변화​

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개​

  1. string_view가 문자열 복사를 피할 수 있는 이유는 무엇인가요?
  2. 뷰를 함수 밖에 저장할 때 가장 먼저 확인할 것은 무엇인가요?
  3. 문자열을 수정·보관해야 할 때 어떤 타입이 더 적합한가요?

핵심 요약​

string은 문자를 소유하고 string_view는 기존 문자를 잠시 관찰합니다. 복사 비용보다 수명 계약이 먼저이며, 원본보다 오래 사용할 가능성이 있으면 소유 문자열을 선택합니다.

다음 강의 연결​

13강. vector 기초에서 여러 값을 연속 목록으로 소유하고 안전하게 추가·순회합니다.

MINI QUIZ

std::string과 std::string_view: 문자열을 안전하게 다루는 기준 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“std::string과 std::string_view: 문자열을 안전하게 다루는 기준”의 위험한 선택을 피하려면 어떤 원칙을 적용해야 하나요?
  2. 문제 2“std::string과 std::string_view: 문자열을 안전하게 다루는 기준”에서 ‘null 종료를 항상 기대’ 문제가 생겼습니다. 가장 알맞은 진단 또는 대응은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

12강. std::string과 std::string_view: 문자열을 안전하게 다루는 기준 미완료 상태