31-3.ÄÁÅ×À̳Ê

31-3-°¡.TDArray

C++ÀÌ Áö¿øÇÏ´Â ÅÛÇø´ °³³äÀº »ç½Ç ±×´ÙÁö ¾î·ÆÁö ¾Ê´Ù. ÇÏÁö¸¸ ¿©±â¿¡ ±¸Ã¼È­, Ư¼öÈ­, ÅÛÇø´ Áßø, ÇÁ·»µå¿ÍÀÇ °ü°è, Á¤Àû ¸â¹ö µîÀÌ °³ÀÔµÇ¸é »ó´çÈ÷ º¹ÀâÇÑ ¹®¹ýÀÌ ¸¸µé¾îÁö¸ç Ç¥±â¹ýµµ »ý¼ÒÇؼ­ ½±°Ô Àͼ÷ÇØÁö±â ¾î·Æ´Ù. ¶ÇÇÑ Àß ¸¸µé¾î ³õ¾Ò´õ¶óµµ ÅÛÇø´ Ŭ·¡½ºÀÇ Å¸ÀÔÀÌ ±æ°í º¹ÀâÇؼ­ ÄÚµåÀÇ Àǹ̸¦ ¾ó¸¥ ÆľÇÇϱ⵵ ¹«Ã´ ¾î·Æ´Ù. ÀÌ·± º¹À⼺¿¡µµ ºÒ±¸ÇÏ°í C++ÀÌ ÅÛÇø´À» Áö¿øÇÏ´Â ÀÌÀ¯´Â ÄÁÅ×À̳ʸ¦ ¸¸µé±â À§Çؼ­¶ó°í Çصµ °ú¾ðÀÌ ¾Æ´Ï´Ù.

ÄÁÅ×À̳Ê(Container)¶õ °´Ã¼ÀÇ ÁýÇÕÀ» ´Ù·ê ¼ö ÀÖ´Â °´Ã¼ÀÌ´Ù. ½±°Ô ¸»Çؼ­ ¹è¿­À̳ª ¿¬°á ¸®½ºÆ®°°Àº °ÍµéÀ» ÄÁÅ×À̳ʶó°í Çϴµ¥ µ¿ÀÏÇÑ Å¸ÀÔ(¶Ç´Â ȣȯµÇ´Â ŸÀÔ)ÀÇ °´Ã¼µéÀ» ÀúÀåÇϸç ÀÌ·± °´Ã¼µéÀ» °ü¸®ÇÒ ¼ö ÀÖ´Â ±â´ÉÀ» °¡Áö´Â ¶Ç ´Ù¸¥ °´Ã¼ÀÌ´Ù. 2ºÎ¿¡¼­ ¿ì¸®´Â µ¿ÀûÀ¸·Î Å©±â¸¦ º¯°æÇÒ ¼ö ÀÖ´Â µ¿Àû ¹è¿­À» ¸¸µé¾î º» ¹Ù ÀÖÀ¸¸ç ¶ÇÇÑ ¾Õ Àå¿¡¼­ µ¿Àû ¹è¿­ÀÇ ±â´ÉÀ» ĸ½¶È­ÇÑ DArray¶ó´Â Ŭ·¡½ºµµ ÀÛ¼ºÇØ º¸¾Ò´Ù.

