30-3.¼ø¼ö °¡»ó ÇÔ¼ö

30-3-°¡.Á¤ÀÇ

°¡»ó ÇÔ¼ö´Â ÆÄ»ý Ŭ·¡½º°¡ ¾ÈÀüÇÏ°Ô ÀçÁ¤ÀÇÇÒ ¼ö ÀÖ´Â ÇÔ¼öÀÌ´Ù. ¸¸¾à »ó¼Ó °ü°è°¡ ¾Æ´Ï¶ó¸é °¡»ó ÇÔ¼ö¸¦ ¼±¾ðÇÒ ÇÊ¿ä°¡ ¾øÀ¸¹Ç·Î °¡»ó ÇÔ¼ö´Â »ó¼Ó °èÃþ³»¿¡¼­¸¸ Àǹ̰¡ ÀÖÀ¸¸ç ÆÄ»ý Ŭ·¡½º¿¡°Ô ÀçÁ¤ÀÇ ±âȸ¸¦ ÁÖ±â À§ÇØ Á¸ÀçÇÏ´Â °ÍÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª °¡»ó ÇÔ¼ö¸¦ ¹Ýµå½Ã ÀçÁ¤ÀÇÇؾ߸¸ ÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. ±â¹Ý Ŭ·¡½ºÀÇ µ¿ÀÛÀ» ±×´ë·Î ¾²°í ½ÍÀ¸¸é ´Ü¼øÈ÷ »ó¼Ó¸¸ ¹Þ°í º¯°æÇÒ ÇÊ¿ä°¡ ÀÖÀ» ¶§¸¸ ÀçÁ¤ÀÇÇÏ¸é µÈ´Ù. ±â¹Ý Ŭ·¡½º°¡ °¡»ó ÇÔ¼ö¸¦ ¸¸µå´Â ÀÌÀ¯´Â Ȥ½Ã¶óµµ ÀçÁ¤ÀÇÇÏ°í Æ÷ÀÎÅͷΠȣÃâÇÒ ¶§¸¦ ´ëºñÇÑ °ÍÀÌ´Ù. °¡»ó ÇÔ¼ö´Â ÀçÁ¤ÀÇÇصµ µÇ´Â ÇÔ¼öÀÌÁö ¹Ýµå½Ã ÀçÁ¤ÀÇÇØ¾ß ÇÏ´Â ÇÔ¼ö´Â ¾Æ´Ï´Ù.

ÀÌ¿¡ ºñÇØ ¼ø¼ö °¡»ó ÇÔ¼ö(Pure Virtual Function)´Â ÆÄ»ý Ŭ·¡½º¿¡¼­ ¹Ýµå½Ã ÀçÁ¤ÀÇÇØ¾ß ÇÏ´Â ÇÔ¼öÀÌ´Ù. ¼ø¼ö °¡»ó ÇÔ¼ö´Â ÀϹÝÀûÀ¸·Î ÇÔ¼öÀÇ µ¿ÀÛÀ» Á¤ÀÇÇÏ´Â º»Ã¼¸¦ °¡ÁöÁö ¾ÊÀ¸¸ç µû¶ó¼­ ÀÌ »óÅ¿¡¼­´Â È£ÃâÇÒ ¼ö ¾ø´Ù. º»Ã¼°¡ ¾ø´Ù´Â ¶æÀ¸·Î ÇÔ¼ö ¼±¾ðºÎÀÇ ³¡¿¡ =0À̶ó´Â Ç¥±â¸¦ Çϴµ¥ ÀÌ´Â ÇÔ¼ö¸¸ ÀÖ°í ÄÚµå´Â ºñ¾î ÀÖ´Ù´Â ¶æÀÌ´Ù. ´ÙÀ½ ¿¹Á¦¸¦ ÅëÇØ ¼ø¼ö °¡»ó ÇÔ¼öÀÇ Á¤ÀǸ¦ ¿¬±¸ÇØ º¸ÀÚ.

 

