이번에는 C++ string 클래스에 대해서 알아보자
C언어에서 문자열은 char 타입 배열에 문자를 넣고 문자열 끝에 null문자('\0')로 넣어 문자열을 나타내었다.
따라서 C언어로 char []나 char*의 형태로 문자열을 다루었지만
C++은 문자열을 하나의 자료형을 간주하여 다룰 수 있게한다.
C++ string 타입으로 저장한 문자열은 C언어와 달리 문자열 끝에 null('\0')문자가 없고
문자열의 길이를 동적으로 변경 할 수 있게 한다.
1. string class
C++ STL(표준 라이브러리)는 문자열을 다루는 string 클래스를 제공한다.
<string> 라이브러리를 헤더에 include 해야 사용할 수 있다.
2. string 객체 생성하는 법
C++은 string 객체 생성에 (지나치게) 다양한 방법을 제공한다. 이들 간에 미세한 차이가 있지만 너무 신경 쓰지 말고 한 가지의 방법을 선택해 익숙해져라
#include <iostream>
#include <string>
using namespace std;
int main() {
string str; // 빈(empty) 스트링
string str1 = "Kim";
string str2("Korea");
string name = str1; //복사가 가능하다.
string address(str2); //복사가 가능하다.
cout << str << " " << str1 << " " << str2 << " "
<< name << " " << address << endl;
string str3 = { "Hello World" };
string str4{ "Hello World" };
string str5{ str3 }; //복사가 가능하다.
cout << str3 << " " << str4 << " " << str5 << endl;
return 0;
}
배열은 복사가 불가능하지만 string은 위 코드처럼 다양한 방법으로 복사가 가능하다.
3. string 클래스 연산
string 객체에 비교, 대입, + 연산자 등을 사용할 수 있다.
- 두 문자열 사전식 비교 또는 동일 여부 (<, >, ==, !=)
- 문자열 비교 시 사전식으로 빠른 문자열이 비교적으로 작다고 판단
- 문자열 결합(+)
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1 = "abc";
string str2 = "def";
str1 += str2;
str1 += "1234";
cout << str1;
return 0;
}
4. string 클래스 멤버 함수
(1) 문자열의 특정 위치의 문자에 접근하기
str[index] | index 위치의 문자에 접근 문자열 범위를 벗어나도 예외를 발생 X |
str.at(index) | index위치의 문자에 접근 문자열 범위를 벗어나면 예외를 발생 O |
str.front() | 문자열의 첫 번째 문자에 접근 |
str.back() | 문자열의 마지막 문자에 접근 |
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str = "abcdefg";
cout << "2번째 문자(b):" << str.at(1) << endl;
cout << "6번째 문자(f):" << str[5] << endl;
cout << "첫번째 문자(a):" << str.front() << endl;
cout << "마지막 문자(g):" << str.back() << endl;
return 0;
}
(2) 문자열의 크기 다루기
str.length() | 문자열의 길이 반환 |
str.size() | 문자열의 길이 반환(length()와 같다) |
str.max_size() | 최대한 메모리할당 |
str.capacity() | 문자열이 사용중인 메모리 크기 반환 |
str.resize(n) | 문자열 크기를 n으로 만듦 n이 기존의 문자열보다 크다면 빈공간으로 채우고, 작다면 부분 삭제 |
str.resize(n,'a') | n이 기존의 문자열보다 클 경우 빈 공간을 'a'문자로 채움 |
str.shrink_to_fit() | 문자열의 capacity가 실제 사용하는 메모리보다 큰 경우 낭비되는 메모리를 줄여줌 |
str.reserve(n) | size = n인 메모리를 미리 할당 문자를 채우는 작업은 수행 X |
str.empty() | 문자열이 비었는지 확인 비었으면 1 반환, 아니면 0 반환 |
(3) 문자열 수정하기
추가/삽입 함수
str.push_back(c) | str 맨 뒤에 문자 c를 붙임 |
str.append(str2) | str 뒤에 문자열 str2를 이어 붙임('+' 연산과 동일) |
str.append(str2, n, m) | str 뒤에 문자열 str2의 인덱스 n부터 m까지의 문자를 붙임 |
str.append('a') | str 뒤에 문자 a를 이어 붙임('+' 연산과 동일) |
str.insert(n , str2) | str n번째 index 자리에 str2 문자열을 삽입 |
str.replace(n, k, str2) | str n번째 index 부터 k개의 문자열을 str2로 대체 |
삭제 함수
str.pop_back() | str 맨 뒤의 문자 제거 |
str.clear() | 저장된 문자열 모두 지움 |
str.erase(n, m) | str 인덱스 n부터 m개의 문자를 지움 |
str.erase() | 저장된 문자열 모두 지움 (clear()과 동일) |
(4) 문자열 찾기, 복사, 비교, 부분 문자 다루기
찾기 함수
str.find("abcd") str.find(str2) |
str에서 "abcd"가 포함되어 있는지 확인 있다면 부분문자열의 첫 문자 'a'가 있는 index 반환 없으면 npos(size_t형의 상수) 반환 |
str.find("abcd", n) | str의 n번째 인덱스부터 "abcd"가 있는 지 찾는다 |
str.find_first_of("str2") | str에 str2의 문자집합 중 하나가 처음 발견되는 위치(index)를 반환 |
str.find_first_not_of("str2") | str에 str2의 문자집합에 포함되지 않는 문자가 처음 발견되는 위치(index)를 반환 |
복사
str.copy(str2, k, n) | str의 인덱스 n부터 k개를 str2에 복사 실제 복사된 길이를 반환 |
비교
str.compare(str2) | str과 str2가 같은지 비교한다. str < str2 이면 음수 반환 str == str2 이면 0 반환 str > str2 이면 양수 반환 |
부분 문자 반환 함수
str.substr() | 문자열 전체 반환 |
str.substr(n) | index n부터 끝까지의 부분 문자열 반환 |
str.substr(n, k) | index n부터 k개의 부분 문자열 반환 |
5. string 사용 시 종종 같이 사용하는 함수
<cctype> 라이브러리 : C언어의 ctype 라이브러리에서 넘어온 C++ 라이브러리, 문자를 다루는 유용한 함수가 많다
이 라이브러리 함수의 모든 매개변수는 char타입 문자이다.
isalpha('a') | 문자 a가 알파벳이라면 true 반환, 아니라면 false 반환 |
isupper('a') | 문자 a가 대문자라면 true 반환, 아니라면 false 반환 |
islower('a') | 문자 a가 소문자라면 true 반환, 아니라면 false 반환 |
isdigit('a') | 문자 a가 문자 10 진수('0' ~ '9')라면 true 반환, 아니라면 false 반환 |
isxdigit('a') | 문자 a가 문자 16 진수('0' ~ '9', 'A' ~ 'F', 'a' ~ 'f')라면 true 반환, 아니라면 false 반환 |
isspace('a') | 문자 a가 whitespace character이라면 ture 반환, 아니라면 false 반환 (' ', '\n', '\t', '\f', '\v', '\r') |
toupper('a') | 문자 a를 대문자로 변환 |
tolower('a') | 문자 a를 소문자로 변환 |
'👨💻 Programming > C++' 카테고리의 다른 글
[C++ ] 입력 함수 총 정리 및 함수별 유의사항 (0) | 2024.03.10 |
---|