27-5.Ŭ·¡½º ½Ç½À

27-5-°¡.DArray Ŭ·¡½º

19Àå¿¡¼­ °¡Àå ±âÃÊÀûÀÎ ÀÚ·á ±¸Á¶ÀÇ ÇϳªÀÎ µ¿Àû ¹è¿­À» ÀÛ¼ºÇØ º¸¾Ò´Ù. ¸î °³ÀÇ Àü¿ªº¯¼ö¿Í ¹è¿­ °ü¸® ÇÔ¼öµé¸¸ ÀÛ¼ºÇØ ³õÀ¸¸é ½ÇÇàÁß¿¡ Å©±â¸¦ ¿øÇϴ¸¸Å­ ´Ã¸± ¼ö ÀÖÀ¸¸ç ¹è¿­ Áß°£¿¡µµ »ðÀÔ, »èÁ¦°¡ °¡´ÉÇØ¼­ ¿©·¯ ¸ð·Î À¯¿ëÇÏ´Ù. ±×·±µ¥ Àü¿ªº¯¼ö¿Í °ü¸® ÇÔ¼öµéÀÌ Èð¾îÁ® À־ Àç»ç¿ëÇϱⰡ Á¶±Ý ¹ø°Å·Î¿î ¸éÀÌ ÀÖ¾ú´Ù.

¿©±â¼­´Â µ¿Àû ¹è¿­À» ÇϳªÀÇ Å¬·¡½º¾È¿¡ ĸ½¶È­ÇØ º¸±â·Î ÇÏÀÚ. ±¸Á¶Àû ÇÁ·Î±×·¡¹Ö ±â¹ýÀ¸·Î ÀÛ¼ºÇÑ µ¿Àû ¹è¿­ÀÌ ¾î¶»°Ô Ŭ·¡½º·Î º¯È¯µÇ´ÂÁö º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. º°´Ù¸¥ ±â´É Ãß°¡´Â ¾øÀÌ 19Àå¿¡¼­ ¸¸µé¾ú´ø µ¿Àû ¹è¿­À» ±×´ë·Î C++·Î ¿Å±â±â¸¸ ÇÑ´Ù. ´ÙÀ½ÀÌ °á°ú ÄÚµåÀÌ´Ù.

 

¿¹ Á¦ : DArray

#include <Turboc.h>

#include <iostream>

using namespace std;

 

#define ELETYPE int

class DArray

{

protected:

     ELETYPE *ar;

     unsigned size;

     unsigned num;

     unsigned growby;

 

public:

     DArray(unsigned asize=100, unsigned agrowby=10);

     ~DArray();

     void Insert(int idx, ELETYPE value);

     void Delete(int idx);

     void Append(ELETYPE value);

 

     ELETYPE GetAt(int idx) { return ar[idx]; }

     unsigned GetSize() { return size; }

     unsigned GetNum() { return num; }

     void SetAt(int idx, ELETYPE value) { ar[idx]=value; }

     void Dump(char *sMark);

};

 

DArray::DArray(unsigned asize, unsigned agrowby)

{

     size=asize;

     growby=agrowby;

     num=0;

     ar=(ELETYPE *)malloc(size*sizeof(ELETYPE));

}

 

DArray::~DArray()

{

     free(ar);

}

 

void DArray::Insert(int idx, ELETYPE value)

{

     unsigned need;

 

     need=num+1;

     if (need > size) {

          size=need+growby;

          ar=(ELETYPE *)realloc(ar,size*sizeof(ELETYPE));

     }

     memmove(ar+idx+1,ar+idx,(num-idx)*sizeof(ELETYPE));

     ar[idx]=value;

     num++;

}

 

void DArray::Delete(int idx)

{

     memmove(ar+idx,ar+idx+1,(num-idx-1)*sizeof(ELETYPE));

     num--;

}

 

void DArray::Append(ELETYPE value)

{

     Insert(num,value);

}

 

void DArray::Dump(char *sMark)

