28-4.¹®ÀÚ¿­ Ŭ·¡½º

28-4-°¡.Str Ŭ·¡½º

¿¬»êÀÚ ¿À¹ö·ÎµùÀÇ Á¾ÇÕ ½Ç½ÀÆíÀ¸·Î ¹®ÀÚ¿­À» °ü¸®ÇÏ´Â Str Ŭ·¡½º¸¦ ÀÛ¼ºÇØ º¸ÀÚ. C´Â ¹®ÀÚ¿­À» ±âº» ŸÀÔÀ¸·Î Á¦°øÇÏÁö ¾Ê°í ¹®ÀÚÇü ¹è¿­·Î Ç¥ÇöÇϱ⠶§¹®¿¡ ´ëÀÔ, ¿¬°á, ºñ±³, Ãß°¡ µîÀÇ ¸ðµç ¿¬»êÀ» ÇÔ¼ö·Î¸¸ ÇØ¾ß ÇÑ´Ù. ±âº» ŸÀÔ°ú ³í¸®ÀûÀ¸·Î °°Àº ¿¬»êÀ» Çϴµ¥µµ ºÒ±¸ÇÏ°í ¿¬»êÀÚ¸¦ ¾µ ¼ö ¾ø¾î ¹«Ã´ ºÒÆíÇÒ »Ó¸¸ ¾Æ´Ï¶ó ¹è¿­ÀÇ °æ°è¸¦ ³Ñ¾î¼­´Â À§Ç輺À» Ç×»ó °¡Áö°í ÀÖ´Ù.

±×·¡¼­ C++¿¡¼­´Â º¸Åë ¹®ÀÚ¿­À» Ŭ·¡½º·Î ÀÛ¼ºÇϴµ¥ ÀÌ Å¬·¡½º´Â ¹®ÀÚ¿­ Ç¥Çö¿¡ ÇÊ¿äÇÑ ¸ðµç ¸â¹ö¸¦ Æ÷ÇÔÇϰí ÀÖÀ¸¸ç ¹®ÀÚ¿­ÀÇ ±æÀÌ¿¡ µû¶ó ¹è¿­À» ÀÚµ¿À¸·Î ´Ã¸®´Â Æí¸®ÇÑ ±â´É±îÁö °¡Áö°í ÀÖ´Ù. ¶ÇÇÑ ´Ù¾çÇÑ ¿¬»êÀÚ¸¦ ¹®ÀÚ¿­¿¡ ´ëÇØ Á÷Á¢ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇÏ¿© ±âº» ŸÀÔ°ú ¶È°°Àº ¹æ¹ýÀ¸·Î ¹®ÀÚ¿­À» ´Ù·ê ¼ö ÀÖ´Ù.

¿©±â¼­ ¸¸µé¾î º¼ ¹®ÀÚ¿­ Ŭ·¡½º´Â ¾îµð±îÁö³ª ½Ç½À¿ëÀ¸·Î¼­ Àǹ̰¡ ÀÖÀ» »ÓÀÌÁö ½ÇÁ¦ »ç¿ëÀ» ¸ñÀûÀ¸·Î Çϱ⿡´Â ¼º´É»óÀ¸·Î º¸³ª Á¦°øÇÏ´Â ±â´ÉÀ¸·Î º¸³ª ¸¹ÀÌ ºÎÁ·ÇÏ´Ù. ¿ì¸®°¡ Á÷Á¢ ÀÌ·± Ŭ·¡½º¸¦ ¸¸µéÁö ¾Ê´õ¶óµµ ´õ Àß ¸¸µé¾îÁø ¹®ÀÚ¿­ Ŭ·¡½ºµéÀÌ ¾ó¸¶µçÁö Àִµ¥ STLÀº stringÀ», MFC´Â CStringÀ» °¢°¢ Á¦°øÇϰí ÀÖ´Ù. ½Ç¹«¿¡¼­´Â ÀÌ·± Àß ¸¸µé¾îÁø °ËÁõµÈ Ŭ·¡½º¸¦ ¾²µÇ ÀÌ·± Ŭ·¡½ºµéÀÇ ³»ºÎ°¡ ¾î¶°ÇÒÁö¸¦ ÀÌ ½Ç½ÀÀ» ÅëÇØ ¿¬±¸ÇØ º¸µµ·Ï ÇÏÀÚ.