ÀÌ Å¬·¡½º°¡ ¹«Ã´ ½Ç¿ëÀûÀ̶ó´Â °ÍÀº °æÇèÇØ º¸¾Æ¼­ ¾Ë °ÍÀÌ°í Ŭ·¡½º·Î ĸ½¶È­ÇÏ¸é »ç¿ëÇϱ⵵ ¹«Ã´ Æí¸®ÇÏ´Ù. ÀÌ·¸°Ô ¸¸µé¾îÁø DArray°¡ ¹Ù·Î ÄÁÅ×À̳ÊÀÌ´Ù. ±×·¯³ª ¾ÆÁ÷ ¾Æ½¬¿òÀÌ Àִµ¥ ¹Ù·Î ELETYPEÀ̶ó´Â ¸ÅÅ©·Î·Î ¹è¿­ ¿ä¼ÒÀÇ Å¸ÀÔÀ» °áÁ¤ÇØ¾ß ÇÑ´Ù´Â Á¡ÀÌ´Ù. DArray Ŭ·¡½º¸¦ »ç¿ëÇϱâ Àü¿¡ ELETYPEÀ» ¿øÇϴ ŸÀÔÀ¸·Î ¹Ù²ã¾ß ÇÏ°í int ¹è¿­°ú double ¹è¿­À» µ¿½Ã¿¡ »ç¿ëÇÒ ¼öµµ ¾ø¾î¼­ È°¿ë¼ºÀÌ Å©°Ô ¶³¾îÁø´Ù.

ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ ¸¸µé¾îÁø ¹®¹ýÀÌ ¹Ù·Î ÅÛÇø´ÀÌ´Ù. ¿ä¼ÒÀÇ Å¸ÀÔÀº °´Ã¼¸¦ ¼±¾ðÇÏ´Â ½ÃÁ¡À¸·Î ¿¬±âÇØ µÎ°í ÀÏ´Ü ÇÊ¿äÇÑ ¾Ë°í¸®Áò¸¸ ÅÛÇø´¿¡ ÀÛ¼ºÇÑ´Ù. ÀÌÈÄ Å¸ÀÔ¸¸ ¹Ù²Ù¸é ÀÌ Å¸ÀÔÀ» ¿ä¼Ò·Î °¡Áö´Â µ¿Àû ¹è¿­ Ŭ·¡½º¸¦ ¸¸µå´Â ÀÛ¾÷Àº ÄÄÆÄÀÏ·¯°¡ ¾Ë¾Æ¼­ ÇÒ °ÍÀÌ´Ù. ´ÙÀ½ ¼Ò½º´Â DArray Ŭ·¡½ºÀÇ ÅÛÇø´ ¹öÀüÀÎ TDArrayÀÌ¸ç ¿øÄ¢¿¡ µû¶ó TDArray.h¶ó´Â Çì´õ ÆÄÀÏ¿¡ ÀÛ¼ºÇß´Ù.

 

¿¹ Á¦ : TDArray.h

template <typename T>

class TDArray

{

protected:

     T *ar;

     unsigned size;

     unsigned num;

     unsigned growby;

 

public:

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

     virtual ~TDArray();

     virtual void Insert(int idx, T value);

     virtual void Delete(int idx);

     virtual void Append(T value);

 

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

     unsigned GetSize() { return size; }

     unsigned GetNum() { return num; }

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

     void Dump(char *sMark);

};

 

template <typename T>

TDArray<T>::TDArray(unsigned asize, unsigned agrowby)

{

     size=asize;

     growby=agrowby;

     num=0;

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

}

 

template <typename T>

TDArray<T>::~TDArray()

{

     free(ar);

}

 

template <typename T>

void TDArray<T>::Insert(int idx, T value)

{

     unsigned need;

 

     need=num+1;

     if (need > size) {

          size=need+growby;

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

     }

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

     ar[idx]=value;

     num++;

}

 

template <typename T>

void TDArray<T>::Delete(int idx)

{

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

     num--;

}

 

template <typename T>

void TDArray<T>::Append(T value)

{

     Insert(num,value);

}

 

template <typename T>

void TDArray<T>::Dump(char *sMark)

{

     unsigned i;

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

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

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

     }

     cout << endl;

}

 

