프로그래밍 / C++ / 언리얼

Programming/C | C++ | Unreal

[C++] string 클래스, 간편한 문자열 기능 알아보기

아트성 2022. 2. 13. 17:18

 

String 클래스 개요   

 

기존 C언어에서 문자열을 표현할때, 스트링 표현방식을 배열방식으로 구현하였는데, 스트링 마지막에 null값을 붙여서 스트링의 마지막을 나타냈다. 매번 문자열을 처리하는게 번거로웠는데, C++ 표준 라이브러리는 스트링을 좀 더 잘 표현하도록 std::string 클래스를 제공한다.

 

std::string 클래스는 basic_string이라는 클래스 template의 인스턴스로서, <cstring>의 함수 적용 방식은 비슷하지만 메모리를 알아서 할당처리해주는 기능이 들어있어 기존 문자열 처리방식의 복잡도를 어느정도 해소시켜주고있다.

 

 

 

 

 

String 클래스의 장점   

 

 •  간단하다. 내부적으로 기본 문자 타입과 배열 구조체로 처리한다.

 •  가볍다. 제대로 사용하면 메모리를 꼭 필요한 만큼만 사용한다.

 •  C프로그래머에게익숙하다. 새로 배울 필요가 없다.

 •  로우 레벨이다. 따라서 메모리의 실제 상태를 조작하거나 복사하기 쉽다. 

// c style string생성
char* str = new char[7];
strcpy_s(str, sizeof(char) * 7, "hello!");

// C++ style string생성
string str1("hello!");

cout << str << endl; // Output : hello!
cout << str1 << endl; // Output : hello!

return 0;

 

확실히 String 클래스를 사용했을때 코드가 간단명료하다. C 스타일과 C++스타일 모두 결과는 같다.

스트링을 할당하거나 크기를 조절하는 코드가 여러군데 흩어져있어도 메모리 누수가 발생하지 않는다, 그이유는 string 객체는 모두 스택변수로 생성되기 때문이다.(메모리를 소멸자가 모두 정리.)

 

 

 

 

 

string 클래스의 생성  

 

우선 string 클래스를 생성하기 위해서는 헤더파일인 <string>을 추가해야한다. (C스타일 방식은 <cstring>이다)

c++ 스트링 타입은 <string>헤더파일에 정의돼 있다. 이 타입은 iostream과 마찬가지로 std 네임스페이스에 속한다.

 

생성은 크게 두가지로 나뉘는데, 괄호안에다 선언하는 방식과 LValue에 대입하는 형식으로 나뉜다.

 

다른 방법이있지만 아래 두가지 방식이 가장 보편적으로 사용하는 방식이다.

string str1("Hello"); 

string str2 = "Hello";

 

 

 

 

 

string 클래스의 응용  

 

String 클래스는 C스타일 string과 다르게 연산자를 활용해서 string끼리 결합이 가능하다.

또한, +, +=, == 연산자를 활용하여 아래와 같이 나타낼수도 있다. 편의상 using namespace std;를 첨부했다고 가정해보자.

string A("대한");
string B("민국");
string C;
C = A + B; 
cout << C << endl; // Output : 대한민국
string A("대한");
string B("민국");
A += B;
cout << A << endl; // Output : 대한민국
string myStr = "korea";
myStr += ", Seoul";
string myOtherStr = myStr;

if (myStr == myOtherStr) 
{
	myOtherStr[0] = 'K';
}

cout << myOtherStr << endl; // Output : Korea, Seoul

 

이처럼 c++ string에 연산자 오버로딩을 적용하면 C스타일 스트링보다 훨씬 사용하기 편하다. 
다음과 같이 + 연산자를 string에 적용하면 스트링 결합연산을 수행하도록 정의할수 있다.

 

 

 

 

 

String 클래스의 멤버함수  

 

String 클래스의 멤버함수는 유용한 기능들이 많이 있는데,  우리가 문자열을 수정하거나, 접근 또는 찾을때 자주 사용하는 멤버함수이므로 필히 익혀두도록 한다.  

 

a.멤버함수()에서 a는 String 클래스에서 선언한 문자열, 'c'는 char타입의 문자 라고 생각해보자.

 

 

 

접근 ( Access )