¿¹ Á¦ : PureVirt

#include <Turboc.h>

 

class Graphic

{

public:

     virtual void Draw()=0;

};

 

class Line : public Graphic

{

public:

     virtual void Draw() { puts("¼±À» ±ß½À´Ï´Ù."); }

};

 

class Circle : public Graphic

{

public:

     virtual void Draw() { puts("µ¿±×¶ó¹Ì ±×·È´Ù Ä¡°í."); }

};

 

class Rect : public Graphic

{

public:

     virtual void Draw() { puts("¿ä°Ç »ç°¢ÇüÀÔ´Ï´Ù."); }

};

 

void main()

{

     Graphic *pG[3];

     int i;

 

//  Graphic G;

     pG[0]=new Line;

     pG[1]=new Circle;

     pG[2]=new Rect;

 

     for (i=0;i<3;i++) {

          pG[i]->Draw();

     }

 

     for (i=0;i<3;i++) {

          delete pG[i];

     }

}

 

¾Õ Àý¿¡¼­ ¸¸µé¾ú´ø µµÇü ÆíÁý ÇÁ·Î±×·¥ÀÇ ÄÚµåÀε¥ Graphic Ŭ·¡½ºÀÇ Draw ÇÔ¼ö°¡ ¼ø¼ö °¡»ó ÇÔ¼ö·Î ¼±¾ðµÇ¾î ÀÖ´Ù. ÀÌó·³ Çϳª ÀÌ»óÀÇ ¼ø¼ö °¡»ó ÇÔ¼ö¸¦ °¡Áö´Â Ŭ·¡½º¸¦ Ãß»ó Ŭ·¡½º(Abstract Class)¶ó°í ÇÑ´Ù. Ãß»ó Ŭ·¡½º´Â µ¿ÀÛÀÌ Á¤ÀǵÇÁö ¾ÊÀº ¸â¹ö ÇÔ¼ö¸¦ °¡Áö°í Àֱ⠶§¹®¿¡ ÀÌ »óÅ·δ ÀνºÅϽº¸¦ »ý¼ºÇÒ ¼ö ¾ø´Ù. À§ ¿¹Á¦¿¡¼­ Graphic G ¼±¾ð¹®ÀÇ ÁÖ¼®À» Ç®¾î º¸¸é ¼ø¼ö °¡»ó ÇÔ¼ö°¡ ÀÖ¾î ÀνºÅϽº¸¦ ¸¸µé ¼ö ¾ø´Ù´Â ¿¡·¯°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù.

Ãß»ó Ŭ·¡½ºÀÇ ¹Ý´ë °³³äÀº ±¸Ã¼ Ŭ·¡½º(Concrete Class)Àε¥ À§ ¿¹Á¦ÀÇ Line, Circle, Rect µîÀÌ ±¸Ã¼ Ŭ·¡½ºÀÇ ¿¹À̸ç Áö±Ý±îÁö ÀÛ¼ºÇß´ø ÀϹÝÀûÀΠŬ·¡½ºµéÀº ¸ðµÎ ±¸Ã¼ Ŭ·¡½ºÀÌ´Ù. ÀÌ·± Ŭ·¡½ºµéÀº Çö½Ç ¼¼°èÀÇ ¼±, ¿ø, »ç°¢ÇüÀ̶ó´Â ±¸Ã¼ÀûÀÎ ´ë»óÀ» Ç¥ÇöÇÏ°í ÀÖÀ¸¸ç ´ë»ó Ç¥ÇöÀ» À§ÇÑ ¸ðµç ¼Ó¼º°ú µ¿ÀÛÀ» Æ÷ÇÔÇÏ°í ÀÖ´Ù. ¿¹Á¦¿¡¼­´Â ÆíÀÇ»ó ¹®ÀÚ¿­ Ãâ·ÂÀ¸·Î ±×¸®±â¸¦ ´ë½ÅÇÏ´Â »ç±â Çà°¢À» ¹úÀÌ°í ÀÖÁö¸¸ Á¦´ë·Î ¸¸µç´Ù¸é ÀÌ Å¬·¡½ºµé¿¡ ½ÃÀÛÁ¡, ³¡Á¡, ¹ÝÁö¸§, ¼±±½±â µûÀ§ÀÇ Á¤º¸µéÀÌ Æ÷Ç﵃ °ÍÀÌ´Ù.

