이이프
IeF 제멋대로 세상
이이프
전체 방문자
오늘
어제

공지사항

  • ✔ Info
  • 전체 글보기 (56)
    • 💻프로그래밍 내용 정리 (55)
      • C (0)
      • C++17 (55)
    • 💻게임메이커 (0)
    • 💻언리얼엔진 (0)
    • 💻유니티 (0)
    • 🎈[팀&자작]게임소개 (0)
    • 📃게임제작기술 (0)
    • 🎨그림놀이 (0)
    • 📒대학생활 (0)
    • 😃잡담 (1)
    • 🕹게임성과 (0)
    • 💷자격증 (0)

블로그 메뉴

  • 방명록

최근 글

최근 댓글

티스토리

hELLO · Designed By 정상우.
이이프

IeF 제멋대로 세상

[C++ 2.1.3-1] C++std::string 클래스, 표준 사용저 정의 리터럴's'
💻프로그래밍 내용 정리/C++17

[C++ 2.1.3-1] C++std::string 클래스, 표준 사용저 정의 리터럴's'

2022. 8. 20. 00:48
728x90

C++ 표준 라이브러리는 스트링을 좀 더 잘 표현하도록 std::string 클래스를 제공한다.

string 클래스는 std 네임스페이스에 속하며 <string> 헤더에 정의돼 있다.

 

1. string 클래스 사용법

string은 실제로 클래스지만 기본 타입인 것처럼 사용한다.

그래서 코드를 작성할 때 기본 타입처럼 취급하면 된다.

 

C++ string에 연산자 오버로딩을 적용하면 C 스타일 스트링보다 훨씬 사용하기 편하다.

예를 들어 다음과 같이 + 연산자를 string에 적용하면 스트링 결합 연산을 수행하도록 정의할 수 있다.

string A("12");
string B("34");
string C;
C = A + B; // C는 "1234"다.

 

마찬가지로 += 연산자가 스트링 뒤에 덧붙이는 연산을 수행하도록 오버로딩할 수 있다.

string A("12");
string B("34");
A += B; // A는 "1234"다.

 

C 스타일 스트링은 == 연산자로 비교할 수 없다는 단점이 있다.

예를 들어 다음과 같은 두 개의 스트링이 있다고 하자.

char* a = "12";
char b[] = "12";

 

두 스트링을 비교하는 문장을 다음과 같이 작성하면 스트링의 내용이 아닌 포인터값을 비교하기 때문에

항상 false가 리턴된다.

if (a == b) // false 리턴

 

C 언어에서 스트링을 비교하려면 다음과 같이 작성한다.

if (strcmp(a, b) == 0)

또한 C 스트링은 <, <=, >=, >로 비교할 수 없기 때문에 주어진 스트링을 사전식 나열 순서에 따라 비교해서

-1, 0 또는 1을 리턴하는 strcmp()를 사용했다.

 

C++에서 제공하는 string에서는 ==, !=, <와 같은 연산자를 오버로딩해서 스트링에 적용할 수 있다.

string myString = "hello";
myString += ", there";
string myOtherString = myString;
if (myString == myOtherString) {
    myOtherString[0] = 'H';
}
cout << myString << endl;
cout << myOtherString << endl;

결과

위 예제에서는 몇가지 특징이 있다.

1. 스트링을 할당하거나 크기를 조절하는 코드가 여러 군데 흩어져 있어도 메모리 누수가 발생하지 않는다.

string 객체는 모두 스택 변수로 생성되기 때문이다.

 

2. 연산자를 원하는 방식으로 작동하게 할 수 있다.

예를 들어 = 연산자를 스트링을 복사하거나 + 연산자로 스트링을 연결할 수 있다.

 

 


 

2. std::string 리터럴

소스 코드에 나온 스트링 리터럴은 주로 const char*로 처리한다.

표준 사용자 정의 리터럴 's'를 사용하면 스트링 리터럴을 std::string으로 만들 수 있다.

auto string1 = "Hello World"; // string1의 타입은 const char*이다.
auto string2 = "Hello World"s; // string2의 타입은 std::string이다.

표준 사용자 정의 리터럴 's' 를 사용하려면 using namespace std::string_literals; 또는

using namesapce std;를 추가한다.

'💻프로그래밍 내용 정리 > C++17' 카테고리의 다른 글

[C++ 2.1.4] std::string_view 클래스  (1) 2022.08.20
[C++ 2.1.3-2] 하이레벨 숫자 변환(to_string, stoi), 로우레벨 숫자 변환(to_chars, from_chars)  (0) 2022.08.20
[C++ 2.1.2] 스트링 리터럴(리터럴 폴링, 로 스트링 리터럴, 확장 로스트링 리터럴)  (0) 2022.08.19
[C++ 2.1.1] 동적 스트링(C 스타일 스트링), strlen, strcpy, strcat  (0) 2022.08.19
[C++ 1.6.4] 사용자 인터페이스  (0) 2022.08.19
    '💻프로그래밍 내용 정리/C++17' 카테고리의 다른 글
    • [C++ 2.1.4] std::string_view 클래스
    • [C++ 2.1.3-2] 하이레벨 숫자 변환(to_string, stoi), 로우레벨 숫자 변환(to_chars, from_chars)
    • [C++ 2.1.2] 스트링 리터럴(리터럴 폴링, 로 스트링 리터럴, 확장 로스트링 리터럴)
    • [C++ 2.1.1] 동적 스트링(C 스타일 스트링), strlen, strcpy, strcat
    이이프
    이이프
    게임 프로그래머 지망생 / Since 2022.08.14

    티스토리툴바