½Ç½À¿ëÀ¸·Î ¸¸µé Ŭ·¡½ºÀÇ À̸§Àº StrÀ̶ó´Â ªÀº À̸§À¸·Î Á¤Çß´Ù. ´ÙÀ½ ¼Ò½º¿¡´Â Str Ŭ·¡½ºÀÇ ¼±¾ð°ú ¸â¹ö ÇÔ¼ö, ¿¬»êÀÚ ÇÔ¼öÀÇ ¸ðµç Äڵ尡 Æ÷ÇԵǾî ÀÖÀ¸¸ç main¿¡´Â ÀÌ Å¬·¡½º°¡ Àß µ¿ÀÛÇÏ´ÂÁö¸¦ Å×½ºÆ®ÇÏ´Â Äڵ嵵 Æ÷ÇԵǾî ÀÖ´Ù. ¿øÄ¢´ë·Î ÇÏÀÚ¸é Çì´õ ÆÄÀϰú ±¸Çö ÆÄÀÏÀ» ³ª´©¾î¾ß ÇÏÁö¸¸ ½Ç½ÀÀÇ ÆíÀǼºÀ» À§ÇØ ÇÑ ¸ðµâ¿¡ ¸ðµç ¼Ò½º¸¦ ÀÛ¼ºÇß´Ù.

 

¿¹ Á¦ : Str

#include <Turboc.h>

#include <iostream>

using namespace std;

 

class Str

{

     friend ostream &operator <<(ostream &c, const Str &S);

     friend const Str operator +(const char *ptr,Str &s);

     friend bool operator ==(const char *ptr,Str &s);

     friend bool operator !=(const char *ptr,Str &s);

     friend bool operator >(const char *ptr,Str &s);

     friend bool operator <(const char *ptr,Str &s);

     friend bool operator >=(const char *ptr,Str &s);

     friend bool operator <=(const char *ptr,Str &s);

protected:

     char *buf;

     int size;

 

public:

     Str();

     Str(const char *ptr);

     Str(const Str &Other);

     explicit Str(int num);

     virtual ~Str();

 

     int length() const { return strlen(buf); }

     Str &operator =(const Str &Other);

     Str &operator +=(Str &Other);

     Str &operator +=(const char *ptr);

     char &operator [](int idx) { return buf[idx]; }

     const char &operator [](int idx) const { return buf[idx]; }

     operator const char *() { return (const char *)buf; }

     operator int() { return atoi(buf); }

     const Str operator +(Str &Other) const;

     const Str operator +(const char *ptr) const { return *this+Str(ptr); }

     bool operator ==(Str &Other) { return strcmp(buf,Other.buf)==0; }

     bool operator ==(const char *ptr) { return strcmp(buf,ptr)==0; }

     bool operator !=(Str &Other) { return strcmp(buf,Other.buf)!=0; }

     bool operator !=(const char *ptr) { return strcmp(buf,ptr)!=0; }

     bool operator >(Str &Other) { return strcmp(buf,Other.buf)>0; }

     bool operator >(const char *ptr) { return strcmp(buf,ptr)>0; }

     bool operator <(Str &Other) { return strcmp(buf,Other.buf)<0; }

     bool operator <(const char *ptr) { return strcmp(buf,ptr)<0; }

     bool operator >=(Str &Other) { return strcmp(buf,Other.buf)>=0; }

     bool operator >=(const char *ptr) { return strcmp(buf,ptr)>=0; }

     bool operator <=(Str &Other) { return strcmp(buf,Other.buf)<=0; }

     bool operator <=(const char *ptr) { return strcmp(buf,ptr)<=0; }

     void Format(const char *fmt,...);

};

 

