31-2-´Ù.ºñŸÀÔ Àμö

ÅÛÇø´ÀÇ Àμö ¸ñ·Ï¿¡ Àü´ÞµÇ´Â °ÍÀº Åë»ó ŸÀÔÀÌ´Ù. ¾Ë°í¸®ÁòÀº °°µÇ ŸÀÔ¸¸ ´Ù¸¥ ÇÔ¼ö³ª Ŭ·¡½º¸¦ ÀÛ¼ºÇÏ°í ½ÍÀ» ¶§ ÅÛÇø´À» »ç¿ëÇÑ´Ù. ±×·¯³ª ŸÀÔÀÌ ¾Æ´Ñ »ó¼ö¸¦ ÅÛÇø´ Àμö·Î Àü´ÞÇÒ ¼ö Àִµ¥ À̸¦ ºñŸÀÔ Àμö(Nontype Argument)¶ó°í ÇÑ´Ù. ´ÙÀ½ ¿¹Á¦ÀÇ Array Ŭ·¡½º´Â ÀÓÀÇÀÇ Å¸ÀÔ¿¡ ´ëÇÑ ¹è¿­À» Á¤ÀÇÇÏ°í ¹è¿­ ¿ä¼ÒÀÇ °ªÀ» º¯°æÇϰųª Àд ±â´ÉÀ» Á¦°øÇÑ´Ù. ÀÓÀÇÀÇ Å¸ÀÔ¿¡ ´ëÇÑ ¹è¿­À» ¸¸µé±â À§ÇØ Å¸ÀÔ À̸§À» ÅÛÇø´ Àμö·Î Àü´Þ¹ÞÀ¸¸ç ¹è¿­ÀÇ Å©±â ÁöÁ¤À» À§ÇØ Á¤¼ö »ó¼ö¸¦ Àü´Þ¹Þ´Â´Ù.

 

¿¹ Á¦ : NonTypeArgument

#include <Turboc.h>

 

template <typename T, int N>

class Array

{

private:

     T ar[N];

public:

     void SetAt(int n,T v) { if (n < N && n >=0) ar[n]=v; }

     T GetAt(int n) { return (n < N && n >=0 ? ar[n]:0); }

};

 

void main()

{

     Array<int,5> ari;

     ari.SetAt(1,1234);

     ari.SetAt(1000,5678);

     printf("%d\n",ari.GetAt(1));

     printf("%d\n",ari.GetAt(5));

}

 

±â´É»ó ´Ü¼ø ¹è¿­°ú À¯»çÇÏÁö¸¸ Á» ´õ ¾ÈÀüÇÑ ¾×¼¼½º¸¦ Áö¿øÇϴµ¥ ¿ä¼Ò°ªÀ» Àаųª ¾²´Â Get(Set)At ÇÔ¼ö°¡ Àü´ÞµÈ ÷ÀÚÀÇ ¹üÀ§¸¦ Á¡°ËÇϹǷΠ½Ç¼ö·Î ¹üÀ§ ¹Ù±ùÀ» ¾×¼¼½ºÇصµ Ä¡¸íÀûÀÎ ¿¡·¯¸¦ ¹ß»ý½ÃŰÁö ¾Ê´Â´Ù. À̿ܿ¡ È®ÀåÇϱ⿡ µû¶ó¼­´Â ¾ó¸¶µçÁö ´Ù¾çÇÑ ±â´ÉÀ» ´õ ³ÖÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù. main¿¡¼­´Â Å©±â 5ÀÇ Á¤¼öÇü ¹è¿­ ari¸¦ ¼±¾ðÇÏ°í ¹è¿­¿¡ °ªÀÌ Àß ±â¾ïµÇ´ÂÁö È®ÀÎÇØ º¸¾ÒÀ¸¸ç ¾û¶×ÇÑ Ã·ÀÚ¿¡ ´ëÇØ ¹æ¾î¸¦ Á¦´ë·Î ÇÏ´ÂÁöµµ Å×½ºÆ®ÇØ º¸¾Ò´Ù. 1234¿Í 0À̶ó´Â °ªÀÌ Ãâ·ÂµÇ¸é Á¤»óÀûÀ¸·Î µ¿ÀÛÇÏ´Â °ÍÀÌ´Ù.

