클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

복합 데이터형 2 : string 클래스 본문

프로그래밍 언어/C++

복합 데이터형 2 : string 클래스

huenuri 2024. 8. 25. 13:13

이 단원부터는 공부한 흔적이 하나도 없어서 학습 속도가 이전보다 더 느릴 것 같다. 오후가 되니 공부하기가 싫어지고 슬슬 지쳐간다. 놀고 싶기도 하고 오늘 공부는 여기서 마치고 싶은 마음이 많지만 그래도 조금만 더 힘을 내서 버텨보기로 했다. 딱 한 소장만 공부해보기로 하며 책상 앞에 다시 앉아본다. 이럴 때는 재미있는 거라도 보는 게 공부가 더 잘되는 것 같기는 하다.
이번 포스트에서는 string 클래스에 대해서 학습해볼 예정이다. C++ 표준은 string 클래스를 추가하여 C++ 라이브러리를 확장시켰다. string 클래스는 배열보다 사용하기가 쉽다. 문자열을 하나의 데이터형으로 나타내는 좀더 그럴 듯한 표현을 제공한다. string 클래스를 사용하려면 프로그램에 string 헤더 파일을 포함시켜야 한다.


 

 

3. string 클래스

 

예제 7번 : strtype1.cpp

// C++ string 클래스를 사용한다

#include <iostream>
#include <string>               // string 클래스를 사용하기 위해
int main()
{
    using namespace std;
    char charr1[20];            // 빈 배열을 생성한다
    char charr2[20] = "jaguar"; // 초기화된 배열을 생성한다
    string str1;                // 빈 string 객체를 생성한다
    string str2 = "panther";    // 초기화된 string 객체를 생성한다

    cout << "고양이과의 동물 한 종을 입력하시오: ";
    cin >> charr1;
    cout << "고양이과의 또 다른 동물 한 종을 입력하시오: ";
    cin >> str1;                // 입력을 위해 cin을 사용한다
    cout << "아래 동물들은 모두 고양이과입니다:\n";
    cout << charr1 << " " << charr2 << " "
         << str1 << " " << str2 // 출력을 위해 cout을 사용한다
         << endl;
    cout << charr2 << "에서 세 번째 글자: "
         << charr2[2] << endl;
    cout << str2 << "에서 세 번째 글자: "
         << str2[2] << endl;    // 배열 표기를 사용한다

    return 0;
}

 
string 객체와 문자 배열의 가장 큰 차이점은 string 객체를 배열이 아니라 단순한 변수로 선언하는 것이다.
이 클래스 설계는 크기 문제를 프로그램이 자동으로 처리하도록 허용한다. 예를 들어, str1 선언은 길이가 0인 string 객체를 생성한다.
 

대입, 결합, 추가

stirng 클래스는 배열보다 조작이 간단하다. 예를 들어, 하나의 배열을 다른 배열에 간단하게 대입할 수 없지만, 하나의 string 객체를 다른 string 객체에 간단하게 대입할 수 있다.

char charr1[20];                 // 빈 배열을 생성한다
char charr2[20] = "jaguar";     // 초기화된 배열을 생성한다
string str1;                   // 빈 string 객체를 생성한다
string str2 = "panther";        // 초기화된 string 객체를 생성한다
str1 = str2;                // 객체를 대입

 
string 클래스는 문자열 결합을 간단하게 처리한다. +연산자를 사용하뎌 두 개의 string 객체를 하나도 결합할 수 있고, += 연산자를 사용하여 기존의 string 객체 끝에 또 다른 string 객체를 덧붙일 수 있다.
 

예제 8번 : strytype2.cpp

// 대입, 추가, 첨부

#include <iostream>
#include <string>               // string 클래스를 사용하기 위해
int main()
{
    using namespace std;
    string s1 = "penguin";
    string s2, s3;

    cout << "string 객체를 string 객체에 대입할 수 있다: s2 = s1\n";
    s2 = s1;
    cout << "s1: " << s1 << ", s2: " << s2 << endl;
    cout << "string 객체에 C 스타일 문자열을 대입할 수 있다.\n";
    cout << "s2 = \"buzzard\"\n";
    s2 = "buzzard";
    cout << "s2: " << s2 << endl;
    cout << "string 객체들을 결합할 수 있다: s3 = s1 + s2\n";
    s3 = s1 + s2;
    cout << "s3: " << s3 << endl;
    cout << "string 객체들을 추가할 수 있다.\n";
    s1 += s2;
    cout <<"s1 += s2 --> s1 = " << s1 << endl;
    s2 += " for a day";
    cout <<"s2 += \" for a day\" --> s2 = " << s2 << endl;

    return 0;
}

 

string 클래스의 조작

strcat() 함수를 사용하여 문자열을 문자 ㅇ배열에 추가할 수 있다.

예제 9번 : strtype3.cpp

// string 클래스의 기타 기능