DArray¿¡ ºñÇØ ¾î¶² Á¡ÀÌ ¹Ù²î¾ú´ÂÁö º¸ÀÚ. ÀÏ´Ü À̸§ÀÌ ¹Ù²î¾ú´Âµ¥ ±»ÀÌ À̸§À» ¹Ù²Ü ÇÊ¿ä´Â ¾øÁö¸¸ ÅÛÇø´ ¹öÀüÀ̶ó´Â °ÍÀ» ºÐ¸íÈ÷ Ç¥½ÃÇϱâ À§ÇØ ¾Õ¿¡ TÀÚ¸¦ Çϳª ´õ ºÙ¿´´Ù. ELETYPE ¸ÅÅ©·Î´Â »ç¶óÁ³À¸¸ç Ŭ·¡½º Á¤Àǹ®¾Õ¿¡ template <typename T>°¡ Ãß°¡µÇ¾ú°í ¼Ò½º³»ÀÇ ¸ðµç ELETYPEÀº T·Î ´ëüÇß´Ù. ÀÌÁ¦ ¹è¿­ ¿ä¼ÒÀÇ Å¸ÀÔÀº ¸ÅÅ©·Î°¡ ¾Æ´Ñ ÅÛÇø´ Àμö¿¡ ÀÇÇØ °áÁ¤µÇ¸ç °´Ã¼¸¦ ¼±¾ðÇÒ ¶§¸¶´Ù ¿øÇϴ ŸÀÔÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.

¸â¹ö ÇÔ¼öÀÇ ¼Ò¼ÓÀº ¸ðµÎ TDArray<T> Ŭ·¡½º°¡ µÇ¸ç ÇÔ¼ö º»Ã¼ÀÇ ELETYPEÀº T·Î ¹Ù²ï´Ù. ¸â¹ö ÇÔ¼öÀÇ ÄÚµå´Â ¿øÄ¢ÀûÀ¸·Î º¯°æÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ±âÁ¸ Ŭ·¡½º°¡ ÅÛÇø´È­µÇ¸é¼­ ²À ¹Ù²î¾î¾ß ÇÏ´Â ºÎºÐÀº »ç½Ç»ó ¾ø´Â ¼ÀÀÌ¸ç ¸¸¾à ÀÖ´Ù¸é ÀÌ´Â ±× Ŭ·¡½º°¡ ÅÛÇø´È­¸¦ ÇÒ¸¸Å­ ÃæºÐÈ÷ ÀϹÝÈ­µÇÁö ¸øÇÑ °ÍÀÌ´Ù.

ÀÌÁ¦ TDArray´Â ÀÓÀÇÀÇ Å¸ÀÔ¿¡ ´ëÇÑ µ¿Àû ¹è¿­À» ¸¸µé ¼ö Àִ Ŭ·¡½º ÅÛÇø´ÀÌ µÇ¾úÀ¸¸ç ÀÌ ¾È¿¡´Â µ¿Àû ¹è¿­À» °ü¸®ÇÏ´Â ¸ðµç ¾Ë°í¸®ÁòÀÌ Æ÷ÇԵǾî ÀÖ´Ù. ¾îµð±îÁö³ª ÅÛÇø´ÀÏ »ÓÀ̹ǷΠ¾ÆÁ÷ Ŭ·¡½º´Â ¾Æ´ÏÁö¸¸ ¿øÇϴ ŸÀÔ°ú ÇÔ²² °´Ã¼¸¦ ¼±¾ðÇϸé ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ ±¸Ã¼È­µÈ´Ù. Á¦´ë·Î µ¿ÀÛÇÏ´ÂÁö ¿¹Á¦¸¦ ÀÛ¼ºÇØ º¸ÀÚ.

 

¿¹ Á¦ : TDArrayTest

#include <Turboc.h>

#include <iostream>

using namespace std;

#include "TDArray.h"

 

void main()

{

     TDArray<int> ari;

     TDArray<double> ard;

     int i;

 

     for (i=1;i<=5;i++) ari.Append(i);

     ari.Dump("5°³ Ãß°¡");

     for (i=1;i<=3;i++) ard.Append((double)i*1.23);

     ard.Dump("3°³ Ãß°¡");

}

 

