30-2-¶ó.°¡»ó Æı«ÀÚ

±â¹Ý Ŭ·¡½ºÀÇ Æı«ÀÚ´Â ¹Ýµå½Ã °¡»óÀ¸·Î ¼±¾ðÇØ¾ß ÇÑ´Ù. ¿Ö Æı«ÀÚ´Â °¡»ó ÇÔ¼ö¿©¾ß ÇÏ´ÂÁö ¾ÆÁÖ °£´ÜÇÑ ¿¹Á¦¸¦ ¸¸µé¾î º¸°í Æı«ÀÚ°¡ °¡»óÀÌ ¾Æ´Ò ¶§ ¾î¶² ¹®Á¦°¡ ¹ß»ýÇÏ´ÂÁö º¸ÀÚ.

 

¿¹ Á¦ : VirtDestructor

#include <Turboc.h>

 

class Base

{

private:

     char *B_buf;

public:

     Base() { B_buf=new char[10];puts("Base »ý¼º"); }

     ~Base() { delete [] B_buf;puts("Base Æı«"); }

};

 

class Derived : public Base

{

private:

     int *D_buf;

public:

     Derived() { D_buf=new int[32];puts("Derived »ý¼º"); }

     ~Derived() { delete [] D_buf;puts("Derived Æı«"); }

};

 

void main()

{

//  Derived D;

     Base *pB;

 

     pB=new Derived;

     delete pB;

}

 

BaseÀÇ »ý¼ºÀÚ´Â Å©±â 10ÀÇ ¹®ÀÚÇü ¹è¿­À» µ¿ÀûÀ¸·Î ÇÒ´çÇϸç Æı«ÀÚ¿¡¼­ ÀÌ ¹è¿­À» ÇØÁ¦ÇÑ´Ù. Base·ÎºÎÅÍ »ó¼Ó¹ÞÀº Derived´Â »ý¼ºÀÚ¿¡¼­ Å©±â 32ÀÇ Á¤¼öÇü ¹è¿­À» ÇÒ´çÇÏ¸ç ¸¶Âù°¡Áö·Î Æı«ÀÚ¿¡¼­ ÇØÁ¦ÇÑ´Ù. °¢ Ŭ·¡½º°¡ µ¿Àû ÇÒ´çÀ» ÇÏ°í ÀÖÁö¸¸ Æı«ÀÚ¿¡¼­ ÇÒ´çµÈ ¹è¿­À» Á¦´ë·Î ÇØÁ¦ÇÏ°í ÀÖÀ¸¹Ç·Î ¸Þ¸ð¸® ´©¼ö´Â ¾øÀ» °Í °°´Ù.

°ú¿¬ ±×·±Áö main¿¡ Derived D; ¼±¾ð¹®¸¸ ³²°Ü ³õ°í ½ÇÇàÇØ º¸ÀÚ. °¢ Ŭ·¡½ºÀÇ »ý¼ºÀÚ¿Í Æı«ÀÚ´Â ÀÚ½ÅÀÌ È£ÃâµÇ¾úÀ½À» ¾Ë¸®±â À§ÇØ ¹®ÀÚ¿­À» Ãâ·ÂÇÑ´Ù. D °´Ã¼°¡ »ý¼ºµÉ ¶§´Â ºÎ¸ðÀÇ »ý¼ºÀÚ°¡ ¸ÕÀú È£ÃâµÇ°í ÀÚ½ÅÀÇ »ý¼ºÀÚ°¡ ½ÇÇàµÇ¸ç Æı«µÉ ¶§´Â ¹Ý´ë ¼ø¼­·Î Æı«ÀÚ°¡ È£ÃâµÈ´Ù. ½ÇÇà °á°ú´Â ´ÙÀ½°ú °°´Ù.

 

Base »ý¼º

Derived »ý¼º

Derived Æı«

Base Æı«

 

»ý¼ºÀÚ¿Í Æı«ÀÚÀÇ È£ÃâÀÌ ¾ÆÁÖ Á¤»óÀûÀÌ´Ù. D °´Ã¼°¡ ¿ÏÀüÈ÷ »ý¼ºµÇ¾úÀ» ¶§ ÀÌ °´Ã¼´Â Å©±â 10ÀÇ char ¹è¿­°ú Å©±â 32ÀÇ int ¹è¿­À» ¼ÒÀ¯ÇÒ °ÍÀ̸ç ÀÌ ¹è¿­µéÀº »ý¼ºµÈ ¿ª¼øÀ¸·Î Æı«ÀÚ¿¡¼­ Â÷·Ê´ë·Î ÇØÁ¦µÈ´Ù. ±×·¯³ª ¿©±â¿¡ Æ÷ÀÎÅÍ°¡ °³ÀÔµÇ¸é ¹®Á¦°¡ ´Þ¶óÁø´Ù. new ¿¬»êÀÚ·Î DerivedÀÇ °´Ã¼¸¦ ¸¸µé°í ±× Æ÷ÀÎÅ͸¦ Base * ŸÀÔÀÇ pB¿¡ ´ëÀÔÇϸé Derived°¡ »ý¼ºµÉ ¶§ ºÎ¸ð¿Í ÀÚ½ÅÀÇ »ý¼ºÀÚ°¡ Â÷·Ê´ë·Î È£ÃâµÇ¾î µÎ °³ÀÇ ¹öÆÛ¸¦ µ¿ÀûÀ¸·Î ÇÒ´çÇÒ °ÍÀÌ´Ù.

