°¡»ó ÇÔ¼ö´Â ÆÄ»ý Ŭ·¡½º°¡ ¾ÈÀüÇÏ°Ô ÀçÁ¤ÀÇÇÒ ¼ö ÀÖ´Â ÇÔ¼öÀÌ´Ù. ¸¸¾à »ó¼Ó °ü°è°¡ ¾Æ´Ï¶ó¸é °¡»ó ÇÔ¼ö¸¦ ¼±¾ðÇÒ ÇÊ¿ä°¡ ¾øÀ¸¹Ç·Î °¡»ó ÇÔ¼ö´Â »ó¼Ó °èÃþ³»¿¡¼¸¸ Àǹ̰¡ ÀÖÀ¸¸ç ÆÄ»ý Ŭ·¡½º¿¡°Ô ÀçÁ¤ÀÇ ±âȸ¸¦ ÁÖ±â À§ÇØ Á¸ÀçÇÏ´Â °ÍÀ̶ó°í ÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª °¡»ó ÇÔ¼ö¸¦ ¹Ýµå½Ã ÀçÁ¤ÀÇÇؾ߸¸ ÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. ±â¹Ý Ŭ·¡½ºÀÇ µ¿ÀÛÀ» ±×´ë·Î ¾²°í ½ÍÀ¸¸é ´Ü¼øÈ÷ »ó¼Ó¸¸ ¹Þ°í º¯°æÇÒ ÇÊ¿ä°¡ ÀÖÀ» ¶§¸¸ ÀçÁ¤ÀÇÇÏ¸é µÈ´Ù. ±â¹Ý Ŭ·¡½º°¡ °¡»ó ÇÔ¼ö¸¦ ¸¸µå´Â ÀÌÀ¯´Â Ȥ½Ã¶óµµ ÀçÁ¤ÀÇÇÏ°í Æ÷ÀÎÅͷΠȣÃâÇÒ ¶§¸¦ ´ëºñÇÑ °ÍÀÌ´Ù. °¡»ó ÇÔ¼ö´Â ÀçÁ¤ÀÇÇصµ µÇ´Â ÇÔ¼öÀÌÁö ¹Ýµå½Ã ÀçÁ¤ÀÇÇØ¾ß ÇÏ´Â ÇÔ¼ö´Â ¾Æ´Ï´Ù.
ÀÌ¿¡ ºñÇØ ¼ø¼ö °¡»ó ÇÔ¼ö(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 ŸÀÔÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÒ ¼ö´Â ¾ø´Ù. ȸéÀ» Áö¿ì´Â °ÍÀº ½ÇÁ¦·Î µµÇüÀ» ±×¸®´Â °ÍÀÌ ¾Æ´Ï¶ó ´Ü¼øÈ÷ µµÇüÀ» ±×¸®±â À§ÇÑ Áغñ µ¿ÀÛÀÏ »ÓÀ̹ǷΠȸ鸸 Áö¿ö¼´Â Á¦´ë·Î µÈ µµÇüÀ̶ó ÇÒ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. ¼ø¼ö °¡»ó ÇÔ¼ö°¡ º»Ã¼¸¦ °¡Áö´Â °æ¿ì´Â ÀϹÝÀûÀÌÁö ¾ÊÁö¸¸ ÆÄ»ýµÈ ±¸Ã¼ Ŭ·¡½ºµé¿¡°Ô ¾î¶² °øµ¿ÀÇ µ¿ÀÛÀ» ¹°·Á ÁÖ°í ½ÍÀ» ¶§ ÀÌ·± ½ÄÀ¸·Î º»Ã¼¸¦ Á¤ÀÇÇÒ ¼öµµ ÀÖ´Ù. ¼ø¼ö °¡»ó ÇÔ¼öÀÇ º»Ã¼´Â Ãß»ó Ŭ·¡½º ÀÚ½ÅÀ» À§ÇÑ °ÍÀÌ ¾Æ´Ï¶ó ÈļյéÀÌ °øÅëÀûÀ¸·Î ¾µ ¼ö ÀÖ´Â ¼ºê·çƾÀ» Á¦°øÇÏ´Â Àǹ̹ۿ¡ ¾ø´Ù.