ÅÛÇø´ÀÇ Àμö ¸ñ·Ï¿¡ Àü´ÞµÇ´Â °ÍÀº Åë»ó ŸÀÔÀÌ´Ù. ¾Ë°í¸®ÁòÀº °°µÇ ŸÀÔ¸¸ ´Ù¸¥ ÇÔ¼ö³ª Ŭ·¡½º¸¦ ÀÛ¼ºÇÏ°í ½ÍÀ» ¶§ ÅÛÇø´À» »ç¿ëÇÑ´Ù. ±×·¯³ª ŸÀÔÀÌ ¾Æ´Ñ »ó¼ö¸¦ ÅÛÇø´ Àμö·Î Àü´ÞÇÒ ¼ö Àִµ¥ À̸¦ ºñŸÀÔ Àμö(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Àº Ŭ·¡½ºÀÇ ºñŸÀÔ Àμö´Â Áö¿øÇÏÁö¸¸ ÇÔ¼öÀÇ ºñŸÀÔ Àμö´Â ¾ÆÁ÷ Áö¿øÇÏÁö ¸øÇÑ´Ù.