Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

SYDev

C++ Chapter 12-2 : 문자열 처리 클래스의 정의 본문

Programming Lang/C++

C++ Chapter 12-2 : 문자열 처리 클래스의 정의

시데브 2023. 7. 26. 19:15

표준 string 클래스의 분석

 표준 string 클래스의 분석을 위해서 자체적으로 String 클래스를 정의해보자.

 

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

 string 객체를 생성할 때 다음 방식을 사용했는데,

string str1 = "I like ";

 위 코드는 다음과 같이 해석되므로

string str1("I like");

 문자열을 전달받는 적절한 생성자를 정의해야 한다. (선언과 초기화가 분리되지 않았으므로, 대입 연산자가 아닌 생성자 호출)

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

 string 클래스는 문자열을 저장 및 표현하는 클래스인데, 전달받는 문자열의 길이가 일정하지 않다. 때문에, 생성자에서 동적 할당을 진행하고 이에 따라 소멸자에서 메모리 해제를 해야 한다. 이에 따라, 얕은 복사로 발생하는 메모리 누수를 방지하기 위해서 깊은 복사를 하는 복사 생성자와 대입 연산자도 필요하다.

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

 위 연산의 결과로 str1과 str2이 지닌 문자열이 합쳐진 문자열을 저장한 객체 혹은 그 객체가 저장된 주소 값을 반환할 수 있는데, 우리는 객체를 반환하도록 +연산자를 오버로딩할 것이다.

  • 문자열을 덧붙이는 += 연산자의 오버로딩
  • 내용 비교를 진행하는 == 연산자의 오버로딩
  • <<, >> 연산자의 오버로딩

String 클래스의 완성

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

class String
{
private:
    char * str;
    int len;
public:
    String()  //디폴트 값 설정
    {
        len = 0;
        str = NULL;
    }
    String(const char * c)  //생성자의 오버로딩
    {
        len = strlen(c+1);
        str = new char[len];
        strcpy(str, c);
    }
    String(const String& ref)   //복사 생성자
    {
        len = strlen(ref.str);
        str = new char[len];
        strcpy(str, ref.str);
    }
    String& operator=(const String& ref)    //대입 연산자
    {
        delete []str;
        len = strlen(ref.str);
        str = new char[len];
        strcpy(str, ref.str);
        return *this;
    }
    String& operator+(const String& ref)    //+ 연산자
    {
        len = strlen(str);
        char * chr = new char[len+ref.len];
        strcpy(chr, str);
        strcat(chr, ref.str);
        String temp(chr);
        return temp;
    }
    String& operator+=(const String& ref)   //+=연산자
    {
        len = strlen(str);
        char * chr = new char[len+ref.len];
        strcpy(chr, str);
        strcat(chr, ref.str);
        str = chr;
        return *this;
    }

    bool operator==(const String& ref)  //==연산자
    {
        if(str == ref.str)
            return 1;
        else 
            return 0;
    }
    ~String()   //소멸자
    {
        delete []str;
    }
    friend ostream& operator<<(ostream&,const String&);
    friend istream& operator>>(istream&,const String&);
};

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

istream& operator>>(istream& is,const String& ref)
{
    is>>ref.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;
}
I like 
string class
I like string class
동일 문자열!
문자열 입력: goooooooooooood
입력한 문자열: goooooooooooood

 

 

 

+ 직접 구현하는 데에 상당히 애먹었다. 혼자서 코드 짜는 연습을 더 해봐야 될 거 같다.


출처 : 윤성우, <윤성우의 열혈 C++ 프로그래밍>, 오렌지미디어, 2010.05.12