30-2.°¡»ó ÇÔ¼öÀÇ È°¿ë

30-2-°¡.°´Ã¼ÀÇ ÁýÇÕ °ü¸®

°¡»ó ÇÔ¼öÀÇ Á¤ÀÇ¿Í µ¿ÀÛ ±×¸®°í ³»ºÎÀûÀÎ ±¸Çö ¹æ¹ý±îÁö ¾Ë¾ÆºÃ´Âµ¥ ÀÌ·± °¡»ó ÇÔ¼ö¸¦ ¾î¶»°Ô Àß È°¿ëÇÒ ¼ö ÀÖÀ»Áö ¿¬±¸ÇØ º¸ÀÚ. °¡»ó ÇÔ¼ö¸¦ ²À »ç¿ëÇØ¾ß ÇÏ´Â °æ¿ì¿Í ±×·¸Áö ¾ÊÀº °æ¿ì°¡ Àִµ¥ °á·Ð¸¸ ¾ê±âÇÏÀÚ¸é µ¿Àû °áÇÕÀÌ ÇÊ¿äÇÒ ¶§ °¡»ó ÇÔ¼ö¸¦ »ç¿ëÇÏ°í ±×·¸Áö ¾ÊÀ» °æ¿ì´Â ºñ°¡»ó ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ±×·¯³ª ÀÌ·± Áöħ¸¸À¸·Î °¡»ó ÇÔ¼ö¸¦ »ç¿ëÇØ¾ß ÇÒ ½ÃÁ¡À» Á¤È®ÇÏ°Ô ¼±Á¤Çϱâ¶õ ½±Áö ¾ÊÀ¸¹Ç·Î °¡»ó ÇÔ¼ö¸¦ Á¦´ë·Î È°¿ëÇÏ´Â ¸î °¡Áö ¿¹µéÀ» ±¸°æÇØ º¸µµ·Ï ÇÏÀÚ.

¿¹¸¦ ±¸°æÇØ º¸¸é °¡»ó ÇÔ¼öÀÇ Á¤ÀÇ¿Í Çʿ伺, ±×¸®°í ÀåÁ¡¿¡ ´ëÇØ È®½ÇÇÏ°Ô ´À³¥ ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â ¿©·¯ °¡Áö µµÇüÀ» ±×¸®°í °ü¸®ÇÏ´Â ±×·¡ÇÈ ÆíÁý ÇÁ·Î±×·¥ÀÇ ±¸Çö ¿¹ÀÌ´Ù. °¢°¢ÀÇ ±×·¡ÇÈ °´Ã¼µéÀº 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À¸·ÎºÎÅÍ »ó¼Ó¹Þ°í °¡»ó ÇÔ¼ö¸¸ ÀçÁ¤ÀÇÇÏ¸é µÈ´Ù. °ü¸® Äڵ带 ¿Ïº®ÇÏ°Ô ÀÛ¼ºÇØ ³õ°í Ŭ·¡½º¸¸ ´Ã·Á°¡¸é ´ë±Ô¸ðÀÇ ÇÁ·Î±×·¥À» ½±°Ô ¸¸µé ¼ö ÀÖ´Ù.

±¸ÇöÀÌ Á¶±Ý¾¿ ´Ù¸¥ °´Ã¼ÀÇ ÁýÇÕÀ» °ü¸®ÇÒ ¶§´Â °¡»ó ÇÔ¼ö¸¦ ²À »ç¿ëÇØ¾ß ÇÑ´Ù. °´Ã¼¿¡ µû¶ó ´Þ¶óÁö´Â µ¿ÀÛÀ» °áÁ¤ÇÏ´Â ÀÛ¾÷Àº °³¹ßÀÚ°¡ Á÷Á¢ ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸ç ÄÄÆÄÀÏ·¯°¡ µ¿Àû °áÇÕÀ» À§ÇÑ ¸ðµç Áغñ¸¦ ÇÏ°í ½ÇÇàÁß¿¡ ÀûÇÕÇÑ ÇÔ¼ö¸¦ È£ÃâÇÒ °ÍÀÌ´Ù. °¡»ó ÇÔ¼ö¸¦ ¾²±â À§Çؼ­´Â Ŭ·¡½º °èÃþÀÌ ÀÖ¾î¾ß ÇÑ´Ù. ±×·¡¼­ ´ÙÇü¼ºÀÇ ÀüÁ¦ Á¶°ÇÀÌ ¹Ù·Î »ó¼ÓÀÎ °ÍÀÌ´Ù.