31-2.Ŭ·¡½º ÅÛÇø´

31-2-°¡.ŸÀÔ¸¸ ´Ù¸¥ Ŭ·¡½ºµé

Ŭ·¡½º ÅÛÇø´Àº ÇÔ¼ö ÅÛÇø´°ú ºñ½ÁÇ쵂 Âï¾î³»´Â ´ë»óÀÌ Å¬·¡½º¶ó´Â °Í¸¸ ´Ù¸£´Ù. ±¸Á¶³ª ±¸Çö ¾Ë°í¸®ÁòÀº µ¿ÀÏÇ쵂 ¸â¹öµéÀÇ Å¸ÀÔ¸¸ ´Ù¸¦ °æ¿ì Ŭ·¡½º¸¦ ÀÏÀÏÀÌ µû·Î ¸¸µå´Â ´ë½Å ÅÛÇø´À» Á¤ÀÇÇÑ ÈÄ ÅÛÇø´À¸·ÎºÎÅÍ Å¬·¡½º¸¦ ¸¸µé ¼ö ÀÖ´Ù. ½Ç¿ëÀû °¡Ä¡´Â º°·Î ¾øÁö¸¸ È­¸é»óÀÇ Æ¯Á¤ ÁÂÇ¥¿¡ Ãâ·ÂµÉ °ª¿¡ ´ëÇÑ Á¤º¸¸¦ Ç¥ÇöÇϴ Ŭ·¡½º¸¦ ¸¸µé¾î º¸ÀÚ. Á¤º¸ÀÇ Å¸ÀÔ¿¡ µû¶ó °ªÀ» Ç¥ÇöÇÏ´Â ¸â¹öÀÇ Å¸ÀÔÀÌ ´Þ¶óÁö¹Ç·Î ŸÀÔ¿¡ µû¶ó Ŭ·¡½º¸¦ ÀÏÀÏÀÌ ¸¸µé¾î¾ß ÇÑ´Ù.

 

class PosValueInt

{

private:

     int x,y;

     int value;

public:

     PosValue(int ax, int ay, int av) : x(ax),y(ay),value(av) { }

     void OutValue();

};

 

class PosValueChar

{

private:

     int x,y;

     char value;

public:

     PosValue(int ax, int ay, char av) : x(ax),y(ay),value(av) { }

     void OutValue();

};

 

class PosValueDouble

{

private:

     int x,y;

     double value;

public:

     PosValue(int ax, int ay, double av) : x(ax),y(ay),value(av) { }

     void OutValue();

};

 

ÁÂÇ¥°ª x, y´Â ¸ðµç Ŭ·¡½º¿¡¼­ intÇüÀÌ¸ç °ªÀ» Ç¥ÇöÇÏ´Â value ¸â¹öÀÇ Å¸ÀÔ¸¸ ´Þ¶óÁø´Ù. Ŭ·¡½º´Â ÇÔ¼ö¿¡¼­¿Í °°Àº ¿À¹ö·ÎµùÀÌ Áö¿øµÇÁö ¾ÊÀ¸¹Ç·Î À̸§À» ¸ðµÎ ´Ù¸£°Ô ÀÛ¼ºÇØ¾ß Çϸç valueÀÇ Å¸ÀÔ¿¡ µû¶ó »ý¼ºÀÚÀÇ ¿øÇüµµ °¢±â ´Ù¸£´Ù. °á±¹ ½ÇÁ¦·Î ´Ù¸¥ ºÎºÐÀº valueÀÇ Å¸ÀÔ»ÓÀÌ¸ç ³ª¸ÓÁö´Â ¸ðµÎ µ¿ÀÏÇϹǷΠÀÌ Å¬·¡½ºµéÀ» ÇϳªÀÇ ÅÛÇø´À¸·Î ÅëÇÕÇÒ ¼ö ÀÖ´Ù.

 

¿¹ Á¦ : PosValueTemp

#include <Turboc.h>

#include <iostream>

using namespace std;

 

template <typename T>

class PosValue

{

private:

     int x,y;

     T value;

public:

     PosValue(int ax, int ay, T av) : x(ax),y(ay),value(av) { }

     void OutValue();

};

 

template <typename T>

void PosValue<T>::OutValue()

{

     gotoxy(x,y);

     cout << value << endl;

}

 

void main()

{

     PosValue<int> iv(1,1,2);

     PosValue<char> cv(5,1,'C');

     PosValue<double> dv(30,2,3.14);

     iv.OutValue();

     cv.OutValue();

     dv.OutValue();

}

 

