[C++] Chapter 12 - String 클래스의 디자인

Lee Jeong Min·2021년 1월 16일
0

Cpp

목록 보기
12/16
post-thumbnail

12-1 C++의 표준과 표준 string 클래스

표준 string 클래스

string 클래스의 간단한 예제
STDString.cpp

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

int main(void)
{
	string str1 = "I like ";
	string str2 = "string class";
	string str3 = str1 + str2;

	cout << str1 << endl;
	cout << str2 << endl;
	cout << str3 << endl;

	str1 += str2;
	if (str1 == str3)
		cout << "동일 문자열!" << endl;
	else
		cout << "동일하지 않은 문자열!" << endl;

	string str4;
	cout << "문자열 입력: ";
	cin >> str4;
	cout << "입력한 문자열: " << str4 << endl;
	return 0;
}

string간 덧셈연산 , <<연산, += 연산, >> 연산 모두 가능함을 알 수 있고 이는 오버로딩으로 인해 가능하다는 사실도 알 수 있다.


12-2 문자열 처리 클래스의 정의

표준 string 클래스의 분석

이 부분에서는 전 단원에서 배운 연산자 오버로딩, 생성자, 소멸자 등등을 통해 자신이 직접 String 클래스를 구현하고 자한다.

string 클래스는 다음과 같이 나뉘어져있다.

  • 문자열을 인자로 전달받는 생성자의 정의

  • 생성자, 소멸자, 복사 생성자 그리고 대입 연산자의 정의

  • 결합된 문자열로 초기화된 객체를 반환하는 + 연산자의 오버로딩

  • 문자열을 덧붙이는 += 연산자의 오버로딩

  • 내용 비교를 진행하는 ==연산자의 오버로딩

  • 콘솔 입출력이 가능하도록 <<, >> 연산자의 오버로딩

이를 코드로 옮기면 다음과 같이 이루어 진다.
StringCalss.cpp

#include <iostream>
#include <cstring>
using namespace std;

class String
{
private:
	int len;
	char* str;
public:
	String()
	{
		len = 0;
		str = NULL;
	}
	String(const char* s) // 복사생성자 기본 문자열
	{
		len = strlen(s) + 1;
		str = new char[len];
		strcpy(str, s);
	}
	String(const String& s) // 복사생성자
	{
		len = s.len;
		str = new char[len];
		strcpy(str, s.str);
	}
	~String()
	{
		if (str != NULL)
			delete []str;
	}
	String& operator= (const String& s) // 대입 연산자
	{
		if (str != NULL)
			delete[] str;

		len = s.len;
		str = new char[len];
		strcpy(str, s.str);
		return *this;
	}
	String& operator+= (const String& s)
	{
		len += (s.len - 1);
		char* tempstr = new char[len];
		strcpy(tempstr, str);
		strcat(tempstr, s.str);

		if (str != NULL)
			delete[] str;
		str = tempstr;
		return *this;
	}
	bool operator== (const String& s)
	{

		if (!strcmp(str, s.str))
			return true;
		else
			return false;
		
	}
	String operator+ (const String& s)
	{
		char* tempstr = new char[len + s.len -1];
		strcpy(tempstr, str);
		strcat(tempstr, s.str);

		String temp(tempstr);
		delete[] tempstr;
		return temp;
	}

	friend ostream& operator<< (ostream& os, const String& s);
	friend istream& operator>> (istream& is, String& s);

};

ostream& operator<<(ostream& os, const String& s)
{
	os << s.str;
	return os;
}

istream& operator>>(istream& is, String& s)
{
	char str[100];
	is >> str;
	s = String(str);
	return is;
}


int main(void)
{
	String str1 = "I like ";
	String str2 = "string class";
	String str3 = str1 + str2;

	cout << str1 << endl;
	cout << str2 << endl;
	cout << str3 << endl;

	str1 += str2;
	if (str1 == str3)
		cout << "동일 문자열!" << endl;
	else
		cout << "동일하지 않은 문자열!" << endl;

	String str4;
	cout << "문자열 입력: ";
	cin >> str4;
	cout << "입력한 문자열: " << str4 << endl;
	return 0;
}

앞 단원에서 배운 생성자, 복사생성자, 소멸자, 연산자 오버로딩을 활용하여 String클래스를 만들었다.

profile
It is possible for ordinary people to choose to be extraordinary.

0개의 댓글