±×·¯³ª Ãß»ó Ŭ·¡½ºÀÎ GraphicÀº µµÇüÀ̶ó´Â ³Ê¹« ÀϹÝÀûÀÎ ´ë»óÀ» Ç¥ÇöÇϱ⠶§¹®¿¡ ±×¸®±â¿Í °ü·ÃµÈ ¾î¶°ÇÑ Á¤º¸µµ °¡Áú ¼ö ¾øÀ¸¸ç µû¶ó¼­ µ¿ÀÛµµ Á¤ÀÇÇÒ ¼ö ¾ø´Ù. ±×·¯´Ù º¸´Ï ÀÌ·± ŸÀÔÀÇ °´Ã¼¸¦ »ý¼ºÇÏ´Â °ÍÀº ¾Æ¹« Àǹ̰¡ ¾ø´Â °ÍÀÌ´Ù. ±×·¸´Ù¸é °´Ã¼¸¦ ¸¸µéÁöµµ ¸øÇÏ´Â Ãß»ó Ŭ·¡½º´Â µµ´ëü ¿Ö Á¤ÀÇÇÏ´Â °ÍÀϱî? Ãß»ó Ŭ·¡½º´Â Line, Circle, Rect ±¸Ã¼ Ŭ·¡½ºÀÇ °øµ¿ÀÇ Á¶»óÀÌ µÇ¾î ÀÌ °´Ã¼µéÀÇ ÁýÇÕÀ» °ü¸®Çϱâ À§ÇØ ÇÊ¿äÇÏ´Ù.

Ãß»ó Ŭ·¡½ºÀÇ °´Ã¼¸¦ »ý¼ºÇÒ ¼ö´Â ¾øÁö¸¸ Ãß»ó Ŭ·¡½º ŸÀÔÀÇ Æ÷ÀÎÅ͸¦ ¼±¾ðÇÒ ¼ö´Â ÀÖ´Ù. ±×·¡¼­ Graphic *ÀÇ ¹è¿­À» ¼±¾ðÇϸé ÀÌ ¹è¿­·Î Graphic ÆÄ»ý Ŭ·¡½ºÀÇ °´Ã¼ ÁýÇÕÀ» °ü¸®ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à GraphicÀ̶ó´Â Ãß»ó Ŭ·¡½º°¡ ¾ø´Ù¸é Line, Circle, Rect¶ó´Â µµÇüÀÇ ÁýÇÕÀ» ¾î¶»°Ô °ü¸®ÇÒ ¼ö ÀÖÀ» °ÍÀΰ¡ »ý°¢ÇØ º¸¶ó. LineÀ» ÆÄ»ýÇؼ­ CircleÀ» ¸¸µé°Å³ª LineÀ¸·ÎºÎÅÍ Rect¸¦ Á¤ÀÇÇÒ ¼ö´Â ¾ø´Âµ¥ ¿Ö³ÄÇϸé ÀÌ µµÇüµéÀº IS A °ü°è°¡ ¼º¸³ÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. À̵éÀº ÇüÁ¦ °ü°è¶ó°í´Â ÇÒÁö¾ðÁ¤ ºÎ¸ð ÀÚ½Ä °ü°è°¡ µÉ ¼ö´Â ¾ø´Ù. ±×·¡¼­ ºñ·Ï °´Ã¼¸¦ »ý¼ºÇÒ ¼ö ¾ø´Â Ãß»ó Ŭ·¡½º¶óµµ »ó¡ÀûÀÎ °øµ¿ÀÇ Á¶»óÀÌ ÇÊ¿äÇÑ °ÍÀÌ´Ù.