Ŭ·¡½º ¼±¾ð¹®¾Õ¿¡ template <typename T>¸¦ ºÙÀ̰í ŸÀÔ¿¡ Á¾¼ÓÀûÀÎ ºÎºÐ¿¡¸¸ T¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ¿¹Á¦ÀÇ PosValue Ŭ·¡½º´Â ÅÛÇø´ Àμö·Î Àü´Þ¹ÞÀº ŸÀÔ T¸¦ valueÀÇ Å¸ÀÔÀ¸·Î ¼±¾ðÇÏ¿´°í »ý¼ºÀÚÀÇ ¼¼ ¹øÂ° Àμöµµ TÇüÀÌ µÈ´Ù. ÀÌ·¸°Ô Á¤ÀÇµÈ Å¬·¡½º ŸÀÔÀÇ °´Ã¼¸¦ »ý¼ºÇÒ ¶§ Ŭ·¡½º À̸§ ´ÙÀ½ÀÇ < > °ýÈ£¾È¿¡ ¿øÇϴ ŸÀÔÀ» ¹àÇô¾ß ÇÑ´Ù. Ŭ·¡½º ÅÛÇø´À¸·ÎºÎÅÍ ¸¸µé¾îÁö´Â Ŭ·¡½º¸¦ ÅÛÇø´ Ŭ·¡½º¶ó°í Çϴµ¥ ÅÛÇø´ Ŭ·¡½ºÀÇ Å¸ÀÔ¸í¿¡´Â < > °ýÈ£°¡ Ç×»ó µû¶ó ´Ù´Ñ´Ù. value°¡ intÇüÀΠŬ·¡½ºÀÇ À̸§Àº PosValue<int>À̰í value°¡ charÇüÀΠŬ·¡½ºÀÇ À̸§Àº PosValue<char>ÀÌ´Ù.

´Ü ¿¹¿ÜÀûÀ¸·Î »ý¼ºÀÚÀÇ À̸§Àº Ŭ·¡½ºÀÇ À̸§À» µû¶ó°¡Áö¸¸ Ŭ·¡½º ÅÛÇø´ÀÇ °æ¿ì ÅÛÇø´ À̸§À» »ç¿ëÇØµµ »ó°ü¾ø´Ù. <T> °ýÈ£°¡ Àְųª ¾ø°Å³ª »ó°ü¾ø´Ù´Â ¾ê±âÀε¥ À§ ¿¹Á¦ÀÇ PosValue »ý¼ºÀÚ¸¦ PosValue<T>(int ax, int ay, T av)·Î Á¤ÀÇÇÒ ¼öµµ ÀÖ´Ù. º¸ÅëÀº »ý¼ºÀÚ¿¡ ´ëÇØ¼­´Â <T>¸¦ ºÙÀÌÁö ¾Ê´Â´Ù.

Ŭ·¡½º ÅÛÇø´ÀÇ ¸â¹ö ÇÔ¼ö¸¦ ¼±¾ð¹® ¿ÜºÎ¿¡¼­ ÀÛ¼ºÇÒ ¶§´Â ÅÛÇø´¿¡ ¼ÓÇÑ ¸â¹ö ÇÔ¼öÀÓÀ» ¹àÈ÷±â À§ÇØ ¼Ò¼Ó Ŭ·¡½ºÀÇ À̸§¿¡µµ <T>¸¦ ºÙ¿©¾ß Çϸç T°¡ ÅÛÇø´ ÀμöÀÓÀ» ¸í½ÃÇϱâ À§ÇØ template <typename T>°¡ ¸ÕÀú ¿Í¾ß ÇÑ´Ù. OutValue ¸â¹ö ÇÔ¼ö´Â PosValue<T> Ŭ·¡½º ¼Ò¼ÓÀ̸ç À̶§ T´Â ÅÛÇø´ Àμö ¸ñ·ÏÀ¸·Î Àü´ÞµÈ ŸÀÔÀÇ À̸§ÀÌ´Ù. ÇÔ¼ö º»Ã¼ ³»¿¡¼­´Â T¸¦ ¾ðÁ¦µçÁö ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. Ŭ·¡½º ¼±¾ð¹® ³»ºÎ¿¡¼­ ÀζóÀÎÀ¸·Î ÇÔ¼ö¸¦ ¼±¾ðÇÒ ¶§´Â Ŭ·¡½º ¼±¾ð¹®¾Õ¿¡ T¿¡ ´ëÇÑ ¼³¸íÀÌ ÀÖÀ¸¹Ç·Î ÀÌ·¸°Ô ÇÏÁö ¾Ê¾Æµµ »ó°ü¾ø´Ù.

 