±×·¯³ª delete pB·Î ÀÌ °´Ã¼¸¦ ÇØÁ¦ÇÒ ¶§´Â ºÎ¸ðÀÇ Æı«ÀÚ¸¸ È£ÃâµÇ´Âµ¥ ¿Ö³ÄÇϸé pB°¡ Base * ŸÀÔÀ̱⠶§¹®ÀÌ´Ù. Æ÷ÀÎÅÍÀÇ Å¸ÀÔ¿¡ µû¶ó Æı«ÀÚ°¡ Á¤ÀûÀ¸·Î °áÇյǴ٠º¸´Ï ½ÇÁ¦·Î Æı«µÇ´Â °´Ã¼´Â Derived ŸÀÔÀÌÁö¸¸ DerivedÀÇ Æı«ÀÚ°¡ È£ÃâµÇÁö ¸øÇÏ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô µÇ¸é ºÎ¸ð°¡ ÇÒ´çÇÑ char ¹è¿­Àº Àß ÇØÁ¦µÇÁö¸¸ Derived°¡ ÇÒ´çÇÑ int ¹è¿­Àº ÇØÁ¦µÇÁö ¸øÇÏ´Â ¸Þ¸ð¸® ´©¼ö°¡ ¹ß»ýÇÑ´Ù. ½ÇÇàÇØ º¸¸é DerivedÀÇ Æı«ÀÚ°¡ È£ÃâµÇÁö ¾Ê´Â´Ù´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

 

Base »ý¼º

Derived »ý¼º

Base Æı«

 

ÀÌ·¸°Ô µÇ¸é Derived°¡ ÇÒ´çÇÑ 32¹ÙÀÌÆ®´Â ȸ¼ö ºÒ°¡´ÉÇÏ´Ù. ¸Þ¸ð¸®¸¸ Á¶±Ý ÀÒ¾î¹ö¸°´Ù¸é¾ß ½É°¢ÇÑ Á¤µµ´Â ¾Æ´ÏÁö¸¸ Çϵå¿þ¾î ȯ°æ º¯°æ, ³×Æ®¿öÅ© ¿¬°á, ½º·¹µå »ý¼º µîÀÇ ´õ Áß¿äÇÑ ÀÏÀ» Çß´Ù¸é Ä¡¸íÀûÀÎ °á°ú¸¦ ÃÊ·¡ÇÒ ¼öµµ ÀÖ´Ù. ¹®Á¦°¡ ¹«¾ùÀÎÁö¸¦ ¾Ë¾ÒÀ¸¹Ç·Î ÇØ°áÇÏ´Â °ÍÀº ¾ÆÁÖ °£´ÜÇÏ´Ù. Æı«ÀÚ°¡ µ¿Àû °áÇÕÀ» Çϵµ·Ï °¡»ó ÇÔ¼ö·Î ¸¸µé¸é µÈ´Ù. Base¿¡¸¸ virtualÀ» ºÙ¿©µµ µÇÁö¸¸ °¡±ÞÀûÀÌ¸é µÑ ´Ù ºÙÀÌ´Â °ÍÀÌ ÁÁ´Ù.

 

virtual ~Base() { delete [] B_buf;puts("Base Æı«"); }

....

virtual ~Derived() { delete [] D_buf;puts("Derived Æı«"); }

 

