[목차]
1. string 클래스란?
2. string 클래스의 입출력
3. string 클래스 생성
4. string 클래스 연산자 활용
5. string 클래스의 멤버 함수
6. string 클래스의 멤버 함수 사용 예시
1. string 클래스란?
- C++ STL에서 제공하는 클래스로, 말 그대로 string(문자열)을 다루는 클래스이다.
- C에서는 char* 또는 char[] 의 형태로 문자열을 다뤘다면, C++에서는 문자열을 하나의 변수 type처럼 사용하며, 문자열을 훨씬 다양하고 쉽게 다룰 수 있게 해 준다.
- char* , char[] 과 다르게 문자열의 끝에 '\0' 문자가 들어가지 않으며, 문자열의 길이를 동적으로 변경 가능하다.
2. string 클래스의 입/출력
C++ 입출력 방식인 cin , cout 으로 입출력이 가능하며, getline 함수도 이용할 수 있다. C에서의 scanf와 printf는 사용이 불가능하다.
string str; // 문자열 생성
cin >> str; // 공백(space) 이전까지의 문자열을 입력받는다.
getline(cin, str); // '\n' 이전까지의 문자열, 즉 한 줄을 통째로 입력받는다. (공백 포함)
getline(cin, str, 'a') // 'a' 문자 이전까지의 문자열을 입력받는다. getline(cin, str, '\n') == getline(cin, str)
cout << str; // 문자열을 출력한다.
string str;
getline(cin, str);
cout << "str : " << str << '\n';
getline(cin, str, 'd');
cout << "str : " << str << '\n';
cin >> str;
cout << "str : " << str << '\n';
두번째로 "abcdef ghi" 를 입력했을 때, 'd'가 나올 때까지 문자열을 입력받아서 str에 저장하고, 그다음 cin>>str 구문은 현재까지 입력받은 위치부터 공백(space)이 나올 때 까지 입력받으므로 ef만 저장되는 것을 알 수 있다.
3. string 클래스 생성
- string을 이용하기 위해서는 먼저 <string> 헤더 파일을 추가해주어야 한다.
- string을 생성하는 방법들은 다음과 같다.
string str; | 빈 문자열 str 생성 |
string str = "abcdef"; string str; str = "abcdef"; |
"abcdef" 로 선언된 str 생성 |
string str("abcdef"); | "abcdef" 로 선언된 str 생성 |
string str2(str1); | str1 문자열을 복사한 str2 생성 |
char s[ ] = {'a', 'b', 'c', 'd', 'e', 'f'}; string str(s); |
C에서의 문자열과 호환 가능 |
string *str = new string("abcdef"); |
new를 이용한 동적할당 |
4. string 클래스 연산자 활용
* string 클래스에 <, >, ==, + 등과 같은 연산자들을 사용할 수 있다.
- 문자열 비교 (<, >, ==) : 두 문자열의 사전 순서를 비교, 또는 동일 여부를 확인할 수 있다.
- 문자열 연결 (+) : 두 문자열을 이어주는 역할을 한다.
예시)
string str1 = "abcdef";
string str2 = "bbbbbb";
string str3 = "aaaa";
string str4 = "abcdef";
cout << (str1 < str2) << ' ' << (str1 < str3) << ' ' << (str1 == str4);
//1 : true , 0 : false
str1 += "A";
cout << str1 << '\n';
str1 = str1 + str2;
cout << str1 << '\n';
str1보다 str2가 사전 순서가 더 느리기 때문에 true(1)를 반환, str3은 사전 순서가 str1보다 더 빠르기 때문에 false(0)를 반환, str1과 str4는 문자열이 동일하기 때문에 true(1)를 반환하는 것을 볼 수 있다.
또 str1에 "A"를 더해주게 되면 "A"가 str1 맨 뒤에 붙게 되고, str2를 더해주면 str2가 str1의 맨 뒤에 붙게 되는 것도 볼 수 있다.
이처럼 C에서의 문자열보다 훨씬 간편하게 두 문자열에 대한 연산을 할 수 있다.
5. string 클래스의 멤버 함수
string 클래스에는 유용한 멤버 함수들이 정말 많다.
string str; 로 선언되어있다고 가정하고 멤버 함수들을 살펴보자.
▶ string의 특정 원소 접근
str.at(index) | index 위치의 문자 반환. 유효한 범위인지 체크 O |
str[index] | index 위치의 문자 반환. 유효한 범위인지 체크 X. 따라서 at 함수보다 접근이 빠름 |
str.front() | 문자열의 가장 앞 문자 반환 |
str.back() | 문자열의 가장 뒤 문자 반환 |
▶ string의 크기
str.length() | 문자열 길이 반환 |
str.size() | 문자열 길이 반환 (length와 동일) |
str.capacity() | 문자열이 사용중인 메모리 크기 반환 |
str.resize(n) | string을 n의 크기로 만듦. 기존의 문자열 길이보다 n이 작다면 남은 부분은 삭제하고, n이 크다면 빈공간으로 채움 |
str.resize(n, 'a') | n이 string의 길이보다 더 크다면, 빈 공간을 'a'로 채움 |
str.shrink_to_fit() | string의 capacity가 실제 사용하는 메모리보다 큰 경우 낭비되는 메모리가 없도록 메모리를 줄여줌 |
str.reserve(n) | size = n만큼의 메모리를 미리 할당해줌 |
str.empty() | str이 빈 문자열인지 확인 |
▶ string에 삽입, 추가, 삭제
str.append(str2) | str 뒤에 str2 문자열을 이어 붙여줌 ('+' 와 같은 역할) |
str.append(str2, n, m) | str 뒤에 'str2의 n index부터 m개의 문자'를 이어 붙여줌 |
str.append(n, 'a') | str 뒤에 n개의 'a'를 이어 붙여줌 |
str.insert(n, str2) | n번째 index 앞에 str2 문자열을 삽입함. |
str.replace(n, k, str2) | n번째 index부터 k개의 문자를 str2로 대체함 |
str.clear() | 저장된 문자열을 모두 지움 |
str.erase(n, m) | n번째 index부터 m개의 문자를 지움 |
str.erase(n, m) (iterator) | n~m index의 문자열을 지움 (n과 m은 iterator) |
str.erase() | clear와 같은 동작 |
str.push_back(c) | str의 맨 뒤에 c 문자를 붙여줌 |
str.pop_back() | str의 맨 뒤의 문자를 제거 |
str.assign(str2) | str에 str2 문자열을 할당. (변수 정의와 동일) |
▶ 기타 유용한 string 멤버 함수
str.find("abcd") | "abcd"가 str에 포함되어있는지를 확인. 찾으면 해당 부분의 첫번째 index를 반환 |
str.find("abcd", n) | n번째 index부터 "abcd"를 find |
str.substr() | str 전체를 반환 |
str.substr(n) | str의 n번째 index부터 끝까지의 문자를 부분문자열로 반환 |
str.substr(n, k) | str의 n번째 index부터 k개의 문자를 부분문자열로 반환 |
str.compare(str2) | str과 str2가 같은지를 비교. 같다면 0, str<str2 인 경우 음수, str>str2 인 경우 양수를 반환 |
swap(str1, str2) | str1과 str2를 바꿔줌. reference를 교환하는 방식 |
isdigit(c) | c 문자가 숫자이면 true, 아니면 false를 반환 |
isalpha(c) | c 문자가 영어이면 true, 아니면 false를 반환 |
toupper(c) | c 문자를 대문자로 변환 |
tolower(c) | c 문자를 소문자로 변환 |
6. string 클래스의 멤버 함수 사용 예시
▶ string의 특정 원소 접근
#include<iostream>
#include<string>
using namespace std;
int main(void) {
string str = "abcdefgh";
cout << str.at(2) << '\n';
cout << str[4] << '\n';
cout << str.front() << '\n';
cout << str.back() << '\n';
}
▶ string의 크기
#include<iostream>
#include<string>
using namespace std;
int main(void) {
string str = "abcdefgh";
cout << str.length() << '\n';
cout << str.size() << '\n';
cout << str.capacity() << '\n';
str.resize(6); cout << str << '\n';
str.resize(8, 'a'); cout << str << '\n';
str.reserve(20); cout << str.capacity() << '\n';
str.shrink_to_fit(); cout << str.capacity() << '\n';
cout << str.empty() << '\n';
}
▶ string에 삽입, 추가, 삭제
#include<iostream>
#include<string>
using namespace std;
int main(void) {
string str = "apple";
string str2 = "banana";
str.append(str2); cout << str << '\n';
str.append(str2, 1, 3); cout << str << '\n';
str.append(3, 'k'); cout << str << '\n';
str.clear(); cout << str << '\n';
str.assign("apple"); cout << str << '\n';
str.insert(2, str2); cout << str << '\n';
str.replace(3, 3, "ttt"); cout << str << '\n';
str.erase(0, 2); cout << str << '\n';
str.erase(); cout << str << '\n';
str.push_back('a'); cout << str << '\n';
str.push_back('b'); cout << str << '\n';
str.pop_back(); cout << str << '\n';
}
▶ 기타 유용한 string 멤버 함수
#include<iostream>
#include<string>
using namespace std;
int main(void) {
string str = "apple";
string str2 = "banana";
cout << str.find("ppl") << '\n';
cout << str.find("appl", 0) << '\n';
cout << str.find("appl", 1) << '\n';
cout << str.substr() << '\n';
cout << str.substr(2) << '\n';
cout << str.substr(1, 3) << '\n';
cout << str.compare(str2) << '\n';
swap(str, str2); cout << str << ' ' << str2 << '\n';
cout << isdigit(str[0]) << '\n';
cout << isalpha(str[0]) << '\n';
toupper(str[0]); cout << str << '\n';
tolower(str[0]); cout << str << '\n';
}
PC로 보시는 것을 권장합니다.
피드백은 언제나 환영입니다. 댓글로 달아주세요 ^-^
'Programming Language > C++' 카테고리의 다른 글
[C++] vector container 정리 및 기본 사용법과 응용 (0) | 2020.05.06 |
---|---|
[C++] lower_bound & upper_bound (0) | 2020.05.06 |
[C++] STL - sort (0) | 2020.04.21 |
[C++] STL - 스택(Stack) & 큐(Queue) (0) | 2020.04.16 |
[C++] 입출력 ( cin / cout ) (0) | 2020.04.16 |