[C++] string 클래스와 메소드

2022. 6. 16. 15:19♣ C++

이번 포스팅에선 string 클래스와 메서드에 대해 알아보도록 하겠습니다.

C++에선 문자열을 더 손쉽게 처리할 수 있도록 string 클래스와 메서드를 도입했습니다.

이 덕분에 문자열을 하나의 타입으로 처리할 수 있게 되었습니다.

 

개발 환경 : VSCode, Windows 10

 

 

 

 

 

기본 개발 세팅은 다음과 같습니다.

#include <iostream>
#include <string.h>
#include <string>
using namespace std;

int main()
{
	return 0;
}

 

 

 

 

 

📌 C 언어 스타일의 문자열 처리

 

C 언어는 기본적으로 문자열을 배열처럼 처리합니다. 

char 배열이름[길이];

 

 

 

예시1

문자열을 선언하고, 나중에 cin으로 입력받아서 문자열을 초기화하는 예제입니다.

int main()
{    
    const int SIZE = 20;
    // 문자를 하나의 배열처럼 다룬다.
    char name[SIZE];
    cout << "당신의 이름은 : ";
    cin >> name;
    cout << "나의 이름은 " << name << " 입니다." << endl;
}

 

 

결과 1

당신의 이름은 : 김철수
나의 이름은 김철수 입니다.

 

 

 

예시 2

문자열을 선언함과 동시에 초기화도 같이 진행하는 예제입니다.

int main()
{    
    const int SIZE = 20;
    // 문자를 하나의 배열처럼 다룬다.
    char name[SIZE] = "김철수";
    cout << "나의 이름은 " << name << " 입니다." << endl;
}

 

 

결과 2

나의 이름은 김철수 입니다.

 

 

 

 

💥 주의해야 하는 점

(1) 띄어쓰기, 탭, 캐리지 리턴 문자 등은 문자열의 끝으로 인식합니다.

(2) 위의 것들을 모두 입력받기 위해선 cin 객체의 get() 메서드를 사용해야 합니다. ex) cin.get(name, SIZE).get()

(3) 하지만 입력이 SIZE를 넘으면 입력 자체가 되지 않습니다. 이 경우, cin.get(name,SIZE).ignore(SIZE, '\n') 를 사용해줍니다.

 

 

 

 

 

 

📌 string 클래스

 

C 언어 스타일의 문자열은 이런저런 제한이 많았습니다. string 클래스, 타입을 이용하면 손쉽게 문자열을 다룰 수 있습니다.

 

 

🎨 string 클래스를 사용하기 위해선 패키지를 미리 입력해줘야 합니다.

#include <string>

 

 

🎨 string을 통한 문자열 선언 및 초기화

// 선언과 초기화를 따로 하기
string 변수1, 변수2;
변수1 = '문자열';
변수2 = '문자열2';


// 선언과 초기화를 동시에 진행
string 변수1 = '문자열';

 

 

🎨 string 클래스를 이용하여 문자열을 처리해봅시다.

int main()
{    
    string title = "C++은 생각보다 ";
    string main = "쉬운 것 ";
    string last = "같아요!";
    cout << title + main + last << endl;
}

 

결과

C++은 생각보다 쉬운 것 같아요!

 

 

 

 

 

🎨 string 클래스를 이용하면 입력받는 것도 쉽습니다.

 

getline() 함수에 cin 객체와 문자열 변수를 넣어주기만 하면 됩니다.

int main()
{    
    string title;
    getline(cin, title);
    string main = " 은 생각보다 쉬운 것 ";
    string last = "같아요!";
    cout << title + main + last << endl;
}

 

결과

java
java 은 생각보다 쉬운 것 같아요!

 

 

 

 

 

📌 string 메서드

 

string 메서드를 이용하여 문자열과 관련된 여러 처리들을 할 수 있습니다.

 

 

 

🎨 length() / size()

length()는 문자열의 길이를, size()는 문자열의 크기를 나타냅니다. 기본적으로 둘은 같은 값을 가지지만, 그 의미하는 바가 서로 다르다는 점을 인지해야 합니다.

int main()
{    
    string text = "C++은 생각보다 쉬워요!";
    cout << "text의 길이는 "<< text.length() << " 입니다." << endl;
    cout << "text의 크기는 "<< text.size() << " 입니다." << endl;
}

 

결과

text의 길이는 22 입니다.
text의 크기는 22 입니다.

 

 

 

🎨 append()

문자열에 원하는 text를 추가하는 기능입니다. 

int main()
{    
    string text = "C++";
    cout << text << endl;
    text.append(" 생각보다");
    cout << text << endl;;
    text.append(" 쉬워요");
    cout << text << endl;;
}

 

결과

C++
C++ 생각보다
C++ 생각보다 쉬워요

 

 

 

