본문 바로가기

Programming Study/C++

String 클래스의 디자인

1. C++의 표준과 표준 string 클래스

표준 string 클래스

C++ 표준 라이브러리에는 string이라는 이름의 클래스가 정의되어 있다.

클래스의 이름이 의미하는 것처럼, 문자열의 처리를 목적으로 정의된 클래스이며,

이 클래스의 사용을 위해서는 헤더파일 <string>을 포함해야 한다.

다음은 string 클래스의 사용 예제이다.

#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;

 

 

2. 문자열 처리 클래스의 정의

지금부터는 위의 예제에서 사용된 string 클래스를 대체할 수 있는 클래스를 구현해 보자.

 

표준 string 클래스의 분석

대체 클래스를 정의하기 위해서는 어떠한 것들이 요구 되는지 정리해 보자.

하나. 문자열을 인자로 전달 받는 생성자의 정의

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

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

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

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

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

 

String 클래스의 완성

앞에서 분석한 것을 토대로 표준 string 클래스를 대체하는 클래스를 구현해보자.

우선 선언부분이다.

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

class String
{
private:
    int len;
    char *str;
public:
    String();
    String(const char *s);
    String(const String& s);
    ~String();
    String& operator=(const String& s);
    String& operator+=(const String& s);
    bool operator==(const String& s);
    String operator+(const String& s);

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

 

위에서 선언한 멤버함수와 전역함수를 구현해 보자.

 String::String()
{
    len = 0;
    str=NULL;
}
String::String(const char* s)
{
    len = strlen(s)+1;
    str = new char[len];
    strcpy(str, s);
}
String::String(const String& s)
{
    len = s.len;
    str = new char[len];
    strcpy(str, s.str);
}
String::~String()
{
    if(str!=NULL)
        delete []str;
}

String& String::operator= (const String& s)
{
    if(str!=NULL)
        delete []str;
    len=s.len;
    str = new char[len];
    strcpy(str, s.str);
    return *this;
}
String& String::operator+=(const String& s)
{
    len+=(s.len-1);
    char * temp = new char[len];
    strcpy(temp, str);
    strcpy(temp, s.str);

    if(str!=NULL)
        delete []str;
    str=temp;
    return *this;
}
bool String::operator==(const String& s)
{
    return strcmp(str, s.str) ? false: true;
}
String String::operator+ (const String& s)
{
    char* temp = new char[len+s.len-1];
    strcpy(temp, str);
    strcpy(temp, s.str);

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

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;
}

 

 

 

 

- 윤성우 저, 열혈강의 C++ 프로그래밍 中 -

'Programming Study > C++' 카테고리의 다른 글

템플릿_2  (0) 2014.10.14
템플릿_1  (0) 2014.10.07
연산자 오버로딩_2  (0) 2014.10.03
연산자 오버로딩_1  (0) 2014.10.03
가상(Virtual)의 원리와 다중상속(Multiple Inheritance)  (0) 2014.09.30