{

     unsigned i;

     cout << sMark << " => Å©±â=" << size << ",°³¼ö=" << num << " : ";

     for (i=0;i<num;i++) {

          cout << GetAt(i) << ' ';

     }

     cout << endl;

}

 

void main()

{

     DArray ar;

     int i;

 

     for (i=1;i<=8;i++) ar.Append(i);ar.Dump("8°³ Ãß°¡");

     ar.Insert(3,10);ar.Dump("10 »ðÀÔ");

     ar.Insert(3,11);ar.Dump("11 »ðÀÔ");

     ar.Insert(3,12);ar.Dump("12 »ðÀÔ");

     ar.Delete(7);ar.Dump("¿ä¼Ò 7 »èÁ¦");

}

 

Ŭ·¡½º À̸§Àº µ¿Àû ¹è¿­À» ÀǹÌÇÏ´Â DArray·Î ºÙ¿´´Ù. Àü¿ªº¯¼ö·Î Á¸ÀçÇÏ´ø ar, size, num, growby µî ¹è¿­ÀÇ ÁÖ¿ä ¼Ó¼º°ªµéÀ» DArray Ŭ·¡½ºÀÇ ¸â¹ö º¯¼ö·Î Æ÷ÇÔ(ĸ½¶È­)Ç쵂 º¸È£ ¿µ¿ª¿¡ ¹èÄ¡ÇÏ¿© ¿ÜºÎ¿¡¼­ ÀÌ °ªÀ» ÇԺηΠ°Çµå¸®Áö ¸øÇϵµ·Ï(Á¤º¸ ÀºÆó) Çß´Ù. ºñ°ø°³ ¿µ¿ª(private)ÀÌ ¾Æ´Ñ º¸È£¿µ¿ª(protected)¿¡ ÀÌ ¸â¹ö¸¦ ¼±¾ðÇÑ °ÍÀº »ó¼ÓÀ» °í·ÁÇØ¼­ÀÌ´Ù.

±¸Á¶Ã¼¸¦ ÃʱâÈ­ÇÏ´ø InitArray ÇÔ¼öÀÇ ±â´ÉÀº »ý¼ºÀÚ·Î ¿Å°ÜÁ³À¸¸ç »ç¿ëÀÚ°¡ ±ô¹Ú ÀØ°í ¹è¿­À» ÃʱâÈ­ÇÏÁö ¾Ê´Â ½Ç¼ö¸¦ ¿øÃµÀûÀ¸·Î Â÷´ÜÇß´Ù. DArray °´Ã¼¸¦ ¸¸µé ¶§ ¹Ýµå½Ã ¹è¿­ÀÇ ÃÖÃÊ ÇÒ´ç Å©±â¿Í ¿©À¯ºÐÀ» ÁöÁ¤ÇØ¾ß ÇÏ¸ç ¸¸¾à »ý·«ÇÒ °æ¿ì µðÆúÆ® Àμö¿¡ µû¶ó 100, 10ÀÌ °­Á¦·Î Àû¿ëµÈ´Ù. ¹è¿­À» ÇØÁ¦ÇÏ´Â ±â´ÉÀº ÆÄ±«ÀÚ·Î ¿Å°ÜÁ³À¸¸ç »ç¿ëÀÚ°¡ Ȥ½Ã¶óµµ UnInitArray È£ÃâÀ» ±î¸Ô´õ¶óµµ ¸Þ¸ð¸® ´©¼ö´Â ¹ß»ýÇÏÁö ¾Ê´Â´Ù.