Ãß»ó Ŭ·¡½ºÀÇ ¶Ç ´Ù¸¥ Áß¿äÇÑ ¿ªÇÒÀº ´ÙÇüÀûÀÎ ÇÔ¼öÀÇ ÁýÇÕÀ» Á¤ÀÇÇÏ´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î µµÇüÀ̶ó ÇÑ´Ù¸é ´ç¿¬È÷ ÀÚ½ÅÀ» ±×¸± ¼ö ÀÖ´Â ±â´É(Draw)ÀÌ ÇÊ¿äÇÏ°í À̵¿(Move)ÇÒ ¼ö ÀÖ¾î¾ß Çϸç Å©±â¸¦ º¯°æ(Resize)ÇÒ ¼öµµ ÀÖÀ» °ÍÀÌ´Ù. µµÇüÀÌ µÇ±â À§ÇØ ²À ÇÊ¿äÇÑ ÇÔ¼öÀÇ ÁýÇÕÀ» Ãß»ó Ŭ·¡½º¿¡ ¼ø¼ö °¡»ó ÇÔ¼ö·Î ¼±¾ðÇØ µÎ¸é ÀÌ Å¬·¡½º·ÎºÎÅÍ ÆÄ»ýµÇ´Â µµÇü Ŭ·¡½º´Â ÀÌ °¡»ó ÇÔ¼ö¸¦ ¹Ýµå½Ã ÀçÁ¤ÀÇÇØ¾ß ÇÑ´Ù´Â Àǹ«°¡ »ý±ä´Ù. ¹°·Ð ±× ¿Ü¿¡ ´õ ÇÊ¿äÇÑ ¸â¹öµéÀ» Ãß°¡ÇÒ ¼ö ÀÖÀ½Àº ¹°·ÐÀÌ´Ù.

¸¸¾à ÆÄ»ý Ŭ·¡½º°¡ Ãß»ó Ŭ·¡½ºÀÇ ¼ø¼ö °¡»ó ÇÔ¼ö¸¦ ÀçÁ¤ÀÇÇÏÁö ¾Ê´Â´Ù¸é ÀÌ Å¬·¡½ºµµ ¿©ÀüÈ÷ Ãß»ó Ŭ·¡½ºÀ̹ǷΠÀνºÅϽº¸¦ »ý¼ºÇÒ ¼ö ¾ø´Ù. Áï Draw, Resize, Move Áß Çϳª¶óµµ ÇÒ ¼ö ¾ø´Ù¸é ÀÌ´Â ½Ç¼¼°è¿¡ Á¸ÀçÇÏ´Â µµÇüÀÌ ¾Æ´Ñ °ÍÀÌ´Ù. Ãß»ó Ŭ·¡½º´Â µµÇüÀÌ µÇ±â À§ÇØ ÇÊ¿äÇÑ ±â´ÉÀÇ ¸ñ·Ï°ú ¿øÇü¸¸ Á¤ÀÇÇÏ°í ½ÇÁ¦ ±¸ÇöÀº ÆÄ»ý Ŭ·¡½º°¡ ÀçÁ¤ÀÇÇØ¾ß ÇÑ´Ù. À̶§ Ãß»ó Ŭ·¡½º°¡ Á¤ÀÇÇÏ´Â ±â´É ¸ñ·ÏÀ» ÀÎÅÍÆäÀ̽º¶ó°í ÇÑ´Ù. À§ ¿¹Á¦ÀÇ Graphic Ãß»ó Ŭ·¡½º´Â °³¹ßÀÚ¿¡°Ô "µµÇüÀÌ µÇ±â À§Çؼ­´Â Àû¾îµµ ÀÌ Á¤µµÀÇ ±â´ÉÀº ²À ÇÊ¿äÇÏ´Ù"¶ó´Â °ÍÀ» °­Á¦ÇÏ°í ÀÖ´Â °ÍÀÌ´Ù.