// µðÆúÆ® »ý¼ºÀÚ

Str::Str()

{

     size=1;

     buf=new char[size];

     buf[0]=0;

}

 

// ¹®ÀÚ¿­·ÎºÎÅÍ »ý¼ºÇϱâ

Str::Str(const char *ptr)

{

     size=strlen(ptr)+1;

     buf=new char[size];

     strcpy(buf,ptr);

}

 

// º¹»ç »ý¼ºÀÚ

Str::Str(const Str &Other)

{

     size=Other.length()+1;

     buf=new char[size];

     strcpy(buf,Other.buf);

}

 

// Á¤¼öÇü º¯È¯ »ý¼ºÀÚ

Str::Str(int num)

{

     char temp[128];

 

     itoa(num,temp,10);

     size=strlen(temp)+1;

     buf=new char[size];

     strcpy(buf,temp);

}

 

// ÆÄ±«ÀÚ

Str::~Str()

{

     delete [] buf;

}

 

// ´ëÀÔ ¿¬»êÀÚ

Str &Str::operator =(const Str &Other)

{

     if (this != &Other) {

          size=Other.length()+1;

          delete [] buf;

          buf=new char[size];

          strcpy(buf,Other.buf);

     }

     return *this;

}

 

// º¹ÇÕ ¿¬°á ¿¬»êÀÚ

Str &Str::operator +=(Str &Other)

{

     char *old;

     old=buf;

     size+=Other.length();

     buf=new char[size];

     strcpy(buf,old);

     strcat(buf,Other.buf);

     delete [] old;

     return *this;

}

 

Str &Str::operator +=(const char *ptr)

{

     return *this+=Str(ptr);

}

 

// ¿¬°á ¿¬»êÀÚ

const Str Str::operator +(Str &Other) const

{

     Str T;

 

     delete [] T.buf;

     T.size=length()+Other.length()+1;

     T.buf=new char[T.size];

     strcpy(T.buf,buf);

     strcat(T.buf,(const char *)Other);

     return T;

}

 

// Ãâ·Â ¿¬»êÀÚ

ostream &operator <<(ostream &c, const Str &S)

{

     c << S.buf;

     return c;

}

 

// ´õÇÏ±â ¹× °ü°è ¿¬»êÀÚ

const Str operator +(const char *ptr,Str &s) { return Str(ptr)+s;}

bool operator ==(const char *ptr,Str &s) { return strcmp(ptr,s.buf)==0;}

bool operator !=(const char *ptr,Str &s) { return strcmp(ptr,s.buf)!=0;}

bool operator >(const char *ptr,Str &s) { return strcmp(ptr,s.buf)>0;}

bool operator <(const char *ptr,Str &s) { return strcmp(ptr,s.buf)<0;}

bool operator >=(const char *ptr,Str &s) { return strcmp(ptr,s.buf)>=0;}

bool operator <=(const char *ptr,Str &s) { return strcmp(ptr,s.buf)<=0;}

 

// ¼­½Ä Á¶¸³ ÇÔ¼ö

void Str::Format(const char *fmt,...)

{

     char temp[1024];

     va_list marker;

    

     va_start(marker, fmt);

     vsprintf(temp,fmt,marker);

     *this=Str(temp);

}

 

void main()

