[C++] 동적 스트링 Part 3
🌈 프로그래밍/C++

[C++] 동적 스트링 Part 3

반응형

 

안녕하세요! 드디어 이번 포스팅으로 2장까지 마무리 짓게 되었습니다.

 

아직 갈길은 멀지만 열심히 해보겠습니다.

 

 

2021.08.25 - [C++] - [C++] 동적 스트링 Part 2

 

[C++] 동적 스트링 Part 2

안녕하세요? 수구리입니다. 저번 포스팅에서는 C 스타일의 string에 대해서 알아보았었습니다. 2021.08.24 - [C++] - [C++] 동적 스트링 Part 1 [C++] 동적 스트링 Part 1 안녕하세요? 수구리입니다! 지난 포스

tasddc.tistory.com

 

이전 포스팅 참고하시고 이번 포스팅에서는 std::string_view 클래스에 대해서 알아볼게요!

 


 

2.1.4 std::string_view 클래스 (C++17)

  • 이 클래스는 std::basic_string_view 클래스 템플릿의 인스턴스로 헤더에 정의되어 있다.
  • const string& 대신 사용할 수 있으며 오버헤드가 없다. 즉, 스트링을 복사하지 않음.
  • data()는 제공하지만 c_str()은 제공하지 않는다.
  • remove_prefix(size_t) & remove_suffix(size_t) 메서드 제공 : offset 만큼 스트링 축소 기능
  • string와 string_view를 서로 연결(결합)할 수 있다.
string str = "hello";
string_view sv = " world!";
auto result = str + sv.data(); // 연결 OK

 

 

  • 다음 예제는 주어진 파일명에 확장자만 추출한다.
// 파일의 확장자 명만 추출하는 func.
string_view extractExtension(string_view fileName){
    return fileName.substr(fileName.rfind('.'));
}

// 모든 종류의 스트링에 적용 가능!
string fileName = R"(c:\temp\my file.exe)";
cout << "C++ string: " << extractExtension(fileName) << endl;

const char* cString = R"(c:\temp\my file.exe)";
cout << "C string: " << extractExtension(cString) << endl;

cout << "Literal: " << extractExtension(R"(c:\temp\my file.exe)") << endl;
  • string_view를 사용한다고 해서 string이 생성되는 것은 아니다.
  • string 생성자를 직접 호출 또는 string_view::data()로 생성해야 한다.
void handleExtension(const string& extension) { /* ... */ }

// 동작 x
handleExtension(extractExtension("my file.exe"));

// 동작 o
handleExtension(extractExtension("my file.exe").data()); // data() 메서드
handleExtension(string(extractExtension("my file.exe"))); // 명시적 ctor

 

std::string_view 리터럴

  • 표준 사용자 정의 리터럴인 'sv'를 사용하면 스트링 리터럴을 std::string_view로 만들 수 있음
auto sv = "My string_view"sv;

// sv를 사용하려면
// using namespace std::string_view_literals; 또는
// using namespace std; 를 적어줘야 함

 

 


 

2.1.5 비표준 스트링

  • C++ 스트링을 잘 사용하지 않는 이유?
    • C++ 규격에 명확히 나오지 않기 때문에 string이라는 타입이 있는 줄도 모르는 경우가 있다.
    • 별로 만족스럽지가 않아서 원하는 형태로 스트링 타입을 직접 지정하는 경우도 있다.
    • 가장 큰 이유는 마이크로소프트 MFC의 CString 클래스처럼 개발 프레임워크나 운영체제에서 나름대로 정의한 스트링을 제공해주기 때문이다.

 

  • 스트링과 관련되어서 명심해야 할 점
    • C 스타일 스트링은 사용하지 않는다.
    • MFC or QT에서 제공하는 스트링처럼 현재 사용하는 프레임워크에서 제공하는 스트링을 프로젝트의 표준 스트링으로 삼는다.
    • std::string으로 스트링을 표현한다면 함수의 매개변수로 전달할 읽기 전용 스트링은 std::stirng_view로 지정.
    • 다른 방식으로 표현한다면 현재 프레임 워크에서 제공하는 string_view와 유사한 기능을 활용

 


2.2 요약

  • C++에서 제공하는 string과 string_view 클래스 소개
  • C 스타일에 비해 어떤 장점이 있는지 살펴봄
  • 숫자와 string을 쉽게 변환하는 헬퍼 함수, 로 스트링 리터럴 개념
  • 다음장에서는 코드 문서화, 코드 분할, 명명 규칙, 코드 포매팅을 포함한 코딩 스타일 가이드라인 소개

 

다음 포스팅에서는 3장입니다!

 

감사합니다~

반응형