Array Ŭ·¡½ºÀÇ TÇü ¹è¿­ ¸â¹ö arÀº Å©±â NÀ» °¡Áö´Âµ¥ ÀÌ Å©±â´Â °´Ã¼¸¦ ¼±¾ðÇÒ ¶§ Àμö·Î ÁÖ¾îÁö´Â Á¤¼ö »ó¼öÀÌ´Ù. ÅÛÇø´À¸·Î Àü´ÞµÇ´Â Àμö°¡ ŸÀÔÀÌ ¾Æ´Ï¹Ç·Î ºñŸÀÔ Àμö¶ó°í ÇÑ´Ù. ÄÄÆÄÀÏ·¯´Â ari ¼±¾ð¹®¿¡ ¸í½ÃµÇ¾î Àִ ŸÀÔ Array<int,5>·ÎºÎÅÍ ´ÙÀ½°ú °°Àº Ŭ·¡½º¸¦ ±¸Ã¼È­ÇÒ °ÍÀÌ´Ù.

 

class Array

{

private:

     int ar[5];

public:

     void SetAt(int n,int v) { if (n < 5 && n >=0) ar[n]=v; }

     int GetAt(int n) { return (n < 5 && n >=0 ? ar[n]:0); }

};

 

ÀÓÀÇ Å¸ÀÔ¿¡ ´ëÇØ ÀÓÀÇ Å©±â±îÁö¸¦ Áö¿øÇÏ´Â ¾ÈÀü ¹è¿­ Ŭ·¡½º¸¦ ¸¸µé°í ½Í´Ù¸é ÀÌ·± ºñŸÀÔ Àμö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ÀÓÀÇ Å©±â¸¦ Áö¿øÇÏ´Â ´õ ÁÁÀº ¹æ¹ýÀº »ý¼ºÀÚÀÇ Àμö·Î Àü´ÞµÇ´Â °ªÀ¸·Î µ¿Àû ÇÒ´çÀ» ÇÏ´Â °ÍÀÌ´Ù. Æ÷ÀÎÅÍÇü ¸â¹ö º¯¼ö¸¦ ¼±¾ðÇϸé ÇÊ¿äÇѸ¸Å­ ÇÒ´çÇÒ ¼ö ÀÖÀ¸¸ç ¿øÇÒ °æ¿ì ½ÇÇàÁß¿¡¶óµµ Å©±â¸¦ ¸¶À½´ë·Î ¹Ù²Ü ¼öµµ ÀÖ¾î ±²ÀåÈ÷ ½ÅÃàÀûÀÌ´Ù.

±×·¯³ª ¾Ë´Ù½ÃÇÇ µ¿ÀûÇÒ´çÀº »ý¼ºÀÚ¿Í ÆÄ±«ÀÚ¸¦ ¿ä±¸Çϰí Á¤È®ÇÏ°Ô µ¿ÀÛÇϱâ À§Çؼ­´Â º¹»ç »ý¼ºÀÚ, ´ëÀÔ ¿¬»êÀÚ°¡ ¹Ýµå½Ã ÀûÀýÇÏ°Ô Á¤ÀǵǾî¾ß ÇÏ¸ç »ó¼Ó °ü°è¸¦ °í·ÁÇÏ¸é ´ëºÎºÐÀÇ ¸â¹ö ÇÔ¼öµéÀº °¡»ó ÇÔ¼ö°¡ µÇ¾î¾ß ÇÑ´Ù. ÁÁ±â´Â ÇÏÁö¸¸ Äڵ尡 Á®¾ß ÇÒ ºÎ´ãÀÌ ³Ê¹« ¸¹Àº °ÍÀÌ´Ù. ÀÌ·² ¶§ µ¿Àû ÇÒ´ç ´ë½Å ÇÊ¿äÇÑ Å©±â¸¸Å­ÀÇ ¿ä¼Ò¸¦ Á¤ÀûÀ¸·Î °¡Áö´Â Ŭ·¡½º¸¦ ¸¸µé¾î ¾²¸é ¼Óµµµµ ºü¸£°í À§ÇèÇÏÁöµµ ¾ÊÀ¸¸ç ¹«¾ùº¸´Ù ´Ü¼øÇؼ­ ÁÁ´Ù. ¿¹Á¦ÀÇ Array ÅÛÇø´Àº »ý¼ºÀÚ, ÆÄ±«ÀÚ, º¹»ç »ý¼ºÀÚ, ´ëÀÔ ¿¬»êÀÚ Áß ¾î¶² °Íµµ ÇÊ¿ä¾ø´Ù. ¾Æ´Ï, ÇÊ¿ä´Â ÇÏÁö¸¸ ÄÄÆÄÀÏ·¯°¡ µðÆúÆ®·Î ¸¸µå´Â °Í¸¸À¸·Îµµ ÃæºÐÇÏ°í ¾ÈÀüÇÏ´Ù.