¼ø¼ö °¡»ó ÇÔ¼ö´Â ÀÌ·¯ ÀÌ·¯ÇÑ µ¿ÀÛÀÌ ÇÊ¿äÇÏ´Ù´Â °Í¸¸ Ç¥ÇöÇÒ »ÓÀ̹ǷΠÅë»ó =0 ·Î Ç¥±âÇÏ°í ±¸Ã¼ÀûÀÎ µ¿ÀÛÀ» ±â¼úÇÏ´Â º»Ã¼¸¦ °¡ÁöÁö ¾Ê´Â´Ù. ±×·¯³ª ¿øÇÑ´Ù¸é ±×¸®°í ÇÊ¿äÇÏ´Ù¸é ¼ø¼ö °¡»ó ÇÔ¼öµµ º»Ã¼¸¦ °¡Áú ¼ö´Â ÀÖ´Ù. ÈļյéÀÌ µ¿ÀÛÇϴµ¥ °øÅëÀûÀ¸·Î ÇÊ¿äÇÑ ±¸ÇöÀÌ ÀÖ´Ù¸é Ãß»ó Ŭ·¡½ºÀÇ ¼ø¼ö °¡»ó ÇÔ¼ö¿¡ ÀÌ Äڵ带 ¹Ì¸® ÀÛ¼ºÇØ ³ÖÀ» ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î µµÇüÀ» ±×¸®±â Àü¿¡ È­¸éÀ» ¸ÕÀú Áö¿ì´Â Áغñ µ¿ÀÛÀÌ ÇÊ¿äÇÏ´Ù¸é ÆÄ»ý Ŭ·¡½ºÀÇ Draw°¡ ÀÏÀÏÀÌ ÀÌ ÀÛ¾÷À» ÇÏÁö ¾Êµµ·Ï Ãß»ó Ŭ·¡½ºÀÇ ¼ø¼ö °¡»ó ÇÔ¼ö°¡ ÀÌ Äڵ带 ±¸ÇöÇÑ´Ù.

 

class Graphic

{

public:

     virtual void Draw()=0 { clrscr(); }

};

 

ÇÔ¼ö ¼±¾ð¹®¿¡ =0 °¡ ÀÖÀ¸¸é¼­µµ º»Ã¼°¡ Á¤ÀǵǾî ÀÖ´Ù. ÀÌ·² °æ¿ì ÆÄ»ý Ŭ·¡½ºÀÇ Draw ÇÔ¼öµéÀº Graphic::Draw¸¦ ¸ÕÀú È£ÃâÇÏ¿© È­¸éÀ» Áö¿ì´Â µ¿ÀÛÀ» Ãß»ó Ŭ·¡½ºÀÇ Draw ÇÔ¼ö¿¡°Ô ºÎŹÇÒ ¼ö ÀÖ´Ù. ±×¸®°í ±ú²ýÇØÁø È­¸é¿¡¼­ ÀڱⰡ ÇÏ°í ½ÍÀº ÀÏÀ» ÇÏ´Â °ÍÀÌ´Ù.

 

class Line : public Graphic

{

public:

     virtual void Draw() { Graphic::Draw();puts("¼±À» ±ß½À´Ï´Ù."); }

};

 