template <typename T>

class PosValue

{

     ....

     void OutValue() {

          gotoxy(x,y);

          cout << value << endl;

     }

};

 

ÅÛÇø´ Ŭ·¡½º·ÎºÎÅÍ °´Ã¼¸¦ ¼±¾ðÇÒ ¶§´Â ÅÛÇø´ À̸§ ´ÙÀ½¿¡ < >°ýÈ£¸¦ ¾²°í °ýÈ£¾È¿¡ T·Î Àü´ÞµÉ ŸÀÔÀÇ À̸§À» ¸í½ÃÇØ¾ß ÇÑ´Ù. PosValue<int>´Â intŸÀÔÀÇ value¸¦ ¸â¹ö·Î °¡Áö´Â PosValue ÅÛÇø´ Ŭ·¡½º¸¦ ÀǹÌÇϸç PosValue<double> Ŭ·¡½ºÀÇ value´Â double ŸÀÔÀÌ µÈ´Ù. ÅÛÇø´ Ŭ·¡½ºÀÇ À̸§¿¡´Â ŸÀÔÀÌ ºÐ¸íÈ÷ ¸í½ÃµÇ¾î¾ß ÇÑ´Ù. PosValue¶ó´Â ¸íĪÀº ¾îµð±îÁö³ª ÅÛÇø´ÀÇ À̸§ÀÏ »ÓÀ̹ǷΠÀÌ À̸§À¸·ÎºÎÅÍ °´Ã¼¸¦ »ý¼ºÇÒ ¼ö´Â ¾ø´Ù.

ÄÄÆÄÀÏ·¯´Â °´Ã¼ ¼±¾ð¹®¿¡ ÀÖ´Â ÃʱⰪÀÇ Å¸ÀÔÀ¸·ÎºÎÅÍ ¾î¶² ŸÀÔ¿¡ ´ëÇÑ Å¬·¡½º¸¦ ¿øÇÏ´ÂÁö ¾Ë ¼ö ÀÖÀ» °Íµµ °°´Ù. ¿¹¸¦ µé¾î PosValue iv(1,1,2)¶ó°í ¾²¸é Á¦ÀÏ ¸¶Áö¸· Àμö°¡ intÇü »ó¼öÀ̹ǷΠPosValue<int> ŸÀÔÀ̶ó°í À¯Ãß °¡´ÉÇÒ °ÍÀÌ´Ù. ±×·¯³ª »ý¼ºÀÚ°¡ ¿À¹ö·ÎµùµÇ¾î ÀÖÀ» °æ¿ì ÀÌ Á¤º¸¸¸À¸·Î´Â ¿øÇϴ ŸÀÔÀ» Á¤È®ÇÏ°Ô ÆÇ´ÜÇÏ±â ¾î·Æ´Ù. ¶ÇÇÑ »ý¼ºÀÚ¸¦ È£ÃâÇϱâ Àü¿¡ °´Ã¼¸¦ À§ÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´çÇØ¾ß Çϴµ¥ ÀÌ ½ÃÁ¡¿¡¼­ »ý¼ºÇÒ °´Ã¼ÀÇ Å©±â¸¦ ¸ÕÀú °è»êÇÒ ¼ö ÀÖ¾î¾ß ÇϹǷΠŬ·¡½º À̸§¿¡ ŸÀÔÀÌ ¸í½ÃµÇ¾î¾ß ÇÑ´Ù.

ÇÔ¼ö¿¡¼­¿Í ¸¶Âù°¡Áö·Î Ŭ·¡½º ÅÛÇø´µµ ´Ü¼øÇÑ ¼±¾ð¿¡ ºÒ°úÇϸç ÄÄÆÄÀÏ·¯´Â ÀÌ ÅÛÇø´ÀÇ ¸ð¾çÀ» ±â¾ïÇØ µÎ¾ú´Ù°¡ °´Ã¼°¡ »ý¼ºµÉ ¶§ Àü´ÞµÈ ŸÀÔ¿¡ ¸Â´Â Ŭ·¡½º Á¤ÀǸ¦ ±¸Ã¼È­ÇÑ´Ù. ¸¸¾à Ŭ·¡½º ÅÛÇø´ ¼±¾ð¸¸ ÀÖ°í °´Ã¼¸¦ »ý¼ºÇÏÁö ¾Ê´Â´Ù¸é ÅÛÇø´Àº ¹«½ÃµÈ´Ù. main¿¡¼­ int, char, double ŸÀÔÀÇ PosValue °´Ã¼¸¦ °¢°¢ ¼±¾ðÇߴµ¥ ÀÌ ¼±¾ð¹®¿¡ ÀÇÇØ ¼¼ °³ÀÇ Å¬·¡½º°¡ ±¸Ã¼È­µÉ °ÍÀÌ´Ù. È®ÀÎÀ» À§ÇØ ¼¼ °³ÀÇ °´Ã¼¸¦ ¸¸µç ÈÄ OutValue ÇÔ¼ö¸¦ È£ÃâÇÏ¿© °¢ ÁÂÇ¥¿¡ °ªÀ» Ãâ·ÂÇØ º¸¾Ò´Ù.

