이제 자신의 string 클래스의 멤버 메서드를 하나 하나 구현해 보기로 해요.
제일 먼저 생성자를 구현합시다.
string::string(const char *buf) { 먼저 입력 인자가 0(널 포인터)일 때 빈 문자열을 보관할 버퍼를 생성해서 빈 문자열을 복사하세요. if(buf==0)//입력 인자가 0(널 포인터)일 때 { this->buf = new char[1];//크기가 1인 버퍼를 생성 strcpy_s(this->buf,1,""); //공백 문자를 대입 } 입력 인자가 0(널 포인터)가 아닐 때는 입력 문자열 길이를 구하여 버퍼를 생성하고 문자열을 복사하세요. else//입력 인자가 0(널 포인터)가 아닐 때 { int len_p1 = strlen(buf)+1; //입력 문자열의 길이 + 1 을 구함 this->buf = new char[len_p1]; //버퍼 생성 strcpy_s(this->buf,len_p1,buf); //문자열 복사 } }
비교 연산자 중복 정의에서는 strcmp 함수를 이용하여 구현하세요.
bool string::operator==(const string &src)const { return strcmp(buf,src.buf)==0; } bool string::operator!=(const string &src)const { return strcmp(buf,src.buf)!=0; } bool string::operator>(const string &src)const { return strcmp(buf,src.buf)>0; } bool string::operator>=(const string &src)const { return strcmp(buf,src.buf)>=0; } bool string::operator<(const string &src)const { strcmp(buf,src.buf)<0; } bool string::operator<=(const string &src)const { strcmp(buf,src.buf)<=0; }
개체 정보를 출력하는 view 메서드에서는 buf의 내용을 출력합니다.
void string::view(ostream &os)const { os<<buf; }
문자열 버퍼의 주소를 반환하는 메서드에서는 buf를 반환하면 되겠죠.
const char *string::c_str()const { return buf; }
개체 출력자를 위한 전역 <<연산자 중복 정의 메서드에서는 view 메서드를 호출합니다.
ostream &operator<<(ostream &os,const string &src) { src.view(os); return os; } istream &operator>>(istream &is,string &src) { 문자열 정보를 입력받는 전역>>연산자 중복 정의 메서드에서는 지역 변수로 문자열을 입력받을 버퍼를 선언하여 문자열을 입력받습니다. char buf[256]; cin>>buf; 그리고 src 문자열의 버퍼는 메모리 해제하세요. delete [] src.buf; 그리고 입력받은 버퍼의 문자열 길이를 계산하여 src 개체의 버퍼를 생성하고 문자열을 복사하세요. int len_p1 = strlen(buf)+1; //입력 문자열의 길이 + 1 을 구함 src.buf = new char[len_p1]; //버퍼 생성 strcpy_s(src.buf,len_p1,buf); //문자열 복사 return is; }
이제 테스트를 해 보세요. 다음은 전체 코드입니다.
//mystring.h #pragma once #include <iostream> using std::ostream; using std::istream; using std::cin; using std::cout; class string { char *buf; public: string(const char *buf=0); bool operator==(const string &src)const; bool operator!=(const string &src)const; bool operator>(const string &src)const; bool operator>=(const string &src)const; bool operator<(const string &src)const; bool operator<=(const string &src)const; void view(ostream &os=cout)const; const char *c_str()const; friend ostream &operator<<(ostream &os,const string &src); friend istream &operator>>(istream &is,string &src); };
//mystring.cpp #include "mystring.h" #include <string.h> string::string(const char *buf) { if(buf==0)//입력 인자가 0(널 포인터)일 때 { this->buf = new char[1];//크기가 1인 버퍼를 생성 strcpy_s(this->buf,1,""); //공백 문자를 대입 } else//입력 인자가 0(널 포인터)가 아닐 때 { int len_p1 = strlen(buf)+1; //입력 문자열의 길이 + 1 을 구함 this->buf = new char[len_p1]; //버퍼 생성 strcpy_s(this->buf,len_p1,buf); //문자열 복사 } } bool string::operator==(const string &src)const { return strcmp(buf,src.buf)==0; } bool string::operator!=(const string &src)const { return strcmp(buf,src.buf)!=0; } bool string::operator>(const string &src)const { return strcmp(buf,src.buf)>0; } bool string::operator>=(const string &src)const { return strcmp(buf,src.buf)>=0; } bool string::operator<(const string &src)const { return strcmp(buf,src.buf)<0; } bool string::operator<=(const string &src)const { return strcmp(buf,src.buf)<=0; } void string::view(ostream &os)const { os<<buf; } const char *string::c_str()const { return buf; } ostream &operator<<(ostream &os,const string &src) { src.view(os); return os; } istream &operator>>(istream &is,string &src) { char buf[256]; cin>>buf; delete [] src.buf; int len_p1 = strlen(buf)+1; //입력 문자열의 길이 + 1 을 구함 src.buf = new char[len_p1]; //버퍼 생성 strcpy_s(src.buf,len_p1,buf); //문자열 복사 return is; }
//Program.cpp //string 클래스 흉내내기 #include "mystring.h" #include <iostream> using std::cout; using std::endl; using std::cin; int main() { string s; string s2="hello"; if(s == s2) { cout<<"서로 같다."<<endl; } else { cout<<"서로 다르다."<<endl; } s = s2; cout<<s<<endl; if(s == s2) { cout<<"서로 같다."<<endl; } else { cout<<"서로 다르다."<<endl; } const char *buf = s.c_str(); cout<<"버퍼:"<<buf<<endl; cout<<"문자열:"; cin>>s; cout<<"입력한 내용은 "<<s<<endl; return 0; }
▷ 실행 화면
서로 다르다.
hello
서로 같다.
버퍼:hello
문자열:yahoo
입력한 내용은 yahoo
이 외에도 STL의 string 클래스는 다양한 멤버를 제공하고 있습니다. 보다 비슷하게 만들다 보면 STL의 string 클래스를 이해할 수 있을 거예요.