#include <iostream>
#include <string>
#include <cstring>
int main()
{
	using namespace std;
	char charr1[20];
	char charr2[20] = "jaguar";
	string str1;
	string str2 = "panther";

	// string 객체의 대입과 문자 배열의 대입
	str1 = str2;				// str2를 str1에 복사
	strcpy(charr1, charr2);		// charr2를 charr1에 복사

	// string 객체의 추가와 문자 배열의 추가
	str1 += " paste";			// str1의 끝에 paste를 추가
	strcat(charr1, " juice");	// charr1의 끝에 juice를 추가

	// string 객체의 길이 구하기와 C 스타일 문자열의 길이 구하기
	int len1 = str1.size();		// str1의 길이를 구한다
	int len2 = strlen(charr1);	// charr1의 길이를 구한다

	cout << str1 << " 문자열에는 " << len1 << "개의 문자가 들어있다.\n";
	cout << charr1 << " 문자열에는 " << len2 << "개의 문자가 들어있다.\n";

	return 0;
}

 
string 클래스는 필요하면 크기를 자동으로 조절하여 배열에 인접한 메모리를 침범하는 문제를 피한다. C 라이브러리는 strcat(), strcpy()와 같은 계통으로 strncat(), strncpy()를 제공한다. 이들은 타깃 배열의 최대 허용 크기를 나타내는 세번째 매개변수를 제공함으로써 더 안전하게 동작하지만, 그들을 사용한다는 것은 프로그램을 작성할 때 한츰 복잡힌다는 것을 의미한다.
문자열에 있는 무자들의 수를 구하는데 서로 다른 문법이 사용된 것에 주목하라.
 

int len1 = str1.size();		// str1의 길이를 구한다
int len2 = strlen(charr1);	// charr1의 길이를 구한다

 
이 문법은 str1이 객체를 나타내고, size()가 클래스 메서드라는 것을 나타낸다. 메서드는 그 메서드와 같은 클래스에 속한 객체에 의해서만 호출될 수 있는 함수이다.
str1은 string 객체이고, size()는 string 메서드이다. 요약하면 C 함수들은 매개변수를 사용하여 어느 문자열으 ㄹ사용할 것인지르 ㄹ나타낸다. C++의 string 클래스 객체는 객체 이름과 도트 연산자를 사용하여 어느 문자열을 사용할 것인지 나타낸다.


 
 
 

string 클래스의 입출력

예제 10번 : strtype4.cpp

// 행 단위 입력

#include <iostream>
#include <string>
#include <cstring>
int main()
{
	using namespace std;
	char charr[20];
	string str;

	cout << "입력 이전에 charr에 있는 문자열의 길이: " << strlen(charr) << endl;
	cout << "입력 이전에 str에 있는 문자열의 길이: " << str.size() << endl;
	cout << "텍스트 한 행을 입력하시오:\n";
	cin.getline(charr, 20);		// 최대 길이를 나타낸다
	cout << "입력한 테스트: " << charr << endl;
	cout << "또 다른 텍스트 한 행을 입력하시오:\n";
	getline(cin, str);			// 이제 cin은 길이 지정자가 아니라 매개변수
	cout << "입력한 테스트: " << str << endl;
	cout << "입력 이후에 charr에 있는 문자열의 길이: " << strlen(charr) << endl;
	cout << "입력 이후에 str에 이 있는 문자열의 길이: " << str.size() << endl;

	return 0;
}

 
입력 이전에 charr 배열에 있는 문자열의 크기는 27로 배열의 크기보다도 크다. 여기서 알아둘 것 2가지

  1. 초기화되지 않은 배열의 내용은 정의되지 않는다
  2. strlen() 함수는 배열의 첫번째 원소에서 출발하여 널 문자에 도달할 때까지 바이트들을 카운트한다
  • 이 경우 배열의 끝을 몇 바이트 자니차고 나서야 첫 널 문자가 나타난다. 초기화되지 않은 더에터에서 첫 널 문자가 나타나는 위치는 본질적으로 랜덤함

 
입력 이전에 str에 들어있는 문자열의 길이가 0인 것에 주목하라. 이것은 초기화되지 않은 string 객체는 자동으로 크기가 0으로 설정되기 때문이다.
 

다른 형태의 문자열 상수

C++은 char형 이외이도 wchar_t형을 가지고 있다.
하지만 이 부분은 조금 어려우니 다음에 학습하기로 한다. 이제 구조체에 대해서 살펴볼 것이다.


 

 

오늘의 학습을 마치고

이 단원은 학습하는데 정말 많은 시간이 걸렸다. 중간에 공부하다 너무나 하기 싫어서 몇 시간씩 놀고 잠을 얼마나 많이 잤는지 모른다. 낮잠을 한 3시간 반은 잤나.. 아무튼 다시 일어나서 공부에 집중할 수 있어서 감사했다.
string은 솔직히 C 언어에서도 많이 어려워서 이해하지 못했던 단원이었다. 차근차근 코드를 쳐보고 내용을 정리하며 이제 조금 이해가 되었다.
이 학습을 마치고 C 언어 공부를 할 때도 이 부분을 더 학습하게 될 것 같다. C 언어보다 C++이 훨씬더 간편하고 사용하기 유용하다는 것도 몸소 느끼게 되었다.
빨리 5장 단원으로 넘어가고 싶지만 그래도 구조체까지는 배열과 연관이 있으니 학습을 해볼 생각이다. 그 뒷장은 열거형과 공용체, 포인터 등이 나오는데 지금 학습하기에는 많은 어려움이 있을 것 같았다.