본문 바로가기

Programing/C++

[C++][Study] 내가 만드는 String 문자열

728x90
반응형

string 클래스를 직접 만들어, 우리가 string a = "a" 이렇게 쉽게 작성했던 것들이 어떻게 동작하는지 이해를 해보고자 한다.

 

먼저 정의 부분은 다음과 같다.

#include <iostream>

class string {
    char *str;
    int len;
public:
    string(char c, int n); // 문자c 가n 개있는문자열로정의 string(const char *s);
    string(const string &s);
    //~string();
    void add_string(const string &s); // str뒤에 s를 붙인다.
    void copy_string(const string &s); // s를 복사한 값을 str에 대입한다.
    int strlen(); // 문자열 길이 리턴
};

변수는 *str과 len이 있다.

1) *str은 문자를 담는 배열로 정의할 것이다.

2) len은 문자열의 길이를 나타낼 변수로 정의할 것이다.

 

 

string(char c, int n); // 문자c 가n 개있는문자열로정의 string(const char *s);
string(const string &s);

생성자와 복사 생성자 이다.

생성자는 문자 c가 n개 있는 문자열로 형식으로 정의한다.

두번째는 복사 생성자다. string s2 = s1 이렇게 정의가 가능하게 해볼려고한다. 이게 주 목적이다.

 

그다음은 함수 구현이다 add_string(), copy_string(), int strlen() 함수이다.

add_string() : str 뒤에 문에 문자열이 붙을수 있게 구현한다.

copy_string() : s의 문자열을 복사하여 str에 대입한다.

int strlen() : 문자열의 길이를 리턴한다.

 

이제 정의된 내용들을 구현해보자

 

먼저 생성자 부분이다.

다음과 같이 구현해보았다

문자열 c를 n개 만큼의 공간을 만들고 대입하였고,

복사생성자에서는 s의 문자열과, 길이를 그대로 대입 하는 식으로 구현하였다.

string::string(char c, int n){
    str = new char[n];
    len = n;
    
    for(int i = 0; i < n; i++){
        str[i] = c;
    }
}
string::string(const string &s){
    std::cout << "복사 생성자 호출 " << std::endl;
    str = s.str;
    len = s.len;
}

 

add_string() : str 뒤에 문에 문자열이 붙을수 있게 구현한다.

copy_string() : s의 문자열을 복사하여 str에 대입한다.

int strlen() : 문자열의 길이를 리턴한다.

void string::add_string(const string&s){
    char *temp = new char[len + s.len];
    std::cout << "합쳐진 문자열 : ";
    for(int i = 0; i < len; i++){
        temp[i] = str[i];
        std::cout << temp[i];
    }
    for(int i = 0; i < s.len; i++)
    {
        temp[len + i] = s.str[i];
        std::cout << temp[len + i];
    }
    std::cout << " " << std::endl;
    str = new char[len + s.len];
    str = temp;
    delete[] temp;
}
void string::copy_string(const string &s){
    if(len > s.len){
        str = s.str;
        len = s.len;
    }
    else{
        char *temp = new char[len];
        std::cout << "문자열이 변경되었습니다. 기존 : ";
        for(int i=0; i < len; i++)
        {
            temp[i] = str[i];
            std::cout << temp[i];
        }
        std::cout << "변경 : ";
        len = s.len;
        str = new char[len];
        for(int i =0; i < len; i++ )
        {
            str[i] = s.str[i];
            std::cout << str[i];
        }
    }
}
int string::strlen()
{
    return len;
}

 

이제 main 함수를 구현해서 정상적으로 동작하는 지를 확인해보자.

 

int main(int argc, const char * argv[]) {
    // insert code here...
    string sc('c',15);
    string sa('a', 10);
    
    string sd = sc;
    sa.add_string(sc);
    
    sa.copy_string(sc);
    std::cout << " " << std::endl;
    std::cout << "sc 문자개수 : " << sc.strlen() << std::endl;
    std::cout << "sa 문자개수 : " << sa.strlen() << std::endl;
    
    
    return 0;
}

 

이렇게 잘 동작 하는 것을 볼 수 있다.

 

1) string sd = sc; // 이 문장에서 복사 생성자가 생성이 되었다.

2) sa.add_string(sc)를 통해 sa값에 sc값을 이어 붙인 것을 볼 수 있다.

3) sa.copy_string(sc) // sa값에 sc의 값을 대입하여 분자열이 변경 된 것을 볼 수 있다.

 

이렇게 C++언어를 이용하여 string 문자열 클래스를 만들어 보았다.

생성자, 복사 생성자편을 공부하고 과제가 있어 이것을 풀고 블로그에 남겨 본다.

 

반응형