³ª¸ÓÁö Insert, Delete, Append ÇÔ¼öÀÇ ÄÚµå´Â 19ÀåÀÇ ¿¹Á¦¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇÏ¸ç ¹è¿­ÀÇ ³»¿ëÀ» Ãâ·ÂÇÏ´Â Dump ÇÔ¼ö¸¸ ¾à°£ ¼öÁ¤Çß´Ù. printf·Î´Â ÀÓÀÇÀÇ Å¸ÀÔÀ» Ãâ·ÂÇÒ ¼ö ¾øÀ¸¸ç ŸÀÔ¿¡ µû¶ó %d, %f µî ¼­½ÄÀ» ¹Ù²ã¾ß ÇÏ´Â ºÒÆíÇÔÀÌ ÀÖÀ¸¹Ç·Î Á» ´õ ¹ü¿ëÀûÀÌ°í °´Ã¼ ÁöÇâÀûÀÎ coutÀ¸·Î Ãâ·Â ¹æ¹ýÀ» ¹Ù²Ù¾ú´Ù. ÂüÁ¶ÇÏ´Â ´ë»óÀÌ Àü¿ªº¯¼ö°¡ ¾Æ´Ï¶ó °´Ã¼ÀÇ ¸â¹ö º¯¼öÀ̹ǷΠÀÌÁ¦ ¿©·¯ °³ÀÇ µ¿Àû ¹è¿­À» µ¿½Ã¿¡ »ç¿ëÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. main¿¡¼­´Â DArray °´Ã¼ arÀ» ¼±¾ðÇϰí ÀÌ ¹è¿­¿¡ °ªÀ» Ãß°¡, »ðÀÔ, »èÁ¦ÇØ º¸¾Ò´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.

 

        8°³ Ãß°¡ => Å©±â=100,°³¼ö=08 :  1  2  3  4  5  6  7  8

         10 »ðÀÔ => Å©±â=100,°³¼ö=09 :  1  2  3 10  4  5  6  7  8

         11 »ðÀÔ => Å©±â=100,°³¼ö=10 :  1  2  3 11 10  4  5  6  7  8

         12 »ðÀÔ => Å©±â=100,°³¼ö=11 :  1  2  3 12 11 10  4  5  6  7  8

     ¿ä¼Ò 7 »èÁ¦ => Å©±â=100,°³¼ö=10 :  1  2  3 12 11 10  4  6  7  8

 

°´Ã¼¸¦ ¾²Áö ¾Ê¾ÒÀ» ¶§¿Í °á°ú´Â µ¿ÀÏÇÏ´Ù. ÇÏÁö¸¸ Äڵ带 ºñ±³ÇØ º¸¸é °´Ã¼ ¹öÀüÀÌ ÈξÀ ´õ »ç¿ëÇϱ⠽±°í ¾ÈÁ¤ÀûÀ̶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ÀûÀýÇÏ°Ô Á¤º¸¸¦ ÀºÆóÇϰí ÀÖ°í °´Ã¼¸¦ »ý¼ºÇÏ´Â °Í¸¸À¸·Î µ¿Àû ¹è¿­ÀÌ ÃʱâÈ­µÇ¸ç ¸â¹ö ÇÔ¼öµµ ÈξÀ ´õ Á÷°üÀûÀÌ´Ù. ¶ÇÇÑ DArray.h Çì´õ ÆÄÀÏ¿¡ Ŭ·¡½º¸¦ ¼±¾ðÇϰí DArray.cpp ±¸Çö ÆÄÀÏ¿¡ ¸â¹ö ÇÔ¼ö¸¦ ÀÛ¼ºÇØ ³õÀ¸¸é ÀÌ µÎ ÆÄÀϸ¸ º¹»çÇÔÀ¸·Î½á ÀÓÀÇÀÇ ÇÁ·ÎÁ§Æ®¿¡¼­ DArray¸¦ Àç»ç¿ëÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ °¢ °´Ã¼°¡ ar, size, num µûÀ§ÀÇ µ¿Àû ¹è¿­ °ü¸®¿¡ ÇÊ¿äÇÑ ¸ðµç ¸â¹ö¸¦ °¡Áö°í ÀÖÀ¸¹Ç·Î µÎ °³ ÀÌ»óÀÇ µ¿Àû ¹è¿­À» µ¿½Ã¿¡ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ÀÌ º¯¼öµéÀÌ Àü¿ªÀ̾úÀ» ¶§´Â ´Ü ÇϳªÀÇ µ¿Àû ¹è¿­¸¸ »ç¿ëÇÒ ¼ö ÀÖ¾ú´Ù.

