<개인공부>/[C++]

[C++] string 클래스 만들어보기.

사용자 BlockDMask 2017. 7. 10. 15:16
반응형
  • 공부를 하기 위해 String class 을 직접 만들어 보았습니다.

0) 설명 (Intro)
  • C++을 학습하다가 String 클래스를 직접 만들어 보는 실습이 있어서 작성하게 되었습니다.
  • char * , 동적할당을 이용하여서 만들었습니다.
  • string s1("문자열") 과 string s1 = "문자열" 을 통하여 문자열을 초기화 및 입력이 가능하도록 하였습니다.
  • 또한 string의 덧셈(+), 더하고 대입(+=), 출력(<<), 입력(>>), 비교(==)를 연산자 오버로딩(operator)을 통하여 만들었습니다.
1) 코드 (Code)


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <iostream>
#include <cstring>
 
using namespace std;
 
class myString{
private:
    char * str;        
    int len;
public:
    myString(){
        str = NULL;
        len =0;
    }
    
    myString(const myString& ms){
        len = ms.len;
        str = new char[len];
        strcpy(str, ms.str);
    }
    
    myString(const char * str){
        len = (int)strlen(str) + 1;    
        this->str = new char[len];
        strcpy(this->str, str);    
 
    }
    
 
//혹시 지금 새로 문자열이 들어갈 객체에 str이 할당되어있을지 모르니, 문자열 할당 해제. 
//파라미터로 들어온 문자열을 자기자신에게 복사 후 return 
    myString& operator=(const myString& ms){
        if(str != NULL)    delete []str;
        
 
        len = ms.len;
        str = new char[len];
        strcpy(str, ms.str);
        return *this;
    }
    
//문자열 덧셈 : 문자열을 새로 만들고, 만든 문자열에 문자열을 더해서 넣음.
//새로운 객체를 tmpstr을 이용하여 새로 만들고 반환한다. tmpstr은 메모리 해제.
    myString operator+(const myString & ms){
        char * tmpstr = new char[len + ms.len -1];
        strcpy(tmpstr, str);
        strcat(tmpstr, ms.str);        
        myString tmpString(tmpstr);
        delete []tmpstr;
        return tmpString;
    }
    
    
//자기 자신과 문자열 덧셈. 
    myString& operator+=(const myString& ms){
        if(str == NULL) exit(1); //error 
 
        char* tmpstr = new char[len + ms.len -1]; //tmpstr에 문자열 복사 후 붙임. 
        strcpy(tmpstr, str);
        strcat(tmpstr, ms.str);
        
        len = strlen(tmpstr);
        if(str != NULLdelete []str;
        str = new char[len];    
        strcpy(str,tmpstr); //붙인 문자열을 str에 넣고  
        delete []tmpstr; //tmpstr은 메모리 할당 해제. 
        
        return *this;
    }
    
//문자열 비교 strcmp를 이용한다.
    bool operator==(const myString& ms){
        if(strcmp(str, ms.str) == 0return true
        
        return false;
    }
    
    friend ostream& operator<<(ostream& os, const myString& ms);
    friend istream& operator>>(istream& is, myString& ms);
    
    ~myString(){
        if(str != NULL)
            delete []str;
    }
    
};
 
ostream& operator<<(ostream& os, const myString& ms){
    os << ms.str;
    return os;
}
 
istream& operator>>(istream& is, myString& ms){
    char str[100];
    is >> str;
    ms = myString(str);
    return is;
}
 
int main(){
    myString s1 = "Show Me The ";
    myString s2 = "Money 6 ";
    myString s3 = "Dok2 ";                        
    myString s4 = "Tiger JK";            
    myString s5 = "Dok2 Tiger JK";
    myString s6 = "Legend : ";
    myString s7 = "RapStar : ";
    myString tmp = "123";
    
    
    //test1 : 객체가 동일한지.
    //Expect Result : false 
    if(s1 == s2){
        cout << "true" << endl;
    }else{
        cout << "false" << endl;
    }
    
    
    //test2 : 덧셈값과 같은지 (덧셈의 return인 임시객체가 제대로 비교되는지) 
    //Expect Result : true 
    if(s3+s4 == s5){
        cout << "true" << endl;
    }else{
        cout << "false" << endl;
    }
 
    //test3 : 덧셈 출력. 
    //Expect Result : "Show Me The Money 6 "
    tmp = s1 + s2;
    cout << tmp << endl;
    
    //test4 : 대입 
    ////Expect Result : "Dok2 "
    tmp = s3;
    cout << tmp << endl;
    
    //test5 : 2중 덧셈. 
    //Expect Result : "Show Me The Money 6 Dok2 "
    tmp = s1 + s2 + s3;
    cout << tmp << endl;
    
    //test6 : 자기자신과 덧셈 "+=" 
    //Expect Result : "Legend : Tiger JK"
    s6 += s4;
    cout << s6 << endl;
    
    
    //test7 : 자기자신과 덧셈 "+=" 
    //Expect Result : "RapStar : Dok2 "
    cout << s7 + s3 << endl;
    
    //test8 : 복사생성자 테스트.
    //Expect Result : "Tiger JK"
    myString tmp1 = s4;
    cout << tmp1 << endl
    
    //test9 : 입력 테스트
    //Expect Result : 입력값.
    myString tmp2;
    cout << "insert : ";
    cin >> tmp2;
    cout << "result : " << tmp2 << endl;
        
    return 0;
}
 
cs

2) 결과 (Actual Result)



**C++ 도서를 공부하다가, 스스로 String 클래스를 만들어보라고 하여서 작성하고 올렸습니다. 책에도 코드가 나와있지만, 제가 작성한 코드입니다.
**참고 서적 : 윤성우, 『열혈 C++ 프로그래밍』, 오렌지미디어, 2010.05.12


반응형