Graphic::Draw ÇÔ¼ö°¡ È­¸éÀ» Áö¿ì´Â Áغñ µ¿ÀÛÀ» ´ë½Å ÇϹǷΠÀÌ ÇÔ¼ö¸¦ ¸ÕÀú È£ÃâÇÑ ÈÄ ¼±À» ±×À¸¸é ±ú²ýÇÑ È­¸é¿¡ ¼±ÀÌ Ãâ·ÂµÉ °ÍÀÌ´Ù. ¹°·Ð ÀÌ ¿¹Á¦ÀÇ °æ¿ì Graphic::Draw()º¸´Ù clrscr() È£ÃâÀÌ ´õ ª¾Æ ±»ÀÌ ±â¹Ý Ŭ·¡½º¸¦ È£ÃâÇÒ ÇÊ¿ä¾øÀÌ ÆÄ»ý Ŭ·¡½º°¡ Á÷Á¢ clrscr()À» È£ÃâÇÏ´Â °ÍÀÌ ´õ Æí¸®ÇÒ °ÍÀÌ´Ù. ±×·¯³ª ÀÌ ¿¹ÀÇ clrscr()Àº ±×¸®±â¿¡ ÇÊ¿äÇÑ Áغñ µ¿ÀÛ¿¡ ´ëÇÑ ºñÀ¯ÀÏ »ÓÀÌ¸ç ¾ó¸¶µçÁö º¹ÀâÇÏ°í ±æ¾îÁú ¼ö ÀÖ´Ù. ±×¸®±â Áغñ °úÁ¤ÀÌ À̺¸´Ù ÈξÀ ´õ º¹ÀâÇÏ´Ù¸é Line, Circle, RectÀÇ Drawµé °¢ÀÚ°¡ ¸Å¹ø ÀÌ ÀÛ¾÷À» ÇÏ´Â °Íº¸´Ù »óÀ§ Ŭ·¡½ºÀÎ Draw¿¡¼­ µü ÇÑ ¹ø¸¸ ÇÏ°í ÆÄ»ý Ŭ·¡½º´Â ÀÌ ÄÚµåµéÀ» È£ÃâÇÏ´Â °ÍÀÌ ´õ È¿À²ÀûÀÌ°í ¹Ýº¹À» ÃÖ¼ÒÈ­ÇÑ´Ù´Â ±âº»ÀûÀÎ ¿øÄ¢¿¡µµ ºÎÇյȴÙ.

¼ø¼ö °¡»ó ÇÔ¼ö°¡ º»Ã¼¸¦ °¡Áö´õ¶óµµ =0·Î ¼±¾ðµÇ¾î Àֱ⠶§¹®¿¡ Graphic Ŭ·¡½º´Â ¿©ÀüÈ÷ Ãß»ó Ŭ·¡½ºÀ̸ç Graphic ŸÀÔÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÒ ¼ö´Â ¾ø´Ù. È­¸éÀ» Áö¿ì´Â °ÍÀº ½ÇÁ¦·Î µµÇüÀ» ±×¸®´Â °ÍÀÌ ¾Æ´Ï¶ó ´Ü¼øÈ÷ µµÇüÀ» ±×¸®±â À§ÇÑ Áغñ µ¿ÀÛÀÏ »ÓÀ̹ǷΠȭ¸é¸¸ Áö¿ö¼­´Â Á¦´ë·Î µÈ µµÇüÀ̶ó ÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ¼ø¼ö °¡»ó ÇÔ¼ö°¡ º»Ã¼¸¦ °¡Áö´Â °æ¿ì´Â ÀϹÝÀûÀÌÁö ¾ÊÁö¸¸ ÆÄ»ýµÈ ±¸Ã¼ Ŭ·¡½ºµé¿¡°Ô ¾î¶² °øµ¿ÀÇ µ¿ÀÛÀ» ¹°·Á ÁÖ°í ½ÍÀ» ¶§ ÀÌ·± ½ÄÀ¸·Î º»Ã¼¸¦ Á¤ÀÇÇÒ ¼öµµ ÀÖ´Ù. ¼ø¼ö °¡»ó ÇÔ¼öÀÇ º»Ã¼´Â Ãß»ó Ŭ·¡½º ÀÚ½ÅÀ» À§ÇÑ °ÍÀÌ ¾Æ´Ï¶ó ÈļյéÀÌ °øÅëÀûÀ¸·Î ¾µ ¼ö ÀÖ´Â ¼­ºê·çƾÀ» Á¦°øÇÏ´Â Àǹ̹ۿ¡ ¾ø´Ù.