½ÇÇàÁß¿¡ Å©±â¸¦ °áÁ¤Çϱâ Èûµç Áß¿äÇÑ »ó¼ö¿¡ ´ëÇØ¼­´Â ÀÌ·± ½ÄÀ¸·Î ÅÛÇø´°ú ºñŸÀÔ Àμö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Å©±â°¡ ´Ù¸¥ °´Ã¼¸¦ ¼±¾ðÇÒ ¶§¸¶´Ù Ŭ·¡½º°¡ ±¸Ã¼È­µÈ´Ù´Â Á¡¿¡¼­ ³¶ºñ°¡ Á¶±Ý ÀÖ±â´Â ÇÏÁö¸¸ ¸»ÀÌ´Ù. Ŭ·¡½º ¼±¾ð¹®ÀÇ ÅÛÇø´ Àμö°¡ ´Ù¸£¸é °´Ã¼ÀÇ Å¸ÀÔµµ ´Þ¶óÁø´Ù. ÄÄÆÄÀÏ·¯´Â ¿ÏÀüÈ÷ °°Áö ¾ÊÀº ÅÛÇø´ Àμö¿¡ ´ëÇØ¼­´Â °³º°ÀûÀ¸·Î ±¸Ã¼È­¸¦ Çϱ⠶§¹®ÀÌ´Ù. ½ÉÁö¾î ¸â¹ö ÇÔ¼öµéµµ ÀüºÎ µû·Î ¸¸µé¾îÁø´Ù. ´ÙÀ½ Äڵ带 º¸ÀÚ.

 

Array<int,5> ari;

Array<int,5> ari2;

Array<int,6> ari3;

 

ari=ari2;

ari=ari3;        // ¿¡·¯

 

ari¿Í ari2´Â °°Àº ŸÀÔÀ̹ǷΠ¼­·Î ´ëÀÔ °¡´ÉÇÏÁö¸¸ ari3¸¦ ari¿¡ ´ëÀÔÇÏ´Â °ÍÀº ¿¡·¯ÀÌ´Ù. ¿Ö³ÄÇϸé ari´Â Array<int,5> ŸÀÔÀ̰í ari3´Â Array<int,6> ŸÀÔÀ̱⠶§¹®ÀÌ´Ù. ¹°·Ð Array<double,5> ŸÀÔµµ Array<int, 5>¿Í ȣȯµÇÁö ¾Ê´Â ´Ù¸¥ ŸÀÔÀÌ´Ù. Array<int,6>Àº ´ÙÀ½°ú °°ÀÌ ±¸Ã¼È­µÇ¸ç Array<int,5>¿Í´Â Å©±âµµ ´Ù¸£°í µ¿ÀÛµµ ´Ù¸£´Ù.

 

class Array

{

private:

     int ar[6];

public:

     void SetAt(int n,int v) { if (n < 6 && n >=0) ar[n]=v; }

     int GetAt(int n) { return (n < 6 && n >=0 ? ar[n]:0); }

};

 

Ŭ·¡½º ¼±¾ð¹®ÀÇ ºñŸÀÔ Àμö´Â ¹Ýµå½Ã »ó¼ö¿©¾ß ÇÏ¸ç ½ÇÇàÁß¿¡ °ªÀÌ °áÁ¤µÇ´Â º¯¼ö´Â Àμö·Î »ç¿ëÇÒ ¼ö ¾ø´Ù. ´ÙÀ½ ¼±¾ð¹®Àº ¿¡·¯·Î 󸮵ȴÙ.

 

int size=5;

Array<int,size> ari;

 

size´Â º¯¼öÀ̸ç ÀÌ °ªÀº ½ÇÇàÁß¿¡ ¼ö½Ã·Î º¯ÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÅÛÇø´ÀÇ Àμö·Î »ç¿ëÇÒ ¼ö ¾ø´Ù. ÅÛÇø´À̶õ ÄÄÆÄÀÏ·¯°¡ Àμö¸¦ Àû¿ëÇÏ¿© ÄÄÆÄÀÏ Áß¿¡ Ŭ·¡½º¸¦ ¸¸µé¾î ³»´Â ÇüƲÀ̹ǷΠ¸ðµç Á¤º¸¸¦ ÄÄÆÄÀÏ Áß¿¡ ¾Ë ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ½ÇÇàÁß¿¡ ¾ø´ø Ŭ·¡½º¸¦ ¸¸µé¾î³»´Â ±â´ÉÀÌ ¾Æ´Ï¶ó ÄÄÆÄÀÏ Áß¿¡ ±¸Ã¼È­ÇØ¾ß ÇϹǷΠº¯¼ö´Â ¾µ ¼ö ¾ø´Ù. ¹°·Ð const int size=5; ·Î »ó¼ö ¼±¾ðÇß´Ù¸é °¡´ÉÇÏ´Ù.