TDArray.h Çì´õ ÆÄÀϸ¸ Æ÷ÇÔÇϸé ÅÛÇø´ÀÌ Á¤ÀǵȴÙ. main¿¡¼­´Â Á¤¼öÇü µ¿Àû ¹è¿­ TDArray<int> ŸÀÔÀÇ °´Ã¼ ari¿Í ½Ç¼öÇü µ¿Àû ¹è¿­ TDArray<double> ŸÀÔÀÇ ard °´Ã¼¸¦ ¼±¾ðÇßÀ¸¸ç Àß µ¿ÀÛÇÏ´ÂÁö È®ÀÎÇØ º¸±â À§ÇØ °ªÀ» Ãß°¡ÇÑ ÈÄ Dump¸¸ ÇØ º¸¾Ò´Ù.

 

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

3°³ Ãß°¡ => Å©±â:100,°³¼ö:3 °ª : 1.23 2.46 3.69

 

Á¤¼ö¿¡ ´ëÇؼ­³ª ½Ç¼ö¿¡ ´ëÇؼ­³ª TDArray´Â Àß ÀÛµ¿ÇÔÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. TDArray.h Çì´õ ÆÄÀϸ¸ Æ÷ÇÔ½ÃÅ°°í °´Ã¼¸¦ ¼±¾ðÇÒ ¶§ ¿øÇϴ ŸÀÔ¸¸ ¹àÈ÷¸é ÀÓÀÇ Å¸ÀÔ¿¡ ´ëÇØ µ¿ÀÛÇÏ´Â µ¿Àû ¹è¿­À» ½±°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. TDArray´Â ÀÓÀÇ Å¸ÀÔ¿¡ ´ëÇؼ­ Àß µ¿ÀÛÇÏ´Â ¹è¿­À̱â´Â ÇÏÁö¸¸ ¸ðµç °æ¿ì¿¡ µÎ·ç ¾µ ¼ö ÀÖ´Â ÀϹݼºÀ» °®ÃßÁö´Â ¸øÇß´Ù. ³»ºÎ¿¡¼­ µ¿Àû ÇÒ´çÀ» ÇϹǷΠº¹»ç »ý¼ºÀÚ¿Í ´ëÀÔ ¿¬»êÀÚ¸¦ ¿øÄ¢´ë·Î ÀûÀýÈ÷ Á¤ÀÇÇØ¾ß ÇÑ´Ù.

¶ÇÇÑ µ¿Àû ÇÒ´çµÇ´Â Æ÷ÀÎÅÍ¿¡ ´ëÇÑ ¹è¿­À̳ª Ŭ·¡½º¿¡ ´ëÇÑ ¹è¿­·Î ¾²±â¿¡´Â Á¶±Ý ºÒÆíÇÑ Á¡ÀÌ ÀÖ´Ù. Æ÷ÀÎÅÍÀÇ °æ¿ì »èÁ¦ÇÒ ¶§ Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â °÷µµ ÇØÁ¦ÇÏ´Â °ÍÀÌ ÁÁÀ» °ÍÀÌ°í °´Ã¼ÀÇ °æ¿ì »ý¼ºÀÚ¿Í Æı«ÀÚµµ È£ÃâÇØ ÁÖ¸é Æí¸®ÇÏ´Ù. ¹°·Ð ±×·¸´Ù°í Çؼ­ TDArray¸¦ Æ÷ÀÎÅͳª °´Ã¼ÀÇ ¹è¿­·Î ¾µ ¼ö ¾ø´Ù´Â ¾ê±â´Â ¾Æ´Ï¸ç ¿ÜºÎ¿¡¼­ °ü¸®ÇØ¾ß ÇÑ´Ù´Â Á¡ÀÌ ºÒÆíÇÒ »ÓÀÌ´Ù. TDArray´Â ¾îµð±îÁö³ª ¿¹Á¦ÀÏ »ÓÀÌ°í ÈξÀ ´õ Àß ¸¸µé¾îÁø µ¿Àû ¹è¿­ ÅÛÇø´(¿¹:vector, CTypedPtrArray) µéÀÌ ¸¹ÀÌ °ø°³µÇ¾î ÀÖÀ¸¹Ç·Î ½Ç¹«¸¦ ÇÒ ¶§´Â ÀÌ·± °ÍµéÀ» ¾²±â ¹Ù¶õ´Ù.