a[i] i번째 문자를 참조함(범위 유효성 체크 안함.)
a.at(i) i번째 문자를 참조함(범위 유효성 체크 함.)
a.back() 문자열의 마지막 요소 반환함.
a.front() 문자열의 첫번째 요소 반환함.
a.find('c') 문자열의 인덱스를 반환함.

 

string a = "STRING";

cout << a[1] << endl; // Output : T
cout << a.at(1) << endl; // Output : T
cout << a.back() << endl; // Output : G
cout << a.front() << endl; // Output : S

// find()
cout << a.find("S") << endl; // Output : 0
cout << a.find("T") << endl; // Output : 1
cout << a.find("R") << endl; // Output : 2
cout << a.find("STRING") << endl; // Output : 0
cout << a.find("1") << endl; // Output : 4294967295(32bit), 18446744073709551615(64bit)

 

 

 

삽입 / 삭제 ( Modification )

a.append(b)  새 문자열을 추가로 이어 붙여줌 (a+=b와 동일)
swap(a, b) 문자열끼리 바꾼다.
a.assign(b) 새 문자열을 할당
a.assign(n, 'c') 문자를 n만큼 할당
a.insert(n, b)  새 문자열을 n번째 뒤에 삽입함.
a.erase(n, n1)  문자열의 위치 n을 기점으로, n1만큼 지움.
a.replace(n, n1, b) 문자열의 위치 n을 기점으로, n1만큼 지우고 문자열 삽입
a.push_back('c')  문자열뒤에 새 문자(char)를 붙여줌
a.pop_back() 문자열뒤의 문자 하나를 뺌
string a = "Python";
string b = "Java";

swap(a, b); cout << "a : " << a << " , " << "b : " << b << endl; 
// Output : Java, Python
cout << "a : " << a.append(b) << endl; // Output : JavaPython 
cout << "a : " << a.assign(b) << endl; // Output : Python
cout << "a : " << a.assign(3, 'C') << endl; // Output : CCC
cout << "a : " << a.insert(3, b) << endl; // Output : CCCPython
cout << "a : " << a.erase(3, 2) << endl; // Output : CCCthon
cout << "a : " << a.replace(3, 2, b) << endl; // Output : CCCPythonon
a.push_back('Z'); cout << "a : " << a << endl; // Output : CCCPythononZ
a.pop_back(); cout << "a : " << a << endl; // Output : CCCPythonon

 

 

 

용량 ( Capacity )

a.size()  문자열의 길이 반환
a.legth()  문자열의 길이 반환 (size()와 동일하다)
a.resize(n) n의 크기로 사이즈를 줄임
a.capacity()  할당된 스토리지의 크기 반환
a.reserve(n)  n의 공간을 할당해줌.
a.clear() 문자열 지우기
a.empty() 문자열이 비어 있는지 테스트 (true = 1, false = 0)
a.shrink_to_fit() 문자열의 크기에 맞게 축소(가비지 메모리관리)
string a = "STRING";
string _a = "가나다라마바사";

cout << "a.size() : " << a.size() << endl; // Output : 7
cout << "_a.size() : " << _a.size() << endl; // Output : 14
cout << "a.length() : " << a.length() << endl; // Output : 7
cout << "_a.length() : " << _a.length() << endl; // Output : 14

a.resize(3); 
cout << "a.resize() : " << a << endl; // Output : STR
cout << "a.capacity() : " << a.capacity() << endl; // Output : 15
cout << "_a.capacity() : " << _a.capacity() << endl; // Output : 15

a.reserve(100); 
cout << "a.reserve() : " << a.capacity() << endl; // Output : 111 (100을 할당해도 조금더 여유롭게 할당된다.)

a.shrink_to_fit(); 
cout << "a.shrink_to_fit() : " << a.capacity() << endl; // Output : 15

cout << "a.empty() : " << a.empty() << endl; // Output : 0

a.clear(); 
cout << "a.clear() : " << a << endl; // Output : 공백
cout << "a.empty() : " << a.empty() << endl; // Output : 1

 

 

그 외 String 클래스의 멤버함수는 https://www.cplusplus.com/reference/string/string/ 홈페이지에 자세하게 나와있으니 참고하도록 한다.

 

 

반응형