C++

08. C++_string class와 관련 기능

만수르코딩방 2024. 6. 16. 16:11

string 클래스는 C++ STL에서 제공하는 클래스로, 말 그대로 문자열을 벡터와 같이 다룰 수 있게 해주는 클래스 입니다.

C에서는 char* 또는 char[] 의 형태로 문자열을 다뤘다면, C++에서는 문자열을 하나의 변수 타입처럼 사용하며, std::string은 C++표준 라이브러리의 일부분으로 문자열 처리를 위한 다양한 기능을 제공합니다.

 

C++의 std::string 클래스와 C의 문자열을 다루는 방식에는 몇 가지 중요한 차이가 있습니다. 이 차이점들은 주로 사용의 메모리 관리, 사용의 편의성, 기능성 등에서 나타냅니다.

출처 : greeksforgeeks

 

1. 메모리 관리

C문자열은 메모리 관리를 사용자가 직접 해야합니다. 문자열의 크기를 미리 할당해야 하고, 필요에 따라 메모리를 할당하거나 해제해야 합니다. 이로 인해 메모리 누수나 오버플로우 같은 문제가 발생할 수 있습니다.

char *str = (char *)malloc(100 * sizeof(char));
strcpy(str, "Hello, world!");
free(str);

 

C++ 문자열 : 'std::string' 클래스는 동적 메모리 관리를 자동으로 처리해줍니다. 문자열의 길이에 따라 자동으로 크기를 조절하며, 메모리 할당과 해제를 알아서 처리해줍니다. 

std::string str = "Hello, world!";

 

2. 사용의 편의성

C문자열은 문자열을 조작하기 위해 strcpy, strcat, strlen 등과 같은 표준 라이브러리 함수를 사용해야합니다. 이러한 함수들은 사용이 복잡하고 종종 버퍼 크기를 초과하는 문제를 일으킬 수 있습니다.

char str1[50] = "Hello";
char str2[50] = "World";
strcat(str1, str2); // str1에 str2를 붙임

 

std::string은 문자열 조작을 위해 특화된 메서드(substr, replace, append, find) 들을 추가로 제공합니다. 또한 + 연산자를 사용하여 문자열을 쉽게 결합할 수 있습니다.  이를 통해 문자열을 쉽게 생성, 수정, 검색, 변환, 비교할 수 있습니다. 

(1) 생성자
std::string str1; // 기본 생성자
std::string str2("Hello, world!"); // C-스타일 문자열로부터 초기화
std::string str3(str2); //다른 string 객체로부터 초기화

(2) 문자열 결합
//operator + 연산자를 사용하여 두 문자열을 결합할 수 있습니다.
std::string str1 = "Hello";
std::string str2 = "World";
std::string str3 = str1 + " " + str2; // str3 = "Hello World"

(3) 부분 문자열 추출
//substr()을 사용하여 부분 문자열을 추출할 수 있습니다. 
std::string str = "Hello, world!";
std::string sub = str.substr(7, 5); // sub = "world"

(4) 문자열 검색
//find()를 사용하여 특정 문자열이나 문자의 첫 번째 위치를 찾습니다.
//rfind() 특정 문자열이나 문자의 마지막 위치를 찾습니다.
std::string str = "Hello, world!";
size_t pos = str.find("world"); // pos = 7
size_t pos = str.rfind("world"); // pos = 14

(5) 문자열 치환
//replace() 문자열의 일부를 다른 문자열로 치환합니다. 
std::string str = "Hello, world!";
str.replace(7, 5, "C++"); // str = "Hello, C++!"

(6) 문자열 추가
//append() 문자열을 다른 문자열에 추가합니다.
std::string str = "Hello";
str.append(" World"); // str = "Hello World"

(7) C스타일 문자열로 변환
//c_str(): std::string 객체를 C스타일 문자열 const char*로 변환합니다.
//null문자를 문자열의 끝에 추가하고 포인처를 반환합니다.
std::string str = "Hello, world!";
const char* cstr = str.c_str();

(8) 비교
//compare() 을 활용하여 두 문자열을 비교합니다.
std::string str1 = "Hello";
std::string str2 = "World";
int result = str1.compare(str2); // result < 0, str1이 str2보다 사전적으로 앞에 있음

 

3. 기능성

std::string 클래스는 벡터와 같이 동작하여 유사한 메서드를 제공합니다. 두 클래스 모두 동적으로 메모리를 할당하고 관리하여 사용자가 메모리 관리를 직접 하지 않아도 됩니다. 또한 벡터와 유사한 메서드를 사용할 수 있습니다.

(1) 크기 관련 메서드
//size() 와 length() 메서드를 사용하여 크기나 길이를 알 수 있습니다.
std::string str = "Hello";
size_t str_size = str.size(); // str_size = 5

std::vector<int> vec = {1, 2, 3};
size_t vec_size = vec.size(); // vec_size = 3

(2) empty 메서드
//문자열이나 벡터가 비어있는지 확인할 수 있습니다.
std::string str = "";
bool is_str_empty = str.empty(); // true

std::vector<int> vec;
bool is_vec_empty = vec.empty(); // true

(3) 문자 반환, 제거 및 추가
//front() 문자열의 첫 번쨰 문자를 반환합니다.
//back() 문자열의 마지막 문자를 반환합니다. 
//push_back() 문자열의 끝에 문자를 추가합니다
//pop_back() 문자열의 끝에 문자를 제거합니다.

//insert() : 문자열의 특정 위치에 다른 문자열이나 문자를 삽입합니다
//erase() : 문자열의 특정 부분을 제거합니다.
//clear() : 문자열의 모든 내용을 지웁니다. 
std::string str = "Hello";
char first = str.front(); // first = 'H'
char last = str.back(); // last = 'o'
str.push_back('!'); // str = "Hello!"
str.pop_back(); // str = "Hello"

std::string str = "Hello!";
str.insert(5, ", world"); // str = "Hello, world!"

std::string str = "Hello, world!";
str.erase(5, 7); // str = "Hello!"

std::string str = "Hello, world!";
str.clear(); // str은 빈 문자열이 됩니다.

(4) 문자 접근
//operator [] 인덱스를 사용하여 특정 문자에 접근하거나 수정할 수 있습니다.
char c = str[1]; // c = 'e'
str[1] = 'a'; // str = "Hallo"

//at()을 활요하여 문자열의 특정 위치에 접근할수 있습니다. 
char c = str.at(1); // c = 'e'
str.at(1) = 'a'; // str = "Hallo"

(5) 크기 조정
//resize() 문자열의 크기를 조정합니다.
std::string str = "Hello";
str.resize(10, 'x'); // str = "Helloxxxxx"

 

 

 

'C++' 카테고리의 다른 글

09. C++_동적으로 배열 할당하기  (0) 2024.05.16
07. C++_call by value/call by pointer/ call by reference 이해하기  (0) 2024.05.16
05. C++_파일 입출력  (0) 2024.05.15
04. C++_얕은복사/깊은복사  (1) 2024.03.24
03. C++_invoke  (0) 2024.03.24