ÇÔ¼ö·Îµµ ºñŸÀÔ Àμö¸¦ Àü´ÞÇÒ ¼ö ÀÖ´Ù. ´Ü, ÇÔ¼öÀÇ Çü½Ä Àμö ¸ñ·Ï¿¡ ¾î¶² »ó¼ö°¡ ¿Ã ¼ö´Â ¾øÀ¸¹Ç·Î ºñŸÀÔ Àμö´Â ÇÔ¼öÀÇ º»Ã¼¿¡¼­¸¸ »ç¿ëÇØ¾ß Çϸç ÇÔ¼ö È£Ãâ¹®¿¡ ÅÛÇø´ Àμö¸¦ ¸í½ÃÀûÀ¸·Î ÁöÁ¤ÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ¿¹Á¦´Â ºñŸÀÔ Àμö NÀÌ ÁöÁ¤ÇÏ´Â Å©±â¸¸Å­ÀÇ Áö¿ª ¹è¿­À» ¼±¾ðÇÏ´Â ÇÔ¼ö ÅÛÇø´ÀÌ´Ù.

 

¿¹ Á¦ : NonTypeArgFunc

#include <Turboc.h>

 

template <int N>

void func(void)

{

     int ar[N];

 

     printf("¹è¿­ Å©±â=%d\n",N);

}

 

void main()

{

     func<5>();

     func<8>();

}

 

main¿¡¼­ func ÇÔ¼ö¸¦ µÎ ¹ø È£ÃâÇߴµ¥ ºñŸÀÔ Àμö NÀ¸·Î 5¿Í 8À» Àü´ÞÇß´Ù. ÀÌ µÎ ÇÔ¼ö´Â Áö¿ªº¯¼öÀÇ ¼±¾ð¹®ÀÌ ´Ù¸£¹Ç·Î °¢°¢ µû·Î ±¸Ã¼È­µÇ¾î¾ß ÇÑ´Ù. ºñŸÀÔ Àμö´Â ÇÔ¼öÀÇ Àμö¿Í´Â ¿ëµµ°¡ ´Ù¸¥µ¥ ÇÔ¼öÀÇ Çü½Ä Àμö´Â ½ÇÇà ½Ã°£¿¡ Àü´ÞµÇ´Â º¯¼öÀ̹ǷΠ¹è¿­ ¼±¾ð¹® µî »ó¼ö°¡ ÇÊ¿äÇÑ °÷¿¡ »ç¿ëÇÒ ¼ö ¾øÁö¸¸ ºñŸÀÔ Àμö´Â ±¸Ã¼È­µÉ ¶§ ÇÔ¼ö º»Ã¼¿¡ Á÷Á¢ ±âÀԵǹǷΠ»ó¼öÀÏ ¼ö ÀÖ´Ù.

func ÅÛÇø´Àº ºñŸÀÔ Àμö NÀ» ¿ä±¸ÇϹǷΠfunc()¶ó°í¸¸ È£ÃâÇØ¼­´Â Áö¿ª ¹è¿­ÀÇ Å©±â¸¦ °áÁ¤ÇÒ ¼ö ¾øÀ¸¹Ç·Î ÇÔ¼ö¸¦ ±¸Ã¼È­ÇÒ ¼ö ¾ø´Ù. ¹Ýµå½Ã ¸í½ÃÀûÀÎ ÅÛÇø´ Àμö¸¦ Àü´ÞÇØ¾ß ÇÑ´Ù. ÀÌ ¿¹Á¦´Â gcc, ºñÁÖ¾ó C++ 7.0ÀÌ»óÀÇ ÃֽŠÄÄÆÄÀÏ·¯¿¡¼­´Â Àß ½ÇÇàµÇÁö¸¸ ºñÁÖ¾ó C++ 6.0¿¡¼­´Â ÄÄÆÄÀϵÇÁö ¾Ê´Â´Ù. ºñÁÖ¾ó C++ 6.0Àº Ŭ·¡½ºÀÇ ºñŸÀÔ Àμö´Â Áö¿øÇÏÁö¸¸ ÇÔ¼öÀÇ ºñŸÀÔ Àμö´Â ¾ÆÁ÷ Áö¿øÇÏÁö ¸øÇÑ´Ù.