°¡»ó ÇÔ¼öÀÇ Á¤ÀÇ¿Í µ¿ÀÛ ±×¸®°í ³»ºÎÀûÀÎ ±¸Çö ¹æ¹ý±îÁö ¾Ë¾ÆºÃ´Âµ¥ ÀÌ·± °¡»ó ÇÔ¼ö¸¦ ¾î¶»°Ô Àß È°¿ëÇÒ ¼ö ÀÖÀ»Áö ¿¬±¸ÇØ º¸ÀÚ. °¡»ó ÇÔ¼ö¸¦ ²À »ç¿ëÇØ¾ß ÇÏ´Â °æ¿ì¿Í ±×·¸Áö ¾ÊÀº °æ¿ì°¡ Àִµ¥ °á·Ð¸¸ ¾ê±âÇÏÀÚ¸é µ¿Àû °áÇÕÀÌ ÇÊ¿äÇÒ ¶§ °¡»ó ÇÔ¼ö¸¦ »ç¿ëÇÏ°í ±×·¸Áö ¾ÊÀ» °æ¿ì´Â ºñ°¡»ó ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ±×·¯³ª ÀÌ·± Áöħ¸¸À¸·Î °¡»ó ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÒ ½ÃÁ¡À» Á¤È®ÇÏ°Ô ¼±Á¤Çϱâ¶õ ½±Áö ¾ÊÀ¸¹Ç·Î °¡»ó ÇÔ¼ö¸¦ Á¦´ë·Î È°¿ëÇÏ´Â ¸î °¡Áö ¿¹µéÀ» ±¸°æÇØ º¸µµ·Ï ÇÏÀÚ.
¿¹¸¦ ±¸°æÇØ º¸¸é °¡»ó ÇÔ¼öÀÇ Á¤ÀÇ¿Í Çʿ伺, ±×¸®°í ÀåÁ¡¿¡ ´ëÇØ È®½ÇÇÏ°Ô ´À³¥ ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â ¿©·¯ °¡Áö µµÇüÀ» ±×¸®°í °ü¸®ÇÏ´Â ±×·¡ÇÈ ÆíÁý ÇÁ·Î±×·¥ÀÇ ±¸Çö ¿¹ÀÌ´Ù. °¢°¢ÀÇ ±×·¡ÇÈ °´Ã¼µéÀº Graphic Ŭ·¡½º·ÎºÎÅÍ ÆÄ»ýµÇ´Â Ŭ·¡½ºÀÇ °´Ã¼·Î Ç¥ÇöÇÏ¸ç ¸ðµÎ Draw¶ó´Â ¸â¹ö ÇÔ¼ö¸¦ °¡Áö°í ÀÖ¾î ½º½º·Î ÀÚ½ÅÀ» ±×¸± ¼ö ÀÖ´Ù. ¹°·Ð ÄÜ¼Ö È¯°æ¿¡¼ ÁøÂ¥ ±×·¡ÇÈÀ» ±×¸± ¼ö´Â ¾øÀ¸¹Ç·Î ¹®ÀÚ¿À» Ãâ·ÂÇÏ´Â °ÍÀ¸·Î ±×·¡ÇÈ Ãâ·Â Èä³»¸¸ ³½´Ù.
¿¹ Á¦ : GraphicObject |
#include <Turboc.h>
class Graphic
{
public:
void Draw() { puts("±×·¡ÇÈ ¿ÀºêÁ§Æ®ÀÔ´Ï´Ù."); }
};
class Line : public Graphic
{
public:
void Draw() { puts("¼±À» ±ß½À´Ï´Ù."); }
};
class Circle : public Graphic
{
public:
void Draw() { puts("µ¿±×¶ó¹Ì ±×·È´Ù Ä¡°í."); }
};
class Rect : public Graphic
{
public:
void Draw() { puts("¿ä°Ç »ç°¢ÇüÀÔ´Ï´Ù."); }
};
void main()
{
Graphic *ar[10]={
new Graphic(),new Rect(),new Circle(),new Rect(),new Line(),
new Line(),new Rect(),new Line(),new Graphic(),new Circle() };
int i;
for (i=0;i<10;i++) {
ar[i]->Draw();
}
for (i=0;i<10;i++) {
delete ar[i];
}
}
4°³ÀÇ Å¬·¡½º°¡ Á¤ÀǵǾî Àִµ¥ ±×·¡ÇÈ Å¬·¡½ºÀÇ °èÃþÀº ´ÙÀ½°ú °°´Ù.
»ç¿ëÀÚ´Â ¸¶¿ì½º¸¦ »ç¿ëÇÏ¿© ±×·¡ÇÈ °´Ã¼µéÀ» ±×¸®°í À̵¿½ÃÅ°°í ÆíÁýÇÒ °ÍÀ̸ç ÇÁ·Î±×·¥Àº »ç¿ëÀÚ¿¡ ÀÇÇØ »ý¼ºµÇ´Â ±×·¡ÇÈ °´Ã¼ÀÇ ÁýÇÕÀ» °ü¸®Çϱâ À§ÇØ µ¿Àû ¹è¿À̳ª ¿¬°á ¸®½ºÆ®¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. ÀÌ ¿¹Á¦´Â °´Ã¼ÀÇ ÁýÇÕÀ» °ü¸®Çϱâ À§ÇØ Å©±â 10ÀÇ Graphic *Çü ¹è¿À» ¼±¾ðÇÏ°í ÀÌ ¹è¿¿¡ Graphic ÆÄ»ý Ŭ·¡½ºÀÇ °´Ã¼ Æ÷ÀÎÅ͸¦ ÀúÀåÇß´Ù. ºÎ¸ðÇüÀÇ Æ÷ÀÎÅÍ°¡ ÀÚ½Ä °´Ã¼¸¦ °¡¸®Å³ ¼ö ÀÖÀ¸¹Ç·Î ÃÖ»óÀ§ Ŭ·¡½ºÀÎ GraphicÀÇ Æ÷ÀÎÅÍ ¹è¿À» ¼±¾ðÇÏ¸é ¸ðµç ±×·¡ÇÈ °´Ã¼ÀÇ ÁýÇÕÀ» °ü¸®ÇÒ ¼ö ÀÖ´Ù.
À̶§ Graphic *´Â ¸ðµç ÀÚ½Ä Å¬·¡½º¸¦ ´ëÇ¥ÇÏ´Â ´ëÇ¥ ŸÀÔÀ̸ç ÀÌ Å¸ÀÔÀÇ ¹è¿Àº ¸ðµç ÀÚ½Ä °´Ã¼µéÀÇ ¹øÁö¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦ ÇÁ·Î±×·¥À̶ó¸é ÀÌ ¹è¿ÀÇ Å©±â´Â µ¿ÀûÀ¸·Î °ü¸®µÉ °ÍÀÌ°í ¹è¿³»ÀÇ °´Ã¼µéÀ» ÆíÁýÇÏ´Â ±â´ÉÀ» Á¦°øÇØ¾ß ÇÒ °ÍÀÌ´Ù. ¿¹Á¦ÀÇ ar ¹è¿ Ãʱâ½ÄÀº »ç¿ëÀÚ°¡ ÀÌ·± °´Ã¼µéÀ» ¸¸µé¾î ³õÀº »óȲÀ» °¡Á¤Çϱâ À§ÇÑ °ÍÀÌ´Ù.
ÀÌ·¸°Ô ¸¸µé¾îÁø °´Ã¼ÀÇ ÁýÇÕÀ» ȸéÀ¸·Î Ãâ·ÂÇÏ°íÀÚ ÇÑ´Ù¸é ·çÇÁ¸¦ µ¹¸ç ¹è¿¿¡ ÀúÀåµÈ °´Ã¼ÀÇ Æ÷ÀÎÅ͸¦ ²¨³» °¢ °´Ã¼ÀÇ Draw ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù. ¸ðµç °´Ã¼µéÀº ½º½º·Î¸¦ ±×¸± ¼ö ÀÖ´Â Draw ¸â¹ö ÇÔ¼ö¸¦ °¡Áö°í ÀÖ´Ù. ±×·¯³ª ½ÇÇàÇØ º¸¸é ¿øÇÏ´Â °á°ú´Â ³ª¿ÀÁö ¾ÊÀ» °ÍÀ̸ç "±×·¡ÇÈ ¿ÀºêÁ§Æ®ÀÔ´Ï´Ù"¸¸ 10¹ø Ãâ·ÂµÈ´Ù.
¿Ö ÀÌ·¸°Ô Ãâ·ÂµÇ´Â°¡ Çϸé ar ¹è¿ÀÌ Graphic * ŸÀÔÀ» ¿ä¼Ò·Î °¡Áö¹Ç·Î ar[i]¿¡ ÀÇÇØ È£ÃâµÇ´Â Draw´Â Ç×»ó Graphic::Draw·Î Á¤Àû °áÇյDZ⠶§¹®ÀÌ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ¾Õ¿¡¼ ¹è¿î´ë·Î Draw ¸â¹ö ÇÔ¼ö¸¦ °¡»ó ÇÔ¼ö·Î ¼±¾ðÇÏ¸é µÈ´Ù. Graphic::Draw¾Õ¿¡¸¸ virtualÀ» ºÙÀ̸é ÆÄ»ý Ŭ·¡½ºµµ ÀÚµ¿À¸·Î °¡»óÀÌ µÈ´Ù. ¹°·Ð ¿øÄ¢´ë·Î ÇÏÀÚ¸é ¸ðµç ÆÄ»ý Ŭ·¡½ºÀÇ Draw¿¡µµ virtualÀ» ºÙÀÌ´Â °ÍÀÌ ÁÁ´Ù.
class Graphic
{
public:
virtual void Draw() { puts("±×·¡ÇÈ ¿ÀºêÁ§Æ®ÀÔ´Ï´Ù."); }
};
ÀÌ·¸°Ô Çϸé ÄÄÆÄÀÏ·¯°¡ °¢ Ŭ·¡½ºÀÇ Draw ÇÔ¼ö ¹øÁö¸¦ vtable¿¡ ÀÛ¼ºÇÏ°í »ý¼ºµÇ´Â ¸ðµç °´Ã¼¿¡ vptrÀ» ºÙ¿© µ¿Àû °áÇÕÀ» À§ÇÑ Áغñ¸¦ ÇÑ´Ù. Draw ÇÔ¼ö´Â ÀÚ½ÅÀ» È£ÃâÇÏ´Â °´Ã¼ÀÇ Å¸ÀÔ¿¡ ¸Â´Â ¹öÀüÀ¸·Î ¼±ÅÃ(µ¿Àû °áÇÕ)µÉ °ÍÀÌ°í ¹è¿¿¡ ÀúÀåµÈ °´Ã¼µéÀÌ Á¦´ë·Î ±×·ÁÁø´Ù.
±×·¡ÇÈ ¿ÀºêÁ§Æ®ÀÔ´Ï´Ù.
¿ä°Ç »ç°¢ÇüÀÔ´Ï´Ù.
µ¿±×¶ó¹Ì ±×·È´Ù Ä¡°í.
¿ä°Ç »ç°¢ÇüÀÔ´Ï´Ù.
¼±À» ±ß½À´Ï´Ù.
¼±À» ±ß½À´Ï´Ù.
¿ä°Ç »ç°¢ÇüÀÔ´Ï´Ù.
¼±À» ±ß½À´Ï´Ù.
±×·¡ÇÈ ¿ÀºêÁ§Æ®ÀÔ´Ï´Ù.
µ¿±×¶ó¹Ì ±×·È´Ù Ä¡°í.
¶È°°Àº ar[i]->Draw() È£ÃâÀÓ¿¡µµ ar[i]°¡ °¡¸®Å°´Â µ¿Àû ŸÀÔ¿¡ µû¶ó ½ÇÁ¦·Î ±×·ÁÁö´Â ¸ð¾çÀº ´Þ¶óÁö´Âµ¥ ±×·¡¼ °¡»ó ÇÔ¼öÀÇ µ¿ÀÛÀÌ ´ÙÇüÀûÀ̶ó°í ÇÏ´Â °ÍÀÌ´Ù.
¸¸¾à µ¿Àû °áÇÕÀ» ÇÏ´Â °¡»ó ÇÔ¼ö¶ó´Â ÀåÄ¡°¡ ¾ø´Ù¸é ¶È°°Àº È£Ãâ·Î ´Ù¾çÇÑ µµÇüÀ» ±×¸± ¼ö°¡ ¾ø´Ù. °¢ °´Ã¼¿¡ ½º½º·ÎÀÇ Å¸ÀÔÀ» ÆǺ°ÇÒ ¼ö ÀÖ´Â º°µµÀÇ ¿°ÅÇü ¸â¹ö¸¦ Ãß°¡ÇÏ°í ÀÌ ¸â¹ö·ÎºÎÅÍ Å¸ÀÔÀ» ÆǺ°ÇÏ¿© ÀÚ½ÅÀ» ±×¸± ¸â¹ö ÇÔ¼ö¸¦ °áÁ¤ÇÏ´Â ´ÙÁß ºÐ±â¸¦ ÇØ¾ß ÇÒ °ÍÀÌ´Ù.
for (i=0;i<10;i++) {
switch (ar[i].Type) {
case GR_GRAPHIC:
((Graphic *)ar[i])->Draw();
break;
case GR_LINE:
((Line *)ar[i])->Draw();
break;
case GR_CIRCLE:
((Circle *)ar[i])->Draw();
break;
case GR_RECT:
((Rect *)ar[i])->Draw();
break;
}
}
»Ó¸¸ ¾Æ´Ï¶ó ÀÌÈÄ µµÇüÀÇ Á¾·ù°¡ ´Ã¾î³ª¸é ÀÌ ºÐ±â¹®ÀÇ caseµµ °°ÀÌ ´Ã¾î³ª¾ß ÇϹǷΠÄڵ带 °ü¸®Çϱ⵵ ¾ÆÁÖ ¾î·Á¿öÁø´Ù. ÀÌ¿¡ ºñÇØ °¡»ó ÇÔ¼ö´Â È£Ãâ °´Ã¼¿¡ µû¶ó ¼±ÅõǴ µ¿Àû °áÇÕ ´É·ÂÀÌ ÀÖÀ¸¹Ç·Î ar[i]->Draw() È£Ã⸸ Çϸé Graphic ÆÄ»ý Ŭ·¡½º¿¡ ´ëÇؼ´Â ¸ðµÎ Á¤È®ÇÏ°Ô µ¿ÀÛÇÒ »Ó¸¸ ¾Æ´Ï¶ó ¹Ì·¡¿¡ »õ·Î¿î Ŭ·¡½º°¡ Ãß°¡µÇ´õ¶óµµ ÀÌ ÄÚµå´Â ´õ ÀÌ»ó °íÄ¥ ÇÊ¿ä°¡ ¾ø¾îÁø´Ù. °ú¿¬ ±×·±Áö »ï°¢Çü µµÇüÀ» Ãß°¡ÇØ º¸ÀÚ.
class Triangle : public Graphic
{
public:
void Draw() { puts("³ª´Â »õ·Î Ãß°¡µÈ »ï°¢ÇüÀÌ´Ù."); }
};
ÀÌ Å¬·¡½º¸¦ Ãß°¡ÇÏ°í mainÀÇ ar ¹è¿¿¡ »ï°¢Çü µµÇü »ý¼º¹®À» Çϳª ÀÛ¼ºÇÑ ÈÄ ½ÇÇàÇØ º¸¸é »ï°¢Çü µµÇüµµ Àß ±×·ÁÁüÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦ µµÇüÀ» ±×¸®´Â ÄÚµåÀÎ ar[i]->Draw()´Â ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç ÀüÇô ÆíÁýÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ½ÉÁö¾î ÀÌ Äڵ尡 ÀÌ¹Ì ÄÄÆÄÀϵǾî À־ È®À强¿¡´Â ¾Æ¹« ¹®Á¦°¡ ¾ø´Ù. vptr·ÎºÎÅÍ vtableÀ» ã°í vtable¿¡¼ È£ÃâÇÒ ÇÔ¼ö¸¦ ã´Â ³í¸®´Â µ¿ÀÏÇϹǷΠÂüÁ¶ÇÏ´Â vtable¸¸ »õ·Î Ãß°¡µÈ µµÇüÀÇ °ÍÀ¸·Î ¹Ù²î¸é µÈ´Ù. ÇÁ·Î±×·¥À» È®ÀåÇÏ·Á¸é Ŭ·¡½º´Â °è¼Ó ´Ã·Á¾ß°ÚÁö¸¸ °´Ã¼µéÀ» °ü¸®ÇÏ´Â ÄÚµå´Â ´õ ÀÌ»ó ¼öÁ¤ÇÏÁö ¾Ê¾Æµµ µÇ´Â °ÍÀÌ´Ù.
óÀ½ºÎÅÍ Å¬·¡½º °èÃþÀ» Á¶Á÷ÀûÀ¸·Î ¼³°èÇÏ°í °¡»ó ÇÔ¼ö¸¦ Àß ÀÛ¼ºÇØ ³õÀ¸¸é ÄÚµå °ü¸®ÀÇ À¯¿¬¼ºÀÌ ±ØÀûÀ¸·Î Çâ»óµÈ´Ù. ½ÇÁ¦·Î ÀÌ·± ±×·¡ÇÈÀ» ±×¸®°í °ü¸®ÇÏ´Â ´ëÇ¥ÀûÀÎ ÇÁ·Î±×·¥ÀÎ ÆÄ¿öÆ÷ÀÎÅÍÀÇ °æ¿ì¸¦ º¸ÀÚ. ÀÌ ÇÁ·Î±×·¥Àº ´Ù¾çÇÑ °¢¾à °¢»öÀÇ µµÇüµéÀ» ±×¸®°í °ü¸®ÇÒ ¼ö ÀÖ´Ù.
ÀÌ ÇÁ·Î±×·¥ÀÇ ³»ºÎ¿¡´Â ¸ðµç µµÇüµéÀ» ´ëÇ¥ÇÒ ¼ö Àִ Ŭ·¡½º ŸÀÔ(¿¹¸¦ µé¸é GraphicÀ̳ª Shape µî)ÀÌ ¼±¾ðµÇ¾î ÀÖÀ» °ÍÀÌ°í °¢ µµÇüµéÀº ÀÌ Å¬·¡½ºÀÇ ÆÄ»ý Ŭ·¡½º·Î Ç¥ÇöµÉ °ÍÀÌ´Ù. ÆÄ»ý Ŭ·¡½ºµéÀº µµÇü °ü¸®¿¡ ÇÊ¿äÇÑ ¸ðµç ¸â¹ö ÇÔ¼ö¸¦ µµÇü¿¡ ¸Â´Â °¡»ó ÇÔ¼ö·Î Á¤ÀÇÇÏ°í ÀÖ´Ù. ±×·¡¼ ¶È°°Àº ¹æ¹ýÀ¸·Î °¡»ó ÇÔ¼ö¸¸ È£ÃâÇÏ¸é ¸ðµç µµÇüÀ» ÀÏ°üµÈ ¹æ¹ýÀ¸·Î °ü¸®ÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ±×¸®±â »Ó¸¸ ¾Æ´Ï¶ó µµÇüÀ» ÆíÁýÇÏ´Â ÄÚµåµéµµ ¸ðµÎ ¸¶Âù°¡ÁöÀÌ´Ù.
¸¶¿ì½º µå·¡±× ½Ã : Move °¡»ó ÇÔ¼ö È£Ãâ
Æ®·¡Ä¿ µå·¡±× ½Ã : Resize °¡»ó ÇÔ¼ö È£Ãâ
´õºíŬ¸¯½Ã : SetProperty °¡»ó ÇÔ¼ö È£Ãâ
¸¸¾à ÀÌ·± ½ÄÀ¸·Î °¡»ó ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é ¼ö¸¹Àº µµÇü¿¡ ´ëÇØ ¶ÇÇÑ °¢ µ¿ÀÛ¿¡ ´ëÇØ if else if³ª switch case·Î °ü¸®ÇØ¾ß Çϴµ¥ ÀÌ´Â ³Ê¹« ³Ê¹« ºñÈ¿À²ÀûÀÌ°í º¹ÀâÇÏ´Ù. Ŭ·¡½º °èÃþÀ» Àß ¸¸µé¾î ³õ°í ÆÄ»ý Ŭ·¡½º°¡ ÀûÀýÈ÷ °¡»ó ÇÔ¼ö¸¦ ÀçÁ¤ÀÇÇÏ¸é µµÇüÀÇ Á¾·ù¿¡ »ó°ü¾øÀÌ ÇÊ¿äÇÑ °¡»ó ÇÔ¼ö¸¸ È£ÃâÇÏ¿© µµÇü¿¡ µû¶ó ´ÙÇüÀûÀ¸·Î µ¿ÀÛÇÒ ¼ö ÀÖ´Ù. °¡»ó ÇÔ¼ö¸¦ ¸¸µé¾î ³õÀ¸¸é ÀÌÈÄ Ãß°¡µÇ´Â µµÇüµµ GraphicÀ¸·ÎºÎÅÍ »ó¼Ó¹Þ°í °¡»ó ÇÔ¼ö¸¸ ÀçÁ¤ÀÇÇÏ¸é µÈ´Ù. °ü¸® Äڵ带 ¿Ïº®ÇÏ°Ô ÀÛ¼ºÇØ ³õ°í Ŭ·¡½º¸¸ ´Ã·Á°¡¸é ´ë±Ô¸ðÀÇ ÇÁ·Î±×·¥À» ½±°Ô ¸¸µé ¼ö ÀÖ´Ù.
±¸ÇöÀÌ Á¶±Ý¾¿ ´Ù¸¥ °´Ã¼ÀÇ ÁýÇÕÀ» °ü¸®ÇÒ ¶§´Â °¡»ó ÇÔ¼ö¸¦ ²À »ç¿ëÇØ¾ß ÇÑ´Ù. °´Ã¼¿¡ µû¶ó ´Þ¶óÁö´Â µ¿ÀÛÀ» °áÁ¤ÇÏ´Â ÀÛ¾÷Àº °³¹ßÀÚ°¡ Á÷Á¢ ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸ç ÄÄÆÄÀÏ·¯°¡ µ¿Àû °áÇÕÀ» À§ÇÑ ¸ðµç Áغñ¸¦ ÇÏ°í ½ÇÇàÁß¿¡ ÀûÇÕÇÑ ÇÔ¼ö¸¦ È£ÃâÇÒ °ÍÀÌ´Ù. °¡»ó ÇÔ¼ö¸¦ ¾²±â À§Çؼ´Â Ŭ·¡½º °èÃþÀÌ ÀÖ¾î¾ß ÇÑ´Ù. ±×·¡¼ ´ÙÇü¼ºÀÇ ÀüÁ¦ Á¶°ÇÀÌ ¹Ù·Î »ó¼ÓÀÎ °ÍÀÌ´Ù.