반응형
공부를 하기 위해 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 != NULL) delete []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) == 0) return 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
반응형
'<개인공부> > [C++]' 카테고리의 다른 글
[C++] vector container 정리 및 사용법 (41) | 2017.07.20 |
---|---|
[C++] STL 이란. (0) | 2017.07.19 |
[C++] Pair 클래스 정리 및 예제 (vector, sort) (3) | 2017.07.18 |
[C++] 예외처리 (Exception Handling, try catch) (3) | 2017.07.14 |
[C++] template(템플릿)에 관하여 2 (클래스 템플릿, 템플릿 특수화) (0) | 2017.07.12 |
[C++] template(템플릿) 에 관하여 1 (템플릿이란, 함수 템플릿) (20) | 2017.07.11 |
[C++] string 클래스 변환(atoi, c_str()) 등 정리 (5) | 2017.07.11 |
[C++] string 클래스 정리 (0) | 2017.07.10 |