¹°·Ð ¿©±â¼­ ¸¸µç DArray´Â ±â´ÉÀûÀ¸·Î ¿Ïº®ÇÏÁö´Â ¾Ê¾Æ¼­ ½Ç¿ëÀûÀ¸·Î ¾²±â¿¡´Â ¾ÆÁ÷µµ ºÎÁ·ÇÑ Á¡ÀÌ ¸¹´Ù. ¿ì¼± ¾ÆÁ÷µµ ¿ä¼ÒÀÇ Å¸ÀÔÀ» ÁöÁ¤Çϱâ À§ÇØ ELETYPEÀ̶ó´Â ¸ÅÅ©·Î¸¦ »ç¿ëÇÑ´Ù´Â Á¡ÀÌ Á¶±Ý ¸ø¸¶¶¥Çѵ¥ ÀÌ ¸ÅÅ©·ÎÀÇ ¿ªÇÒÀº Â÷ÈÄ ÅÛÇø´À¸·Î ´ëüÇÒ ¼ö ÀÖ´Ù. ¹è¿­³¢¸® º¹»ç, ¿¬°áÇÏ´Â ±â´É, °Ë»ö, Á¤·Ä µîÀÇ ´Ù¾çÇÑ ±â´Éµéµµ ´õ ¿ä±¸µÇ´Âµ¥ ¸â¹ö ÇÔ¼ö¸¦ ´Ã¸®±â¸¸ Çϸé ÀÌ·± ±â´ÉÀº ½±°Ô È®ÀåÇÒ ¼ö ÀÖ´Ù.

¶ÇÇÑ ¾ÆÁ÷ malloc, free ÇÔ¼ö¸¦ »ç¿ëÇϱ⠶§¹®¿¡ ´Ü¼ø ŸÀÔÀÇ ¹è¿­À» ´Ù·ê ¼ö´Â ÀÖÁö¸¸ °´Ã¼ÀÇ ¹è¿­À» ´Ù·ç±â¿¡´Â ºÎÀûÀýÇÏ´Ù. °´Ã¼ÀÇ ¹è¿­À» ´Ù·ê ¼ö ÀÖµµ·Ï ÇÏ·Á¸é new/delete ¿¬»êÀÚ·Î ÇÒ´ç ¹× ÇØÁ¦ÇØ¾ß ÇÏ¸ç »ðÀÔÇÒ ¶§ »ý¼ºÀÚ¸¦ È£ÃâÇÏ°í »èÁ¦ÇÒ ¶§ ÆÄ±«ÀÚ¸¦ È£ÃâÇØ¾ß ÇÑ´Ù.

 

 DArrayCopy

DArray ¿¹Á¦ÀÇ main ÇÔ¼ö ³¡¿¡ ´ÙÀ½ µÎ ÁÙÀ» »ðÀÔÇØ º¸¾Æ¶ó.

 

void main()

{

     ....

     DArray ar2=ar;

     ar2.Dump("º¹»çÇØ¼­ ¸¸µç ar2 °´Ã¼");

}

 

ar°´Ã¼·ÎºÎÅÍ ar2¸¦ ¸¸µç ÈÄ Ãâ·ÂÇØ º¸¾Ò´Ù. Ãâ·ÂÀº Á¦´ë·Î µÇÁö¸¸ ÇÁ·Î±×·¥ÀÌ Á¾·áÇÒ ¶§ ´Ù¿îµÇ´Âµ¥ ¹®Á¦ÀÇ ¿øÀÎÀ» ¼³¸íÇÏ°í ´Ù¿îµÇÁö ¾Êµµ·Ï ÇØ°áÇØ º¸¾Æ¶ó.