{

     Str s="125";

     int k;

     k=(int)s+123;

 

     Str s1("¹®ÀÚ¿­");      // ¹®ÀÚ¿­·Î »ý¼ºÀÚ

     Str s2(s1);                   // º¹»ç »ý¼ºÀÚ

     Str s3;                    // µðÆúÆ® »ý¼ºÀÚ

     s3=s1;                    // ´ëÀÔ ¿¬»êÀÚ

 

     // Ãâ·Â ¿¬»êÀÚ

     cout << "s1=" << s1 << ",s2=" << s2 << ",s3=" << s3 << endl;

     cout << "±æÀÌ=" << s1 << endl;

 

     // Á¤¼öÇü º¯È¯ »ý¼ºÀÚ¿Í º¯È¯ ¿¬»êÀÚ

     Str s4(1234);

     cout << "s4=" << s4 << endl;

     int num=int(s4)+1;

     cout << "num=" << num << endl;

 

     // ¹®ÀÚ¿­ ¿¬°á Å×½ºÆ®

     Str s5="First";

     Str s6="Second";

     cout << s5+s6 << endl;

     cout << s6+"Third" << endl;

     cout << "Zero"+s5 << endl;

     cout << "s1Àº "+s1+"À̰í s5´Â "+s5+"ÀÌ´Ù." << endl;

     s5+=s6;

     cout << "s5¿Í s6À» ¿¬°áÇϸé " << s5 << "ÀÌ´Ù." << endl;

     s5+="Concatination";

     cout << "s5¿¡ ¹®ÀÚ¿­À» µ¡ºÙÀ̸é " << s5 << "ÀÌ´Ù." << endl;

 

     // ºñ±³ ¿¬»êÀÚ Å×½ºÆ®

     if (s1 == s2) {

          cout << "µÎ ¹®ÀÚ¿­Àº °°´Ù." << endl;

     } else {

          cout << "µÎ ¹®ÀÚ¿­Àº ´Ù¸£´Ù." << endl;

     }

 

     // char *Çü°úÀÇ ¿¬»ê Å×½ºÆ®

     Str s7;

     s7="»ó¼ö ¹®ÀÚ¿­";

     cout << s7 << endl;

     char str[128];

     strcpy(str,s7);

     cout << str << endl;

 

     // ÷ÀÚ ¿¬»êÀÚ Å×½ºÆ®

     Str s8("Index");

     cout << "s8[2]=" << s8[2] << endl;

     s8[2]='k';

     cout << "s8[2]=" << s8[2] << endl;

 

     // ¼­½Ä Á¶¸³ Å×½ºÆ®

     Str sf;

     int i=9876;

     double d=1.234567;

     sf.Format("¼­½Ä Á¶¸³ °¡´ÉÇÏ´Ù. Á¤¼ö=%d, ½Ç¼ö=%.2f",i,d);

     cout << sf << endl;

}

 

½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù. ³ª¸§´ë·Î ±â´ÉÀÌ ¸¹±â ¶§¹®¿¡ ÀÌ°Í Àú°Í Å×½ºÆ®ÇØ º¼ °Ô ¸¹Àº ÆíÀε¥ ¸ðµÎ Á¤È®ÇÏ°Ô Àß µ¿ÀÛÇÑ´Ù.

 

s1=¹®ÀÚ¿­,s2=¹®ÀÚ¿­,s3=¹®ÀÚ¿­

±æÀÌ=¹®ÀÚ¿­

s4=1234

num=1235

FirstSecond

SecondThird

ZeroFirst

s1Àº ¹®ÀÚ¿­À̰í s5´Â FirstÀÌ´Ù.

s5¿Í s6À» ¿¬°áÇϸé FirstSecondÀÌ´Ù.

s5¿¡ ¹®ÀÚ¿­À» µ¡ºÙÀ̸é FirstSecondConcatinationÀÌ´Ù.

µÎ ¹®ÀÚ¿­Àº °°´Ù.

»ó¼ö ¹®ÀÚ¿­

»ó¼ö ¹®ÀÚ¿­

s8[2]=d

s8[2]=k

¼­½Ä Á¶¸³ °¡´ÉÇÏ´Ù. Á¤¼ö=9876, ½Ç¼ö=1.23

 

main ÇÔ¼öÀÇ ÁÖ¼®¿¡ ÀûÈù´ë·Î Str Ŭ·¡½º°¡ °¡Áø(¾ó¸¶ µÇÁø ¾ÊÁö¸¸) ¸ðµç ±â´ÉÀ» ¼ø¼­´ë·Î ºÒ·¯ º¸°í Á¦´ë·Î µ¿ÀÛÇÏ´ÂÁö Å×½ºÆ®ÇØ º¸¾Ò´Ù.