ÅÛÇø´À¸·ÎºÎÅÍ ¸¸µé¾îÁö´Â Ŭ·¡½ºµµ ºÐ¸íÈ÷ Ŭ·¡½ºÀ̸ç ÀϹÝÀûÀΠŬ·¡½º¿Í ÀüÇô ´Ù¸¦ ¹Ù°¡ ¾ø´Ù. ÅÛÇø´ Ŭ·¡½º·ÎºÎÅÍ »ó¼ÓÇÏ´Â °Íµµ °¡´ÉÇÏ¸ç ¹®¹ýµµ µ¿ÀÏÇ쵂 ±â¹Ý Ŭ·¡½ºÀÇ À̸§¿¡ < > °ýÈ£°¡ »ç¿ëµÇ´Â Â÷À̹ۿ¡ ¾ø´Ù. ´ÙÀ½ Ŭ·¡½º´Â PosValue<int>·ÎºÎÅÍ »õ·Î¿î Ŭ·¡½º¸¦ ÆÄ»ýÇÑ´Ù.

 

class PosValue2 : public PosValue<int> { ... }

 

ÅÛÇø´ Ŭ·¡½º°¡ ´Ù¸¥ Ŭ·¡½ºÀÇ ±â¹Ý Ŭ·¡½º·Î »ç¿ëµÇ¸é ÄÄÆÄÀÏ·¯´Â Ŭ·¡½º¸¦ Áï½Ã ±¸Ã¼È­ÇÑ´Ù. ¼³»ç ÀÌ Å¬·¡½ºÀÇ ÀνºÅϽº ¼±¾ð¹®ÀÌ ¾ø´õ¶óµµ ¸»ÀÌ´Ù. ÅÛÇø´À¸·ÎºÎÅÍ ¸¸µé¾îÁöÁö ¾ÊÀº ÀÏ¹Ý Å¬·¡½ºÀÇ Æ¯Á¤ ¸â¹ö ÇÔ¼ö¸¸ ÅÛÇø´À¸·Î ¼±¾ðÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù. ¸â¹ö ÇÔ¼öµµ ºÐ¸íÈ÷ ÇÔ¼öÀ̹ǷΠŸÀÔ¿¡ µû¶ó ¿©·¯ ¹úÀÌ ÇÊ¿äÇÏ´Ù¸é ¿øÇÏ´Â ÇÔ¼ö Çϳª¸¸ ÇÔ¼ö ÅÛÇø´À¸·Î ¸¸µé¸é µÈ´Ù. ´ÙÀ½ ¿¹Á¦´Â ±× ¿¹¸¦ º¸¿© ÁØ´Ù.

 

¿¹ Á¦ : TempMember

#include <Turboc.h>

#include <iostream>

using namespace std;

 

class Some

{

private:

     int mem;

 

public:

     Some(int m) : mem(m) { }

     template <typename T>

     void memfunc(T a) {

          cout << "ÅÛÇø´ Àμö = " << a << ", mem = " << mem << endl;

     }

};

 

void main()

{

     Some s(9999);

 

     s.memfunc(1234);

     s.memfunc(1.2345);

     s.memfunc("string");

}

 

Some Ŭ·¡½º¿¡´Â ÇÔ¼ö ÅÛÇø´ÀÌ Çϳª Æ÷ÇԵǾî ÀÖÀ¸¸ç ÀÌ ÇÔ¼ö´Â ÀÓÀÇ Å¸ÀÔ TÇüÀÇ º¯¼ö a¸¦ Àμö·Î Àü´Þ¹Þ¾Æ ±× °ªÀ» È­¸éÀ¸·Î Ãâ·ÂÇÑ´Ù. ½ÇÁ¦ ¾î¶² ¸â¹ö ÇÔ¼ö°¡ È£ÃâµÇ´Â°¡¿¡ µû¶ó Ŭ·¡½º SomeÀÇ ¸â¹ö ÇÔ¼ö °³¼ö°¡ °áÁ¤µÉ °ÍÀÌ´Ù.