ÀÌ·± ÀÌÀ¯·Î ±â¹Ý Ŭ·¡½º·Î »ç¿ëµÉ °¡´É¼ºÀÌ Àִ Ŭ·¡½ºÀÇ Æı«ÀÚ´Â Ç×»ó °¡»ó ÇÔ¼ö·Î ¼±¾ðÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¹°·Ð Æı«ÀÚ¿¡¼­ Ưº°ÇÑ Á¤¸® ÀÛ¾÷À» ÇÒ ÇÊ¿ä°¡ ¾ø´Ù°Å³ª ÆÄ»ýµÇÁö ¾Ê´Â Ŭ·¡½º¶ó¸é ±»ÀÌ ´À¸° °¡»ó Æı«ÀÚ¸¦ ¾²Áö ¾Ê¾Æµµ »ó°ü¾ø´Ù. ÇÏÁö¸¸ ´çÀåÀº ÇÊ¿äÄ¡ ¾Ê´Ù ÇÏ´õ¶óµµ Ŭ·¡½º¶õ ¾ðÁ¦µçÁö È®ÀåµÉ ¼ö ÀÖ°í ´©°¡ ¾ðÁ¦ ÀÌ Å¬·¡½º·ÎºÎÅÍ »ó¼Ó¹ÞÀ»Áö ¾Ë ¼ö ¾ø±â ¶§¹®¿¡ °¡±ÞÀûÀ̸é Æı«ÀÚ´Â °¡»óÀ¸·Î ¼±¾ðÇØ µÎ´Â °ÍÀÌ ¾ÈÀüÇÏ´Ù. ±×·¡¾ß Æ÷ÀÎÅͷκÎÅÍ »èÁ¦Çصµ ±ú²ýÇÏ°Ô »èÁ¦µÇ¸ç ¾ðÁ¦µçÁö Ŭ·¡½º¸¦ ¾È½ÉÇÏ°í È®ÀåÇÒ ¼ö ÀÖ´Ù.

¾Õ Àå¿¡¼­ ¸¸µé¾ú´ø Person Ŭ·¡½ºµµ µ¿Àû ÇÒ´çÀ» »ç¿ëÇϹǷΠÀÌ Å¬·¡½ºÀÇ Æı«ÀÚµµ ´ç¿¬È÷ °¡»óÀ̾î¾ß ÇÏ¸ç »ó¼ÓÀ» °í·ÁÇÏ¿© private´Â protected·Î ¹Ù²Ù´Â °ÍÀÌ ÁÁ´Ù. ´çÀåÀº PersonÀÌ È¦·Î ¾²ÀÌ´õ¶óµµ ¾ðÁ¦ ÀÌ Å¬·¡½º·ÎºÎÅÍ Boy, Girl µûÀ§ÀÇ Å¬·¡½º°¡ ÆÄ»ýµÉÁö ¾Ë ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. Æı«ÀÚ¿¡ ºñÇØ »ý¼ºÀÚ´Â °¡»óÀÌ ¾Æ´Ï¾îµµ »ó°ü¾øÀ¸¸ç °¡»óÀ¸·Î ¼±¾ðÇÒ ¼öµµ ¾ø´Ù. ¿Ö³ÄÇÏ¸é °´Ã¼¸¦ »ý¼ºÇÒ ¶§´Â °´Ã¼ÀÇ Å¸ÀÔÀ» ºÐ¸íÈ÷ ¸í½ÃÇϹǷΠ¾î¶² »ý¼ºÀÚ°¡ È£ÃâµÉÁö Á¤È®ÇÏ°Ô °áÁ¤ÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. Person3 ¿¹Á¦ÀÇ Æı«ÀÚ¸¦ °¡»óÀ¸·Î ¼±¾ðÇϵµ·Ï ÇÏÀÚ.

 

virtual ~Person() {

     delete [] Name;

}

 

±×¸®°í ÆÄ»ý Ŭ·¡½º¿¡¼­ Name, Age¸¦ ÀÐÀ» ¼ö ÀÖµµ·Ï protected·Î ¾×¼¼½º ÁöÁ¤À» º¯°æÇÑ´Ù. ÀÌÁ¦ µåµð¾î Person Ŭ·¡½º°¡ ¿Ïº®ÇØÁ³´Ù. »ý¼ºÀÚ, Æı«ÀÚ¿¡¼­ µ¿Àû ¹öÆÛ¸¦ Àß °ü¸®ÇÏ°í ÀÖÀ¸¸ç º¹»ç »ý¼º, ´ëÀÔ ¿¬»ê¿¡ ´ëÇؼ­µµ ¾ÈÀüÇÏ°Ô »çº»À» ÀÛ¼ºÇÏ¸ç »ó¼Ó °ü°è¿¡¼­ »ç¿ëµÉ ¼öµµ ÀÖ´Ù. Person Ŭ·¡½º¸¦ Á¦´ë·Î ¸¸µé±â À§ÇØ ±²ÀåÈ÷ ±ä ½Ç½À °úÁ¤À» °ÅÃƴµ¥ ÀÌ Å¬·¡½º È®Àå °úÁ¤Àº C++ Çʼö ¹®¹ýÀ» ¸ðµÎ Æ÷ÇÔÇϹǷΠÇÑ ¹øÂë ÃÑ Á¤¸®¸¦ ÇØ µÎ´Â °ÍÀÌ ÁÁ´Ù.