string 클래스는 C++ STL에서 제공하는 클래스로, 말 그대로 문자열을 벡터와 같이 다룰 수 있게 해주는 클래스 입니다.
C에서는 char* 또는 char[] 의 형태로 문자열을 다뤘다면, C++에서는 문자열을 하나의 변수 타입처럼 사용하며, std::string은 C++표준 라이브러리의 일부분으로 문자열 처리를 위한 다양한 기능을 제공합니다.
C++의 std::string 클래스와 C의 문자열을 다루는 방식에는 몇 가지 중요한 차이가 있습니다. 이 차이점들은 주로 사용의 메모리 관리, 사용의 편의성, 기능성 등에서 나타냅니다.
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 |