🎨 find()

특정 문자열을 찾아서 그 시작 위치를 반환하는 메서드입니다.

문자열.find(찾을 문자열);
int main()
{    
    string text = "C++은 생각보다 쉬워요.";
    cout << "++이 있는 위치 : " << text.find("++");
}

 

결과

++이 있는 위치 : 1

 

 

만약 찾고자 하는 string을 발견하지 못한 경우, string::size_type의 string::npos라는 상수를 반환합니다.

이를 이용해서 코드를 다시 짜 봅시다.

 

 

예제 2

int main()
{    
    string text = "C++은 생각보다 쉬워요.";
    if (text.find("++" , 3) != string::npos){
        printf("해당 문자열을 찾았습니다.\n");
        cout << "++이 있는 위치 : " << text.find("++" , 3);
    }
    else {
        printf("해당 문자열을 찾지 못했습니다.");
    }
}

 

결과 2

해당 문자열을 찾지 못했습니다.

text.find("++", 3)이라는 코드는 문자열의 4번째부터 "++" 문자열을 찾으라는 명령어입니다. 4번째 이후에는 "++" 문자열이 나오지 않기에, 컴퓨터가 찾지 못한 것을 알 수 있습니다.

 

 

 

 

🎨 compare()

str1, str2 두 문자열을 비교하는 메서드입니다.

두 문자열이 같은 경우, 0을 반환합니다. str1이 str2보다 사전 편찬 순으로 앞에 있을 경우, 0보다 작은 수를 반환합니다. 그 반대는 0보다 큰 수를 반환합니다.

int main()
{    
    string str1 = "강민수";
    string str2 = "강호동";
    if (str1.compare(str2) == 0){
        printf("둘의 문자열은 같습니다.\n\n");
    }
    else if (str1.compare(str2) < 0){
        printf("str1이 사전 편찬순으로 str2보다 앞에 있습니다.\n\n");
    }
    else {
        printf("str1이 사전 편찬순으로 str2보다 뒤에 있습니다.\n\n");
    }
}

 

결과

str1이 사전 편찬순으로 str2보다 앞에 있습니다.

 

 

 

🎨 replace()

특정 위치에 있는 문자열을 원하는 문자열로 대체합니다.

문자열.replace(대체 문자열 시작위치, 대체 문자열의 길이, 새로운 문자열)
int main()
{    
    string str1 = "강민수는 강호동보다 힘이 쎄고 잘생겼습니다.";
    string str11 ="힘";
    string str12 ="잘생";
    string str2 = "고집";
    string str3 = "못생";
    cout << "0차 수정 결과 : " << str1 << endl;
    // 1차 수정
    if (str1.find(str11) != string::npos){
        str1.replace(str1.find(str11), str11.length(), str2);
    }
    else {
        printf("그런 문자열 없습니다.");
    }
    cout << "1차 수정 결과 : " << str1 << endl;
    // 2차 수정
    if (str1.find(str12) != string::npos){
        str1.replace(str1.find(str12), str12.length(), str3);
    }
    else {
        printf("그런 문자열 없습니다.");
    }
    cout << "2차 수정 결과 : " << str1 << endl;
}

대체하려는 문자열이 있는지부터 확인하고, 수정을 진행했습니다.

1차 수정, 2차 수정을 거쳐서 최종 문자열이 반환되었습니다.

 

 

결과

0차 수정 결과 : 강민수는 강호동보다 힘이 쎄고 잘생겼습니다.
1차 수정 결과 : 강민수는 강호동보다 고집이 쎄고 잘생겼습니다.     
2차 수정 결과 : 강민수는 강호동보다 고집이 쎄고 못생겼습니다.

 

 

 

🎨 capacity() / max_size()

capacity()는 재대입 받지 않고 저장할 수 있는 최대 문자열의 길이를 반환합니다. 즉, 현재 용량.

max_size()는 최대한 대입받으면 가질 수 있는 최대 문자열의 길이를 반환합니다. 즉, 최대 용량.

int main()
{    
    string str1 = "Python, C++, NodeJs are my favorite language!";
    cout << "str1 = " << str1 << endl;
    cout << str1.capacity() << " 가 str1의 현재 용량이다.\n";
    cout << str1.max_size() << " 가 str1의 최대 용량이다.\n";
}

 

결과

str1 = Python, C++, NodeJs are my favorite language!
45 가 str1의 현재 용량이다.
2147483647 가 str1의 최대 용량이다.

 

 

 

 

지금까지 string 클래스와 메서드를 살펴보았습니다. C 언어에 비해 문자열을 훨씬 자유롭게 다룰 수 있게 된 것 같습니다. 이번 포스팅은 여기까지 하겠습니다. 다음 포스팅에선 구조체를 다루겠습니다.