extern "C" Áö½ÃÀÚ

C/C++ »Ó¸¸ ¾Æ´Ï¶ó ¸ðµç ÇÁ·Î±×·¡¹Ö ¾ð¾î´Â ¸ñÀûÆÄÀÏ(obj)À» ¸¸µé°í ¸µÅ©¿¡ ÀÇÇØ ¸ñÀûÆÄÀÏÀ» ¿¬°áÇÏ¿© ÃÖÁ¾ ½ÇÇàÆÄÀÏÀ» ¸¸µç´Ù. ¸ñÀûÆÄÀÏÀº ÀÚ½ÅÀÌ Á¤ÀÇÇÑ ÇÔ¼öÀÇ ¸íĪ°ú ÁÖ¼Ò¸¦ ¿ÜºÎ·Î °ø°³Çϴµ¥ ÀÌ ¸íĪÀ» ÀÛ¼ºÇÏ´Â ¹æ½ÄÀÌ ¾ð¾î¿¡ »ó°ü¾øÀÌ Ç¥ÁØÀ¸·Î ±ÔÁ¤µÇ¾î ÀÖ´Ù. ±×·¡¼­ C¿Í ÆĽºÄ®Ã³·³ °¢°¢ ´Ù¸¥ ¾ð¾î·Î ÄÄÆÄÀÏÇÑ ¸ñÀûÆÄÀϵµ ÀÌ»ó¾øÀÌ ¸µÅ©µÈ´Ù.

¸íĪÀ» ÀÛ¼ºÇϴ ǥÁØÀÌ ÇÔ¼ö¸¦ À̸§¸¸À¸·Î ±¸ºÐÇϱ⠶§¹®¿¡ C++ÀÇ ¿À¹ö·Îµù ±â´É°ú´Â ¸ÂÁö ¾Ê´Ù´Â ¹®Á¦°¡ ÀÖ´Ù. °ú°ÅÀÇ ¾ð¾î´Â À̸§¸¸À¸·Î ÇÔ¼ö¸¦ ±¸ºÐÇßÁö¸¸ C++Àº Àμö¿­ÀÌ ´Ù¸£¸é °°Àº À̸§ÀÇ ÇÔ¼ö°¡ Á¸ÀçÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ¼¼ ÇÔ¼ö´Â ÀμöÀÇ °³¼ö¿Í ŸÀÔÀÌ ´Þ¶ó °°Àº À̸§À¸·Î Á¤ÀÇÇصµ ¹«¹æÇÏ´Ù.

 

int Add(int a, int b)

{

     return a + b;

}

 

int Add(int a, int b, int c)

{

     return a + b + c;

}

 

double Add(double a, double b)

{

     return a + b;

}

 

¿À¹ö·ÎµùµÈ ÇÔ¼ö¸¦ ±¸ºÐÇϱâ À§ÇØ C++Àº Ç¥ÁØ ¸íĪ ÀÛ¼º ¹æ½ÄÀ» µû¸£Áö ¾Ê°í ÇÔ¼öÀÇ À̸§°ú ÀμöÀÇ °³¼ö, ŸÀÔ Á¤º¸±îÁö Æ÷ÇÔÇÏ¿© ¿ÜºÎ·Î °ø°³ÇÒ ¸íĪÀ» ÀÛ¼ºÇÑ´Ù. ÀÌ ¹æ½ÄÀ» À̸§ Àå½Ä(name mangling)¹ýÀ̶ó°í Çϸç C++·Î ÄÄÆÄÀÏÇÑ ¸ñÀûÆÄÀÏÀÇ ÇÔ¼ö¸íÀº ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºµÈ´Ù.

 

?Add@@YANNN@Z

?Add@@YAHHHH@Z

?Add@@YAHHH@Z

 

Add¶ó´Â ÇÔ¼ö À̸§ ¿Ü¿¡µµ µÚÂÊ¿¡ ÀμöÀÇ °³¼ö¿Í ŸÀÔ Á¤º¸°¡ ºÎȣȭµÇ¾î Ãß°¡µÇ±â ¶§¹®¿¡ ¸µÅ© ´Ü°è¿¡¼­ °¢ ÇÔ¼ö¸¦ ±¸ºÐÇÒ ¼ö ÀÖ´Ù. ÀÌ·± ¸íĪ¹ýÀº C++³»¿¡¼­´Â ¾Æ¹« ¹®Á¦°¡ ¾øÁö¸¸ ¿À¹ö·ÎµùÀ» Áö¿øÇÏÁö ¾Ê´Â ´Ù¸¥ ¾ð¾î¿Í È¥ÇÕ ÇÁ·Î±×·¡¹ÖÇÒ ¶§´Â ¹®Á¦°¡ µÈ´Ù. ´Ù¸¥ ¾ð¾î´Â ¸íĪÀ» À̸§¸¸À¸·Î ÀÛ¼ºÇϱ⠶§¹®¿¡ ¼­·Î ȣȯµÇÁö ¾Ê´Â´Ù.

À̶§ »ç¿ëÇÏ´Â Áö½ÃÁö°¡ ¹Ù·Î extern "C"ÀÌ´Ù. ÇÔ¼ö ¾Õ¿¡ ÀÌ Áö½ÃÀÚ¸¦ ºÙÀÌ¸é ¿À¹ö·ÎµùÇÒ ¼ö´Â ¾øÁö¸¸ ´Ù¸¥ ¾ð¾î¿Í ¸µÅ©ÇÒ ¼ö ÀÖ´Â ¹ü¿ë ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ´Ù. À̶§ ´Ù¸¥ ¾ð¾î´Â ´ë°³ÀÇ °æ¿ì CÀÌ´Ù. À©µµ¿ìÁî ȯ°æ¿¡¼­ DLLÀ» ¸¸µé·Á¸é ÀÌ Áö½ÃÀÚ°¡ ÇÊ¿äÇÏ´Ù. DLLÀº C ¹æ½ÄÀ¸·Î ÇÔ¼ö¸¦ ãÀ¸¸ç ¿À¹ö·ÎµùÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù.

extern "C" Áö½ÃÀÚ´Â C++ÀÌ C³ª ´Ù¸¥ ¾ð¾î¸¦ À§ÇØ À̸§ Àå½ÄÀ» ÇÏÁö ¾Ê°í Ç¥ÁØÀ» µû¸¦ ¶§ »ç¿ëÇÏÁö¸¸ ¹Ý´ëÀÇ °æ¿ì¿¡µµ ÇÊ¿äÇÏ´Ù. Áï, ÀÌ¹Ì C·Î ¸¸µé¾îÁø ÇÔ¼ö¸¦ C++¿¡¼­ È£ÃâÇÏ°íÀÚ ÇÒ ¶§ ÀÌ ÇÔ¼öÀÇ ¿øÇü ¾Õ¿¡ extern "C"°¡ ÀÖ¾î¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ¸µÄ¿°¡ Àå½ÄµÈ À̸§À¸·Î ÇÔ¼ö¸¦ ãÀ¸¹Ç·Î CÀÇ ÇÔ¼ö¸¦ Á¦´ë·Î ¿¬°áÇÏÁö ¸øÇÑ´Ù.

»ý¼ºÀÚÀÇ È°¿ë

»ý¼ºÀÚ, Æı«ÀÚ´Â ÀÏ¹Ý ÇÔ¼ö¿Í Àû¿ëµÇ´Â ¹®¹ýÀÌ ´Ù¸£¸ç ÀÚµ¿À¸·Î È£ÃâµÈ´Ù´Â Á¡¿¡¼­ µ¶Æ¯ÇÑ È°¿ëó°¡ ÀÖ´Ù. °´Ã¼¸¦ ¸¸µé°Å³ª Æı«ÇÒ ¶§ ÄÄÆÄÀÏ·¯°¡ ¾Ë¾Æ¼­ È£ÃâÇØ ÁÖ´Ï ¼±¾ð¹®¸¸À¸·Î µ¿ÀÛÀ» À¯¹ßÇÒ ¼ö ÀÖÀ¸¸ç ±×·¡¼­ Àü¿ªÀûÀÎ ÃʱâÈ­¿¡ À¯¿ëÇÏ´Ù. ´ÙÀ½ ¿¹Á¦´Â RandomInitializer Ŭ·¡½ºÀÇ »ý¼ºÀÚ¿¡¼­ randomize ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ³­¼ö ¹ß»ý±â¸¦ ÃʱâÈ­ÇÑ´Ù.

 

RandInit

#include <stdio.h>

#include <cursor.h>

 

class RandomInitializer

{

public:

     RandomInitializer() { randomize(); }

};

RandomInitializer R;

 

int main()

{

     for (int i = 0; i < 10; i++) {

          printf("%d\n", random(100));

     }

}

 

ÇÁ·Î±×·¥°ú ÇÔ²² »ý¼ºµÇ´Â Àü¿ª °´Ã¼ÀÇ »ý¼ºÀÚ°¡ ÁøÀÔÁ¡ÀÎ main ÇÔ¼öº¸´Ù ¸ÕÀú È£ÃâµÈ´Ù. Àü¿ª °´Ã¼ RÀÇ ¼±¾ð¹®¸¸ ÀÖÀ¸¸é º°´Ù¸¥ ÇÔ¼ö¸¦ È£ÃâÇϰųª °´Ã¼¸¦ »ç¿ëÇÏÁö ¾Ê¾Æµµ ÇÁ·Î±×·¥ ½ÃÀÛ Á÷Àü¿¡ ³­¼ö ¹ß»ý±â°¡ ÃʱâÈ­µÈ´Ù. ¿¹Á¦¸¦ ½ÇÇàÇÒ ¶§¸¶´Ù Ç×»ó ³­¼ö ¹ß»ý±â°¡ ÃʱâÈ­µÇ¾î ¸Å¹ø ´Ù¸¥ ³­¼ö°¡ »ý¼ºµÈ´Ù.

Áö¿ª °´Ã¼°¡ ¼Ò¸êµÉ ¶§ Æı«ÀÚ°¡ ÀÚµ¿À¸·Î È£ÃâµÈ´Ù´Â Ư¼ºµµ Àß ÀÌ¿ëÇÏ¸é ¹«Ã´ À¯¿ëÇÏ´Ù. »ý¼ºÀÚ¿¡¼­ ȯ°æÀ» ¿øÇϴ´ë·Î ¹Ù²ã ³õÀ¸¸é Æı«ÀÚ°¡ ¿ø·¡´ë·Î µ¹·Á ³õ´Â´Ù. ¿¹¸¦ µé¾î °ÔÀÓÀ̳ª ¸ÖƼ¹Ìµð¾î Àç»ýÀ» À§ÇØ ÃÖÀûÀÇ Çػ󵵰¡ ÇÊ¿äÇÏ´Ù°í ÇØ º¸ÀÚ. ÀÌ·² ¶§´Â ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ ÀÏÀÏÀÌ Çػ󵵸¦ Á¶Á¤ÇÏ´Â °Íº¸´Ù º¯°æ°ú º¹±¸¸¦ Àü´ãÇÏ´Â °´Ã¼¸¦ ¸¸µå´Â °ÍÀÌ Æí¸®ÇÏ´Ù.

 

class ScreenRes

{

private:

     int oldwidth,oldheight;

 

public:

     bool bSuccess;

     ScreenRes(int w,int h) {

          // ÀÌÀü Çػ󵵸¦ Á¶»çÇØ ³õ´Â´Ù.

          oldwidth = GetResolutionX();

          oldheight = GetResolutionY();

          // È­¸é Çػ󵵸¦ w, h·Î º¯°æÇÑ´Ù.

          bSuccess = SetResolution(w, h);

     }

     ~ScreenRes() {

          if (bSuccess) {

              // ¿ø·¡ Çػ󵵴ë·Î µ¹·Á ³õ´Â´Ù.

              SetResolution(oldwidth, oldheight);

          }

     }

};

ScreenRes SR(1024,768);

 

»ý¼ºÀÚ´Â Àμö·Î Àü´Þ¹ÞÀº w, h·Î Çػ󵵸¦ º¯°æÇ쵂 ±× Àü¿¡ ¿ø·¡ Çػ󵵸¦ Á¶»çÇØ ³õ´Â´Ù. SR °´Ã¼ÀÇ »ý¼ºÀÚ°¡ ¿øÇÏ´Â Çػ󵵷Πº¯°æÇϸç Àü¿ªÀ¸·Î ¼±¾ðÇßÀ¸¹Ç·Î ÇÁ·Î±×·¥ ½ÇÇàÁß¿¡ ÀÌ Çػ󵵰¡ °è¼Ó À¯ÁöµÈ´Ù. ÇÁ·Î±×·¥ÀÌ Á¾·áµÇ¸é Àü¿ª °´Ã¼°¡ ¼Ò¸êµÇ¸é¼­ Æı«ÀÚ¿¡ ÀÇÇØ ¿ø·¡ Çػ󵵷Π±ôÂÊ°°ÀÌ º¹±¸ÇØÁØ´Ù. ÀÌ·± À¯Æ¿¸®Æ¼ Ŭ·¡½º´Â ÀÌ¹Ì °ø°³µÈ °ÍÀÌ ¸¹¾Æ ½ÇÁ¦ ÇÊ¿äÇÑ °ÍÀº °´Ã¼ ¼±¾ð¹®¹Û¿¡ ¾ø´Ù.

ÀÌ ±â¹ýÀº ÀϽÃÀûÀ¸·Î »óŸ¦ º¯°æÇÒ ¶§ À¯¿ëÇÏ´Ù. Áö¿ª °´Ã¼¸¦ »ç¿ëÇϸé ÇÔ¼ö°¡ ½ÇÇàÁßÀÎ µ¿¾È¿¡¸¸ »óŸ¦ Àá½Ã ¹Ù²ã ³õ°í ÇÔ¼ö°¡ Á¾·áµÉ ¶§ ¿ø·¡´ë·Î µ¹·Á ³õ´Â´Ù. ±×·¡ÇÈ È¯°æ¿¡¼­ Àå½Ã°£ÀÇ ÀÛ¾÷À» ÇÒ ¶§ ¸ð·¡½Ã°è ¸ð¾çÀÇ Ä¿¼­¸¦ º¸¿© ÁÖ°í ÀÛ¾÷ÀÌ ³¡³ª¸é Ä¿¼­¸¦ º¹±¸ÇÑ´Ù. WaitCursor Ŭ·¡½ºÀÇ »ý¼ºÀÚ¿¡¼­ Ä¿¼­¸¦ ¹Ù²Ù°í Æı«ÀÚ¿¡¼­ º¹±¸Çϵµ·Ï ÇØ ³õÀ¸¸é ÀÛ¾÷ ÇÔ¼ö´Â °´Ã¼¸¸ ¼±¾ðÇÏ¸é µÈ´Ù.

 

void LongCalc()

{

        WaitCursor c;

        // ¿À·¡ °É¸®´Â ÀÛ¾÷

}

 

ÇÔ¼ö¿¡ ÁøÀÔÇϸ鼭 Áö¿ª°´Ã¼ c°¡ »ý¼ºµÇ¸ç À̶§ »ý¼ºÀÚ°¡ È£ÃâµÇ¾î Ä¿¼­¸¦ ¹Ù²Û´Ù. ÀÛ¾÷ÀÌ ÁøÇàÁßÀε¿¾È Ä¿¼­°¡ °è¼Ó À¯ÁöµÇ¸ç ÇÔ¼ö°¡ ¸®ÅÏÇϱâ Á÷Àü¿¡ Áö¿ª°´Ã¼ c°¡ Æı«µÇ¸é¼­ Æı«ÀÚ¿¡ ÀÇÇØ ¿ø·¡ Ä¿¼­¸¦ º¹±¸ÇÑ´Ù. Ä¿¼­¸¦ º¯°æÇÏ°í ½ÍÀº ½ÃÁ¡¿¡ °´Ã¼¸¸ ¼±¾ðÇØ µÎ¸é ¸ðµç °ÍÀº Ŭ·¡½º ³»ºÎ¿¡¼­ ÀÚµ¿À¸·Î ó¸®ÇÑ´Ù.

Ŭ·¡½º°¡ ¹ø°Å·Ó´Ù¸é Àü¿ª º¯¼ö·Îµµ ºñ½ÁÇÑ È¿°ú¸¦ ³¾ ¼ö ÀÖ´Ù. C¿¡¼­´Â int i = 3 ½ÄÀ¸·Î Àü¿ª º¯¼öÀÇ ÃʱⰪÀ» »ó¼ö·Î¸¸ ÁöÁ¤ÇÒ ¼ö ÀÖÁö¸¸ C++¿¡¼­´Â int i = func() ½ÄÀ¸·Î ÃʱⰪ¿¡ ÇÔ¼ö È£Ãâ¹®À» ÀûÀ» ¼ö ÀÖ´Ù. ÀÌ Á¡À» ÀÌ¿ëÇÏ¿© Àü¿ª º¯¼ö ÃʱâÈ­ ÇÔ¼ö¿¡¼­ ÇÊ¿äÇÑ Àü¿ª ÃʱâÈ­¸¦ ÇÑ´Ù.

 

runtimeinit

#include <stdio.h>

#include <cursor.h>

 

int randinit()

{

     randomize();

     // ±âŸ ÇÏ°í ½ÍÀº ÃʱâÈ­ ó¸®

     return random(100);

}

 

int g_r = randinit();

 

int main()

{

     int r = random(100);

     printf("g_r = %d, r = %d\n", g_r, r);

}

½ÇÇà°á°ú

g_r = 54, r = 29

 

Àü¿ª º¯¼ö g_rÀÇ ÃʱâÈ­¸¦ À§ÇØ randinit ÇÔ¼ö°¡ È£ÃâµÇ¸ç ¿©±â¼­ ³­¼ö ¹ß»ý±â¸¦ ÃʱâÈ­ÇÑ´Ù. »ó¼ö°¡ ¾Æ´Ñ ÇÔ¼ö È£Ãâ·Î ÃʱâÈ­ÇÏ´Â °ÍÀ» µ¿Àû ÃʱâÈ­(runtime initialize)¶ó°í ÇÑ´Ù. main º¸´Ù ÃʱâÈ­ ÇÔ¼ö°¡ ¸ÕÀú Á¦¾î¸¦ ¹ÞÀ¸¹Ç·Î Àü¿ª ÃʱâÈ­¿¡ ÀûÇÕÇÏ´Ù. º°µµÀÇ ÇÔ¼ö¸¦ ¸¸µå´Â °ÍÀÌ ¹ø°Å·Ó´Ù¸é ÄÞ¸¶ ¿¬»êÀÚ¸¦ È°¿ëÇÒ ¼öµµ ÀÖ´Ù.

 

int g_r = (randomize(), random(100));

 

µ¿Àû ÃʱâÈ­ ±¸¹®À¸·Î °£ÆíÇÏ°Ô ÃʱâÈ­ÇÒ ¼ö ÀÖÁö¸¸ Ŭ·¡½º¿¡ ºñÇØ Á¾·á 󸮸¦ ÇÒ ¼ö ¾ø´Ù´Â Á¡ÀÌ Á¶±Ý ¾Æ½±´Ù. À§ ÄÚµå´Â µ¿Àû ÃʱâÈ­¸¦ Áö¿øÇÏÁö ¾Ê´Â C ÄÄÆÄÀÏ·¯¿¡¼­´Â ½ÇÇàµÇÁö ¾Ê´Â´Ù.

ÃʱâÈ­ ¼ø¼­

ÃʱâÈ­ ¸®½ºÆ®ÀÇ Ãʱâ½ÄÀº ¸®½ºÆ®¿¡ ³ªÅ¸³­ ¼ø¼­°¡ ¾Æ´Ñ ¸â¹öÀÇ ¼±¾ð ¼ø¼­´ë·Î ½ÇÇàµÈ´Ù. ´ë°³ÀÇ °æ¿ì´Â ÃʱâÈ­ ¼ø¼­°¡ º° »ó°ü¾øÁö¸¸ ¸â¹ö³¢¸® Á¾¼ÓÀûÀÎ °ü°èÀÏ ¶§´Â ¼ø¼­°¡ Áß¿äÇÏ´Ù. ´ÙÀ½ ¿¹Á¦¸¦ ½ÇÇàÇØ º¸ÀÚ.

 

InitOrder

#include <stdio.h>

 

class Test

{

private:

     int first;

     int second;

 

public:

     Test(int a) : first(a), second(first * 2) { }

     void OutMember() {

          printf("first = %d, second = %d\n", first, second);

     }

};

 

int main()

{

     Test t(4);

 

     t.OutMember();

}

½ÇÇà°á°ú

first = 4, second = 8

 

Test Ŭ·¡½º´Â µÎ °³ÀÇ Á¤¼öÇü ¸â¹ö¸¦ °¡Áø´Ù. »ý¼ºÀÚ¿¡¼­ Àμö a¸¦ ¹Þ¾Æ first¸¦ ÃʱâÈ­ÇÏ°í second´Â firstÀÇ 2¹è °ªÀ¸·Î ÃʱâÈ­ÇÑ´Ù. main¿¡¼­ t °´Ã¼¸¦ »ý¼ºÇϸç Àμö·Î 4¸¦ Àü´ÞÇßÀ¸¹Ç·Î first´Â 4°¡ µÇ°í second´Â 8ÀÌ µÈ´Ù. ´ç¿¬ÇÑ °Í °°Áö¸¸ ¼±¾ð ¼ø¼­°¡ ¹Ù²î¸é °á°ú°¡ ´Þ¶óÁø´Ù.

 

class Test

{

private:

        int second;

        int first;

        ....

 

second¸¦ ¸ÕÀú ¼±¾ðÇϸé first´Â 4°¡ µÇÁö¸¸ second´Â ¾²·¹±â°ªÀ» °¡Áø´Ù. ÀÌ·¸°Ô µÇ´Â ÀÌÀ¯´Â ÃʱâÈ­ ¸®½ºÆ®ÀÇ ¼ø¼­¿¡ »ó°ü¾øÀÌ ¸ÕÀú ¼±¾ðµÈ second°¡ ÃʱâÈ­µÇ°í first°¡ ³ªÁß¿¡ ÃʱâÈ­µÇ±â ¶§¹®ÀÌ´Ù. second¸¦ ÃʱâÈ­ÇÒ ¶§´Â first°¡ ¾²·¹±â°ªÀ» °¡Áö°í ÀÖÀ¸¹Ç·Î 2¹èÇÑ °ªµµ ¾²·¹±âÀÏ ¼ö¹Û¿¡ ¾ø´Ù. ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é first¸¦ ¸ÕÀú ¼±¾ðÇØ¾ß ÇÑ´Ù.

´Ü¼ø ¸â¹ö¿¡¼­´Â ÀÌ·± ¼ø¼­°¡ ±×¸® Áß¿äÄ¡ ¾ÊÁö¸¸ Æ÷ÀÎÅÍ°¡ °³ÀԵǰųª Ŭ·¡½ºÀÇ ÇÙ½É Á¤º¸¸¦ ÃʱâÈ­ÇÒ ¶§´Â ±²ÀåÈ÷ ¹Î°¨ÇÑ ¹®Á¦¸¦ ÀÏÀ¸Å²´Ù. ´ÙÀ½ ¿¹Á¦´Â ÃʱâÈ­ ¼ø¼­°¡ ¿Ö Áß¿äÇÑÁö ¿¬±¸ÇØ º¸±â À§ÇØ ÀǵµÀûÀ¸·Î ¸¸µç °ÍÀÌ´Ù.

 

InitOrder2

#include <stdio.h>

 

class Test

{

private:

     int *p1;

     int *p2;

 

public:

     Test(int *p) : p1(p), p2(p1) { }

     void OutMember() {

          printf("*p1 = %d, *p2 = %d\n", *p1, *p2);

     }

};

 

int g = 1234;;

int main()

{

     Test t(&g);

 

     t.OutMember();

}

½ÇÇà°á°ú

*p1 = 1234, *p2 = 1234

 

Test Ŭ·¡½º´Â µÎ °³ÀÇ Á¤¼öÇü Æ÷ÀÎÅÍ p1, p2¸¦ ¸â¹ö·Î °¡Áø´Ù. »ý¼ºÀÚ¿¡¼­ Á¤¼öÇü º¯¼öÀÇ ¹øÁö Çϳª¸¦ ¹Þ¾Æ p1À» ¸ÕÀú ÃʱâÈ­ÇÏ°í p2µµ p1°ú °°Àº °ªÀ¸·Î ÃʱâÈ­Çß´Ù. ÇöÀç´Â Á¤»óÀûÀ¸·Î Àß ½ÇÇàµÇÁö¸¸ p1°ú p2ÀÇ ¼±¾ð ¼ø¼­¸¦ ¹Ù²Ù¸é p2°¡ ¾²·¹±â°ªÀ» °¡Á® ¾û¶×ÇÑ ¹øÁö¸¦ ÀÐÀ½À¸·Î½á ´Ù¿îµÈ´Ù. ±×·¡¼­ ¸â¹öÀÇ ¼±¾ð ¼ø¼­°¡ Áß¿äÇϸç ÃʱâÈ­ ¸®½ºÆ®´Â ¹Ý´ë·Î ÀÛ¼ºÇصµ »ó°ü¾ø´Ù.

 

Test(int *p) : p2(p1), p1(p) { }

 

¾ð¶æ º¸±â¿¡´Â ÃʱâÈ­ ¸®½ºÆ®ÀÇ ¼ø¼­´ë·Î ÃʱâÈ­ÇÏ´Â °ÍÀÌ »ó½ÄÀûÀÌ°í °³¹ßÀÚ°¡ ¼ø¼­¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ¾î ´õ ½Ç¿ëÀûÀÏ °Í °°´Ù. ±×·¯³ª ÄÄÆÄÀÏ·¯ ±¸Çö»ó ±×·² ¼ö ¾ø´Â ¼Ó»çÁ¤ÀÌ ÀÖ´Ù. »ý¼ºÀÚ´Â ¿©·¯ °³ Àִµ¥ ºñÇØ Æı«ÀÚ´Â Çϳª¹Û¿¡ ¾ø±â ¶§¹®ÀÌ´Ù. ´ÙÀ½°ú °°ÀÌ ÃʱâÈ­ ¼ø¼­°¡ ´Ù¸¥ µÎ °³ÀÇ »ý¼ºÀÚ°¡ Á¸ÀçÇÑ´Ù°í ÇØ º¸ÀÚ.

 

Test(int a) : first(a),second(first*2) { }

Test(int af,as) : second(as), first(af) { }

 

¸®½ºÆ®ÀÇ ¼ø¼­¸¦ µû¸¥´Ù¸é ù ¹ø° ¹öÀüÀº first, second ¼øÀ¸·Î ÃʱâÈ­ÇÏ°í µÎ ¹ø° ¹öÀüÀº second, first ¼øÀ¸·Î ÃʱâÈ­ÇÒ °ÍÀÌ´Ù. ÀÌ °æ¿ì Æı«ÀÚ´Â ÃʱâÈ­ÀÇ ¿ª¼øÀ¸·Î ¸â¹ö¸¦ Æı«ÇØ¾ß ³í¸®»ó ÇÕ´çÇÏ´Ù. »ý¼º ¼ø¼­°¡ Áß¿äÇÑ °Íó·³ Æı« ¼ø¼­µµ Áß¿äÇÏ´Ù. ±×·¯ÀÚ¸é °´Ã¼ ½º½º·Î ¾î¶² »ý¼ºÀÚ·Î ÀÚ½ÅÀ» ÃʱâÈ­Çß´ÂÁö, °¢ ¸â¹öÀÇ ÃʱâÈ­ ¼ø¼­´Â ¾î¶²Áö ±â¾ïÇØ¾ß Çϴµ¥ ÀÌ°ÍÀº ÀϹÝÀûÀ¸·Î ºÒ°¡´ÉÇÏ´Ù.

±×·¡¼­ Æı«ÀÚ´Â ¹«Á¶°Ç ¼±¾ðµÈ ¿ª¼øÀ¸·Î ¸â¹ö¸¦ Æı«Çϸç ÀÌ ¼ø¼­¿¡ ¸ÂÃß±â À§ÇØ »ý¼ºÀÚ´Â ¼±¾ðµÈ ¼ø¼­´ë·Î ÃʱâÈ­ÇÒ ¼ö¹Û¿¡ ¾ø´Ù. ¸â¹öÀÇ ÃʱâÈ­, Æı« ¼ø¼­¸¦ Á¤ÇÏ´Â °¡Àå ½±°íµµ ºÐ¸íÇÑ ±âÁØÀº ¼±¾ðµÈ ¼ø¼­ÀÌ¸ç µû¶ó¼­ ÃʱâÈ­ ¸®½ºÆ®ÀÇ Ãʱâ½Ä ¼ø¼­´Â ÀüÇô Áß¿äÄ¡ ¾Ê´Ù. ¸¶Âù°¡Áö ÀÌÀ¯·Î ´ÙÁß »ó¼ÓÀÇ °æ¿ìµµ ¼±¾ð¹®¿¡ ³ªÅ¸³­ ±â¹Ý Ŭ·¡½º ¼øÀ¸·Î ÃʱâÈ­µÈ´Ù.

 

class Now : public Date, public Time

{

        Now(int y,int m,int d,int h,int min,int s,int ms,bool b=FALSE)

                  : Date(y,m,d), Time(h,min,s) { milisec=ms; bEngMessage=b; }

 

Date, Time¼øÀ¸·Î »ó¼Ó ¹Þ¾Ò°í ÃʱâÈ­ ¸®½ºÆ®µµ ÀÌ ¼ø¼­´ë·Î ±â¹Ý Ŭ·¡½º¸¦ ÃʱâÈ­ÇÑ´Ù. ±â¹Ý Ŭ·¡½ºÀÇ »ý¼ºÀÚ È£Ãâ ¼ø¼­´Â »ó¼Ó¹®ÀÇ ¼ø¼­ÀÎ Date°¡ ¸ÕÀúÀÌ°í TimeÀÌ ³ªÁßÀÌ´Ù. ÃʱâÈ­ ¸®½ºÆ®µµ ¿ì¿¬È÷ ÀÌ ¼ø¼­·Î µÇ¾î ÀÖÁö¸¸ ÃʱâÈ­ ¼ø¼­¿¡´Â ¾Æ¹« ¿µÇâÀ» ¹ÌÄ¡Áö ¸øÇÑ´Ù.

±â¹Ý Ŭ·¡½ºÀÇ ÃʱâÈ­ ¼ø¼­°¡ Áß¿äÇÒ °æ¿ì´Â Ŭ·¡½º ¼±¾ð¹®À» ÁÖÀDZí°Ô ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ¸ÕÀú ÃʱâÈ­µÇ¾î¾ß ÇÏ´Â ±â¹Ý Ŭ·¡½º¸¦ ¾Õ¿¡ Àû°í ³ªÁß¿¡ ÃʱâÈ­µÉ ±â¹Ý Ŭ·¡½º¸¦ µÚÂÊ¿¡ Àû¾î¾ß ÇÑ´Ù. Æı«ÀÚ´Â »ý¼ºÀÚÀÇ ¿ª¼øÀ¸·Î È£ÃâµÈ´Ù.

¸â¹öº° º¹»ç

º¹»ç »ý¼ºÀÚ³ª ´ëÀÔ ¿¬»êÀÚ¸¦ Á¤ÀÇÇÏÁö ¾ÊÀ¸¸é ÄÄÆÄÀÏ·¯°¡ µðÆúÆ® ÇÔ¼ö¸¦ ¸¸µé¾î ÁØ´Ù. ÀÌ ÇÔ¼öµéÀº ¸â¹öº° º¹»ç¸¦ ¼öÇàÇÏ¿© ¿ìº¯ °´Ã¼¸¦ Áº¯ °´Ã¼¿¡ ´ëÀÔÇÑ´Ù. ¸â¹öº°·Î ´ëÀÔÇÑ´Ù´Â °ÍÀº ´ëÀÀµÇ´Â ¸â¹ö³¢¸® 1:1·Î ´ëÀÔÇÑ´Ù´Â ¶æÀÌÁö ¸Þ¸ð¸®¸¦ Åë°·Î º¹»çÇÏ´Â °ÍÀÌ ¾Æ´Ï´Ù. ±âº»ÇüÀº ¸Þ¸ð¸® º¹»ç¿Í ´ëÀÔÀÌ °°¾Æ ´Ü¼ø º¹»çÇصµ »ó°ü¾øÁö¸¸ °´Ã¼ÀÇ °æ¿ì´Â ´ëÀÔ ¿¬»êÀÚ°¡ È£ÃâµÈ´Ù.

 

DefAssign

#include <stdio.h>

#include <string.h>

 

class Human

{

private:

     char *pname;

     int age;

 

public:

     Human() {

          pname = new char[1];

          pname[0] = NULL;

          age = 0;

     }

     Human(char *aname, int aage) {

          pname = new char[strlen(aname) + 1];

          strcpy(pname, aname);

          age = aage;

     }

     Human(const Human &other) {

          pname = new char[strlen(other.pname) + 1];

          strcpy(pname, other.pname);

          age = other.age;

     }

     Human &operator =(const Human &other) {

          if (this != &other) {

              delete[] pname;

              pname = new char[strlen(other.pname) + 1];

              strcpy(pname, other.pname);

              age = other.age;

          }

          return *this;

     }

 

     ~Human() {

          delete[] pname;

     }

 

     void intro() {

          printf("À̸§ = %s, ³ªÀÌ = %d\n", pname, age);

     }

};

 

class Book

{

private:

     char title[32];

     Human author;

 

public:

     Book() { strcpy(title, "Á¦¸ñ ¹ÌÁ¤"); }

     Book(char *aName, int aAge, char *aTitle) :

          author(aName, aAge) {

          strcpy(title, aTitle);

     }

     void OutBook() {

          printf("Ã¥ Á¦¸ñ : %s\n", title);

          printf("ÀúÀÚ Á¤º¸ => "); author.intro();

     }

};

 

int main()

{

     Book android("±è»óÇü", 29, "¾Èµå·ÎÀ̵å ÇÁ·Î±×·¡¹Ö Á¤º¹");

     android.OutBook();

     Book conquer;

     conquer = android;

     conquer.OutBook();

}

 

½ÇÇà°á°ú

Ã¥ Á¦¸ñ : ¾Èµå·ÎÀ̵å ÇÁ·Î±×·¡¹Ö Á¤º¹

ÀúÀÚ Á¤º¸ => À̸§ = ±è»óÇü, ³ªÀÌ = 29

Ã¥ Á¦¸ñ : ¾Èµå·ÎÀ̵å ÇÁ·Î±×·¡¹Ö Á¤º¹

ÀúÀÚ Á¤º¸ => À̸§ = ±è»óÇü, ³ªÀÌ = 29

 

Ã¥À» Ç¥ÇöÇÏ´Â Book Ŭ·¡½º´Â ÀúÀÚ Á¤º¸¸¦ Ç¥ÇöÇϱâ À§ÇØ Human °´Ã¼ÀÎ author¸¦ Æ÷ÇÔÇÑ´Ù. BookÀÇ »ý¼ºÀÚ´Â À̸§°ú ³ªÀÌ Á¤º¸¸¦ ¹Þ¾Æ HumanÀÇ »ý¼ºÀÚ¸¦ È£ÃâÇÏ¿© author Æ÷ÇÔ °´Ã¼¸¦ ÃʱâÈ­ÇÑ´Ù. main¿¡¼­ android °´Ã¼¸¦ »ý¼ºÇÏ°í conquer ºó °´Ã¼¸¦ ¸¸µç ÈÄ ´ëÀÔÇÑ´Ù. µÎ Ã¥ÀÌ Á¤»óÀûÀ¸·Î Àß ÃʱâÈ­µÈ´Ù.

Book Ŭ·¡½º´Â º°µµÀÇ ´ëÀÔ ¿¬»êÀÚ°¡ ¾ø¾î ÄÄÆÄÀÏ·¯°¡ ¸¸µç µðÆúÆ® ´ëÀÔ ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© ¸â¹ö¸¦ 1:1·Î ´ëÀÔÇÑ´Ù. titleÀº ´Ü¼ø ŸÀÔÀ̹ǷΠ¸Þ¸ð¸® º¹»çµÇÁö¸¸ author °´Ã¼´Â HumanÀÇ ´ëÀÔ ¿¬»êÀÚ¸¦ ÅëÇØ ±íÀº º¹»ç¸¦ ¼öÇàÇÑ´Ù. ¸â¹öº° º¹»ç´Â ´ëÀÔ ¿¬»êÀÚ¸¦ ÅëÇØ ´ëÀÔÇÑ´Ù´Â ¸é¿¡¼­ ´Ü¼øÇÑ ¸Þ¸ð¸® º¹»ç¿Í´Â ´Ù¸£´Ù.

 

HumanÀÌ ´ëÀÔ ¿¬»êÀÚ¸¦ Á¤ÀÇÇÏÁö ¾ÊÀ¸¸é author Æ÷ÇÔ °´Ã¼°¡ ¾èÀº º¹»ç¸¦ ¼öÇàÇÏ¿© ¹öÆÛ¸¦ °øÀ¯ÇÏ°Ô µÇ¹Ç·Î ´Ù¿îµÈ´Ù. °ú¿¬ ±×·±Áö HumanÀÇ ´ëÀÔ ¿¬»êÀÚ¸¦ ÁÖ¼® ó¸®ÇØ ³õ°í ½ÇÇàÇØ º¸¾Æ¶ó. Æ÷ÇÔµÈ author °´Ã¼°¡ ´ëÀÔ ¿¬»êÀÚ¸¦ Àß Á¤ÀÇÇÏ°í ÀÖ¾î BookÀº µðÆúÆ® ´ëÀÔ ¿¬»êÀڷεµ ÃæºÐÇÏ´Ù.

Ŭ·¡½º°¡ º°µµÀÇ ´ëÀÔ ¿¬»êÀÚ¸¦ Á¤ÀÇÇÏÁö ¾ÊÀ¸¸é ÄÄÆÄÀÏ·¯ µðÆúÆ® ´ëÀÔ ¿¬»êÀÚ¸¦ ¸¸µéµÇ ´Ü ¿¹¿Ü°¡ ÀÖ´Ù. ¸â¹ö Áß¿¡ °ªÀ» º¯°æÇÒ ¼ö ¾ø´Â ·¹ÆÛ·±½º³ª »ó¼ö°¡ Æ÷ÇԵǾî ÀÖÀ¸¸é À̶§´Â ¸â¹öº° ´ëÀÔÀ» ÇÒ ¼ö ¾ø¾î µðÆúÆ® ´ëÀÔ ¿¬»êÀÚ°¡ »ý¼ºµÇÁö ¾Ê´Â´Ù.

 

ConstRef

#include <stdio.h>

 

class ConstRef

{

public:

     int value;

     int &ri;

     const int ci;

     ConstRef(int av, int &ari, const int aci) : value(av), ri(ari), ci(aci) { }

};

 

int main()

{

     int i, j;

     ConstRef t1(1, i, 2);

     ConstRef t2(3, j, 4);

     t2 = t1;              // ¿¡·¯

}

 

ConstRef Ŭ·¡½º´Â ÀÏ¹Ý ¸â¹ö value¿Í ·¹ÆÛ·±½º ¸â¹ö ri, »ó¼ö ¸â¹ö ci¸¦ °¡Áö°í ÀÖ´Ù. ·¹ÆÛ·±½º¿Í »ó¼ö ¸â¹ö´Â »ý¼ºÀÚÀÇ ÃʱâÈ­ ¸®½ºÆ®¿¡¼­ ÃʱâÈ­ÇÑ´Ù. mainÀÇ Å×½ºÆ® Äڵ忡¼­ µÎ °³ÀÇ °´Ã¼ t1, t2¸¦ »ý¼ºÇÏ°í t2¸¦ t1¿¡ ´ëÀÔÇÑ´Ù. ConstRef°¡ º°µµÀÇ ´ëÀÔ ¿¬»êÀÚ¸¦ Á¤ÀÇÇÏÁö ¾ÊÀ¸¹Ç·Î t1ÀÇ ¸ðµç ¸â¹ö°¡ t2·Î ´ëÀ﵃ °ÍÀÌ´Ù.

±×·¯³ª ÀÌ ´ëÀÔÀº Çã°¡µÇÁö ¾Ê´Â´Ù. ·¹ÆÛ·±½º´Â ´ë»óü°¡ ÇÑ ¹ø Á¤ÇØÁö¸é º¯°æÇÒ ¼ö ¾ø´Ù. t2.ri´Â »ý¼ºµÉ ¶§ºÎÅÍ j¿¡ ´ëÇÑ º°¸íÀ¸·Î Á¤ÀǵǾî Á×À» ¶§±îÁö j¸¸ °¡¸®ÄÑ¾ß ÇÑ´Ù. °´Ã¼³¢¸®ÀÇ ´ëÀÔ¿¡ ÀÇÇØ t1.riÀÎ i¸¦ »õ·Î¿î ´ë»óü·Î ÁöÁ¤ÇÏ·Á°í ÇßÀ¸¹Ç·Î ÀÌ´Â ·¹ÆÛ·±½ºÀÇ Á¤ÀÇ¿¡ ¸ÂÁö ¾Ê´Ù. »ó¼ö ¸â¹öµµ ¸¶Âù°¡Áö ±ÔÄ¢ÀÌ Àû¿ëµÈ´Ù. t2.ci´Â »ý¼ºÇÒ ¶§ 4·Î ÃʱâÈ­µÇ¾î ¾ðÁ¦±îÁö°í 4ÀÇ °ª¸¸ °¡Á®¾ß Çϴµ¥ ¸â¹ö ´ëÀÔ¿¡ ÀÇÇØ °©ÀÚ±â 2ÀÇ °ªÀ¸·Î º¯°æµÇ¾î¾ß ÇÏ´Ï ÀÌ ¶ÇÇÑ »ó¼öÀÇ Á¤ÀÇ¿¡ ¾î±ß³­´Ù.

±×·¡¼­ ÄÄÆÄÀÏ·¯´Â ·¹ÆÛ·±½º ¸â¹ö³ª »ó¼ö ¸â¹ö¸¦ °¡Áø Ŭ·¡½º¿¡ ´ëÇؼ­´Â ¼³»ç ´ëÀÔ ¿¬»êÀÚ°¡ ¾ø´Ù ÇÏ´õ¶óµµ µðÆúÆ® ´ëÀÔ ¿¬»êÀÚ¸¦ Á¤ÀÇÇÏÁö ¾Ê´Â´Ù. ÀÌ·± Ŭ·¡½º´Â »ç½Ç»ó ´ëÀÔÇÒ ¼ö ¾øÀ¸¹Ç·Î ´ëÀÔ ¿¬»êÀÚ¸¦ ¼û°Ü ±ÝÁöÇϵ簡 ¾Æ´Ï¸é ´ëÀÔ °¡´ÉÇÑ ¸â¹ö¸¸ ¼±º°ÀûÀ¸·Î ´ëÀÔÇϵµ·Ï º°µµÀÇ ´ëÀÔ ¿¬»êÀÚ¸¦ Á¤ÀÇÇØ¾ß ÇÑ´Ù. ´ÙÀ½ Äڵ带 Ãß°¡Çϸé ÄÄÆÄÀϵȴÙ.

 

ConstRef &operator=(const ConstRef &other) {

     if (this != &other) {

          value = other.value;

     }

     return *this;

}

 

»ó¼ö¿Í ·¹ÆÛ·±½º´Â ±×´ë·Î µÎ°í º¯°æÇÒ ¼ö ÀÖ´Â valueÀÇ °ª¸¸ other·ÎºÎÅÍ ´ëÀԹ޴´Ù. ÀÌ ¿¬»êÀÚ º»Ã¼¿¡ ri = Other.ri¸¦ ¾²¸é Áº¯ °´Ã¼ÀÇ ri ´ë»óü °ªÀ¸·Î ¿ìº¯ °´Ã¼ÀÇ ri ´ë»óüÀÇ °ªÀ» ´ëÀÔ¹Þ´Â Äڵ尡 µÈ´Ù. rc = Other.rc ´ëÀÔ¹®Àº »ó¼ö¸¦ º¯°æÇÒ ¼ö ¾ø¾î ¿¡·¯ÀÌ´Ù.

¿À¹ö·Îµù°ú ¿À¹ö¶óÀ̵ù

¿À¹ö·Îµù(Overloading)°ú ¿À¹ö¶óÀ̵ù(Overriding)Àº ¹ßÀ½ÀÌ ºñ½ÁÇÏ°í ¶æµµ À¯»çÇؼ­ Àß Çò°¥¸°´Ù. ¿À¹ö·ÎµùÀº Àμö ¸ñ·ÏÀÌ ´Ù¸¥ ÇÔ¼ö¸¦ °°Àº À̸§À¸·Î Á¤ÀÇÇÏ´Â °ÍÀ̸ç Áߺ¹Á¤ÀǶó°í ÇÑ´Ù. ¿À¹ö¶óÀ̵ùÀº »ó¼Ó¹ÞÀº ¸â¹ö ÇÔ¼ö¸¦ ÀÚ½Ä Å¬·¡½º°¡ ¼öÁ¤ÇÏ´Â °ÍÀ̸ç ÀçÁ¤ÀǶó°í ÇÑ´Ù. ¿À¹ö·ÎµùÀº ÀÌ¹Ì ÀÖ´Â ÇÔ¼ö ÁýÇÕ¿¡ Çϳª¸¦ ´õ Ãß°¡ÇÏ´Â °ÍÀÌ°í ¿À¹ö¶óÀ̵ùÀº ÀÌ¹Ì ÀÖ´Â ÇÔ¼ö¸¦ ¹«½ÃÇÏ°í »õ·Î ¸¸µå´Â °ÍÀÌ´Ù.

¿À¹ö·ÎµùÀº Ŭ·¡½º¿Í Á÷Á¢ÀûÀÎ »ó°üÀÌ ¾ø¾î Àü¿ª ÇÔ¼öµµ ¿À¹ö·ÎµùÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ¸â¹ö ÇÔ¼öµµ ÀÏÁ¾ÀÇ ÇÔ¼öÀ̹ǷΠ¿À¹ö·Îµù °¡´ÉÇÏ´Ù. ÀÌ¿¡ ºñÇØ ¿À¹ö¶óÀ̵ùÀº Ŭ·¡½º°£ÀÇ °ü°è, ±× Áß¿¡¼­µµ »ó¼ÓµÈ ºÎ¸ð¿Í ÀÚ½Ä °ü°è¿¡¼­¸¸ Àû¿ëµÇ¸ç Àü¿ª ÇÔ¼ö¿¡ ´ëÇؼ­´Â Àû¿ëµÇÁö ¾Ê´Â´Ù. »ó¼Ó °èÃþ¿¡¼­ µÎ ±â¹ýÀÌ µ¿½Ã¿¡ Àû¿ëµÉ ¶§ÀÇ È¿°ú°¡ ºñ»ó½ÄÀûÀ̾ Çò°¥¸°´Ù.

Ŭ·¡½ºÀÇ ¸â¹ö ÇÔ¼ö¸¦ Áߺ¹ Á¤ÀÇÇÒ ¼ö ÀÖ°í ¶Ç ÆÄ»ý Ŭ·¡½º¿¡¼­ »ó¼Ó¹ÞÀº ¸â¹ö¸¦ ÀçÁ¤ÀÇÇÒ ¼öµµ ÀÖ´Ù. ÆÄ»ý Ŭ·¡½º¿¡¼­ »ó¼ÓµÈ ¸â¹ö ÇÔ¼ö¿Í Àμö ¸ñ·ÏÀÌ ´Ù¸¥ ÇÔ¼ö¸¦ °°Àº À̸§À¸·Î ÀçÁ¤ÀÇÇϸé À̶§´Â ¿À¹ö·ÎµùÀÌ Àû¿ëµÇÁö ¾Ê´Â´Ù. Áï, Àμö ¸ñ·ÏÀÌ ¾Æ¹«¸® ´Þ¶óµµ ÆÄ»ý Ŭ·¡½º°¡ °°Àº À̸§À¸·Î ÇÔ¼ö¸¦ ÀçÁ¤ÀÇÇÏ¸é µ¿ÀÏÇÑ À̸§À» °¡Áö´Â ºÎ¸ðÀÇ ¸ðµç ÇÔ¼öµéÀÌ °¡·ÁÁø´Ù. ´ÙÀ½ ¿¹Á¦·Î À̸¦ Å×½ºÆ®ÇØ º¸ÀÚ.

 

InheritOverload

#include <stdio.h>

 

class B

{

public:

     void f(int a) { puts("B::f(int)"); }

     void f(double a) { puts("B::f(double)"); }

};

 

class D : public B

{

public:

     void f(char *a) { puts("D::f(char *)"); }

};

 

int main()

{

     D d;

     d.f("");               // °¡´É

     d.f(1);          // ¿¡·¯

     d.f(2.3);       // ¿¡·¯

}

 

B::f(int), B::f(double) ÇÔ¼ö°¡ Àִµ¥ ÆÄ»ý Ŭ·¡½ºÀÎ D¿¡¼­ D::f(char *)¸¦ ÀçÁ¤ÀÇÇß´Ù. ÀÌ ÇÔ¼öµéÀº Àμö ¸ñ·ÏÀÌ ´Þ¶ó °°Àº À̸§À¸·Î Áߺ¹ Á¤ÀÇÇÒ ¼ö ÀÖÁö¸¸ »ó¼Ó °ü°è¿¡¼­´Â ´Ù¸¥ ±ÔÄ¢ÀÌ Àû¿ëµÈ´Ù. D¿¡¼­ f(char *)¸¦ ÀçÁ¤ÀÇÇÏ´Â ¼ø°£ ±â¹Ý Ŭ·¡½ºÀÇ f(int), f(double)Àº ¸ðµÎ °¡·ÁÁø´Ù. DÀÇ °´Ã¼¿¡¼­ f ÇÔ¼ö¸¦ È£ÃâÇϸé ÀÌ´Â ÀÚ½ÅÀÇ ¸â¹ö ÇÔ¼ö f(char *)¸¦ ÀǹÌÇÏ¸ç ¼³»ç d.f(1)·Î Á¤¼ö Àμö¸¦ Á־ »ó¼Ó¹ÞÀº f(int)°¡ È£ÃâµÇÁö ¾Ê´Â´Ù. ±×·¯³ª °¡·ÁÁú »ÓÀÌÁö »ó¼ÓÀº µÇ¹Ç·Î ¹üÀ§ ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© d.B::f(1), d.B::f(2.3)À¸·Î È£ÃâÇÏ¸é °¡·ÁÁø ºÎ¸ðÀÇ ¸â¹ö ÇÔ¼ö¸¦ È£ÃâÇÒ ¼öµµ ÀÖ´Ù.

¿À¹ö·Îµù°ú ¿À¹ö¶óÀ̵ùÀÌ ¾ç¸³ÇÒ ¼ö ¾ø¾î »ó¼Ó¹ÞÀº ¸â¹ö ÇÔ¼ö¸¦ ÀçÁ¤ÀÇÇÒ ¶§´Â ¿ÏÀüÈ÷ °°Àº ¿øÇüÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. ºÎ¸ðÀÇ f(int)¸¦ »ó¼Ó¹ÞÀ¸¸é¼­ ¿©±â¿¡ Ãß°¡·Î f(char *)¸¦ ¿À¹ö·ÎµùÇÒ ¼ö ¾ø´Ù. ¸¸¾à ¿øÇüÀÌ ´Ù¸£´Ù¸é ¾Æ¿¹ ´Ù¸¥ À̸§À» ¾²´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù. ±â¹Ý Ŭ·¡½º¿¡ ¿©·¯ °³ÀÇ ÇÔ¼ö°¡ Áߺ¹ Á¤ÀǵǾî ÀÖ´Ù¸é ¸ðµÎ ÀçÁ¤ÀÇÇϰųª ¾Æ´Ï¸é ¾Æ¿¹ ÀçÁ¤ÀÇÇÏÁö ¸»¾Æ¾ß ÇÑ´Ù. Çϳª¸¸ ÀçÁ¤ÀÇÇϸé ÀÌ ÇÔ¼ö¿¡ ÀÇÇØ ¿øÇüÀÌ ´Ù¸¥ ÇÔ¼öµéÀº ¸ðµÎ °¡·ÁÁø´Ù.

ÀÌ·¸°Ô µÇ¾î ÀÖ´Â ÀÌÀ¯´Â ´Ù¼Ò º¹ÀâÇÑ »çÁ¤ÀÌ ÀÖ´Ù. ¿À¹ö·ÎµùµÈ ÇÔ¼öÀÇ ÀϺθ¦ »ó¼Ó¹ÞÀ¸¸é¼­ ±× Áß ¿øÇÏ´Â °Í¸¸ ÀçÁ¤ÀÇÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù¸é ¿À¹ö·ÎµùµÈ ÇÔ¼ö¸¦ °áÁ¤ÇÏ´Â ¸ÞÄ¿´ÏÁòÀÌ °ú´ÙÇÏ°Ô Á¤±³ÇØÁ®¾ß ÇÑ´Ù. ¶ÇÇÑ ºÎ¸ð Ŭ·¡½º°¡ ¿À¹ö·ÎµùµÈ ÇÔ¼öÀÇ ¿øÇüÀ» Çϳª ´õ Ãß°¡ÇÒ ¶§ ÀÚ½Ä Å¬·¡½º°¡ È£ÃâÇÏ´Â ÇÔ¼ö°¡ ¶æÇÏÁö ¾Ê°Ô ´Ù¸¥ ÇÔ¼ö·Î ¹Ù²î¾î ¹ö¸± À§Çèµµ ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦¸¦ º¸ÀÚ.

 

OverrideOverload

#include <stdio.h>

 

class Base

{

public:

     void f(char *) { puts("B::f(char *)"); }

     void f(long) { puts("B::f(long)"); }

};

 

class Derived : public Base

{

public:

     void f(double) { puts("D::f(double)"); }

};

 

int main()

{

     Derived d;

     d.f(1234);

}

 

Base°¡ f(long), f(char *)¸¦ Áߺ¹ Á¤ÀÇÇØ ³õ¾Ò°í À̸¦ »ó¼ÓÇÑ Derived°¡ f(double)À» ÀçÁ¤ÀÇÇÏ°í ÀÖ´Ù. ¿À¹ö·ÎµùµÈ ¸â¹ö ÇÔ¼öÀÇ ÀϺθ¸ ÀçÁ¤ÀÇÇßÀ¸¹Ç·Î ºÎ¸ðÀÇ f ÇÔ¼ö´Â ¸ðµÎ °¡·ÁÁø´Ù. main¿¡¼­ d°´Ã¼ÀÇ f(1234) ÇÔ¼ö¸¦ È£ÃâÇߴµ¥ ½ÇÇàÇØ º¸¸é D::f(double) ÇÔ¼ö°¡ È£ÃâµÈ´Ù. 1234´Â f(long)ÀÌ ´õ °¡±õÁö¸¸ ÀÌ ÇÔ¼ö°¡ °¡·ÁÁ® °¡Àå °¡±î¿î ÇÔ¼ö°¡ È£ÃâµÈ´Ù. ¸¸¾à Derived°¡ ºÎ¸ðÀÇ ¿À¹ö·ÎµùµÈ ÇÔ¼ö¸¦ ÀüºÎ »ó¼Ó¹Þ´Â´Ù¸é f(1234)´Â f(long)ÀÌ È£ÃâµÇ´Â °ÍÀÌ ¿Ç´Ù. D::f(double) ÇÔ¼ö¸¦ Àá½Ã ÁÖ¼® ó¸®Çϸé ÀüºÎ »ó¼Ó¹ÞÀ¸¹Ç·Î À̶§´Â B::f(long)ÀÌ È£ÃâµÈ´Ù.

º¹ÀâÇÑ Å¬·¡½º °èÃþÀ» ÇÑ »ç¶÷ÀÌ ´Ù ¸¸µé±â´Â ¾î·Á¿ö ÆÀÀ» ÀÌ·ç¾î ¼³°èÇÏ´Â °ÍÀÌ º¸ÅëÀÌ´Ù. ÇÙ½É ±â¹Ý Ŭ·¡½º´Â ¿¬±¸¼Ò³ª °øÅë ¶óÀ̺귯¸® °³¹ß ºÎ¼­¿¡¼­ ¸¸µé°í ÀÀ¿ë ÇÁ·Î±×·¥ Á¦ÀÛÆÀ¿¡¼­ ÀÌ Å¬·¡½º¸¦ »ó¼Ó¹Þ¾Æ Àç»ç¿ëÇÏ´Â °ÍÀÌ ÀϹÝÀûÀÎ °³¹ß ÇüÅÂÀÌ´Ù. Base¸¦ ¸¸µç °³¹ßÀÚ°¡ ¾î´À³¯ ÀÚ½ÅÀÇ ÇÊ¿ä¿¡ ÀÇÇØ ´ÙÀ½ ÇÔ¼ö¸¦ Ãß°¡Çß´Ù°í ÇØ º¸ÀÚ.

 

class Base

{

public:

     void f(int) { puts("B::f(int)"); }

};

 

f(1234)ÀÇ 1234´Â doubleº¸´Ù long¿¡ °¡±õ°í longº¸´Ù int¿Í ´õ ÀÏÄ¡ÇϹǷΠd.f(1234)°¡ ¾î´À³¯ °©Àڱ⠺θðÀÇ »õ·Î »ý±ä ÇÔ¼ö¸¦ È£ÃâÇÏ°Ô µÈ´Ù. ¿À¹ö·ÎµùµÈ ÇÔ¼öµéÀº ºñ½ÁÇÑ µ¿ÀÛÀ» ÇÏ´Â °ÍÀÌ ¿øÄ¢ÀûÀÌÁö¸¸ ¶§·Î´Â ³»ºÎ ±¸ÇöÀÌ ¿ÏÀüÈ÷ ´Ù¸¦ ¼öµµ ÀÖ´Ù. Derived °³¹ßÀÚ´Â Àß µ¿ÀÛÇÏ´ø Ŭ·¡½º°¡ °©Àڱ⠿µ¹®µµ ¸ð¸¥Ã¤ ¾û¶×ÇÑ ÇÔ¼ö¸¦ È£ÃâÇØ ´ë´Â Å×·¯¸¦ ´çÇÏ°Ô µÈ´Ù.

¿À¹ö·ÎµùµÈ ÇÔ¼ö°¡ Çϳª ´õ ´Ã¾î³ª´Â °ÍÀº Ŭ·¡½ºÀÇ ÀÎÅÍÆäÀ̽º°¡ ¹Ù²î´Â °ÍÀÌ ¾Æ´Ï±â ¶§¹®¿¡ ÄÄÆÄÀÏ ¿¡·¯´Â ¹ß»ýÇÏÁö ¾Ê´Â´Ù. Ŭ·¡½º °èÃþÀÌ ±í´Ù¸é ºÎ¸ð Ŭ·¡½ºÀÇ ÇÔ¼ö ¸ñ·Ï º¯È­°¡ ¾îµð±îÁö ¿µÇâÀ» ¹ÌÄ¥Áö ±× ÆÄ±Þ È¿°ú¸¦ ¿¹ÃøÇϱ⠾î·Æ´Ù.

ÄÄÆÄÀÏ·¯´Â ¿À¹ö·ÎµùµÈ ÇÔ¼ö¸¦ °áÁ¤Çϱâ À§ÇØ ÀμöÀÇ Å¸ÀÔÀ» °Ë»çÇϴµ¥ ÀÌ °úÁ¤¿¡¼­ ¿ÏÀüÈ÷ ÀÏÄ¡ÇÏ´Â ÇÔ¼ö°¡ ¾øÀ» °æ¿ì ¾Ï½ÃÀûÀΠŸÀÔ º¯È¯À» ÅëÇØ ÃÖ´ëÇÑ ÀÏÄ¡ÇÏ´Â ÇÔ¼ö¸¦ ã´Â´Ù. º¹ÀâÇÑ ±ÔÄ¢¿¡ ÀÇÇØ È£ÃâÇÒ ÇÔ¼ö¸¦ °áÁ¤Çϴµ¥ ¿©±â¿¡ »ó¼Ó °èÃþ±îÁö Ãß°¡µÇ¸é ´õ¿í È¥¶õ½º·¯¿öÁø´Ù. ±×·¡¼­ C++Àº ¿À¹ö·ÎµùµÈ ÇÔ¼öµé Áß Çϳª¸¦ ÀçÁ¤ÀÇÇÒ °æ¿ì ³ª¸ÓÁö ÇÔ¼öµéÀ» ¾Æ¿¹ ¼û°Ü ¹ö¸²À¸·Î½á ÀÌ·± »ç°í¸¦ ¹Ì¿¬¿¡ ¹æÁöÇÑ´Ù.

´Ù¼Ò º¹ÀâÇѵ¥ °á·ÐÀ» ³»·Áº¸¸é ÀÌ·¸´Ù. ¿À¹ö·ÎµùµÈ ¸â¹ö ÇÔ¼öµéÀº ƯÁ¤ µ¿ÀÛÀ» ´Ù¾çÇÑ ¹æ½ÄÀ¸·Î ó¸®ÇÒ ¼ö ÀÖ´Â ÇÔ¼öÀÇ ¹­À½ÀÌ´Ù. ±×·¡¼­ ÆÄ»ý Ŭ·¡½º´Â ÀÌ ÇÔ¼öµéÀ» ÀüºÎ ÀçÁ¤ÀÇÇϵçÁö ¾Æ´Ï¸é °í½º¶õÈ÷ »ó¼Ó¹Þ¾Æ ±×´ë·Î ¾²µçÁö µÑ Áß Çϳª¸¦ ¼±ÅÃÇØ¾ß ÇÑ´Ù. ½ÇÁ¦·Î ¿À¹ö·Îµù°ú ¿À¹ö¶óÀ̵ùÀÌ Ãæµ¹ÇÏ´Â °æ¿ì´Â ¹ß»ý ºóµµ°¡ ±ØÈ÷ Èñ¹ÚÇÏ´Ù.

¹®¹ýÀÇ ¿¹¿Ü

¿©·¯¹ø ¾ê±âÇß´Ù½ÃÇÇ ºÎ¸ð ŸÀÔÀÇ Æ÷ÀÎÅÍ´Â ÀÚ½Ä °´Ã¼¸¦ °¡¸®Å³ ¼ö ÀÖÀ¸¸ç ¾ðÁ¦³ª ¾ÈÀüÇÏ´Ù. ±×·¯³ª ÀÌ ´ç¿¬ÇÑ ¹ýÄ¢¿¡ ¿¹¿Ü°¡ Á¸ÀçÇϴµ¥ ¹®¹ýÀûÀ¸·Î´Â °¡´ÉÇصµ ½ÇÁ¦·Î´Â ¹®Á¦°¡ »ý±â´Â °æ¿ì°¡ ÀÖ´Ù. ¾ðÁ¦Àΰ¡ ÇÏ¸é ºÎ¸ð ŸÀÔÀÇ Æ÷ÀÎÅÍ°¡ ÀÚ½Ä Å¸ÀÔ °´Ã¼ÀÇ ¹è¿­À» °¡¸®Å³ ¶§ÀÌ´Ù.

 

ObjArrayPtr

#include <stdio.h>

 

class Base

{

private:

     int bnum;

public:

     virtual void OutMessage() { printf("Base Class\n"); }

};

 

class Derived : public Base

{

private:

     int dnum;

public:

     virtual void OutMessage() { printf("Derived Class\n"); }

};

 

int main()

{

     Base arB[5];

     Derived arD[5];

 

     Base *pB = arD;

     for (int i = 0; i < 5; i++) {

          pB->OutMessage();

          pB++;

     }

}

 

Base ŸÀÔÀÇ Æ÷ÀÎÅÍ pB°¡ ÀÚ½Ä Å¸ÀÔÀÇ ¹è¿­ arDÀÇ ¹øÁö¸¦ ´ëÀԹ޾Ҵµ¥ ÀÌ ¹®ÀåÀº Àû¹ýÇÏ´Ù. arDÀÇ ¹è¿­ ¿ä¼ÒÀÎ D °´Ã¼¿¡´Â pB·ÎºÎÅÍ ÂüÁ¶µÇ´Â ¸ðµç ¸â¹ö º¯¼ö¿Í ¸â¹ö ÇÔ¼ö°¡ Á¸ÀçÇϱ⠶§¹®ÀÌ´Ù. ±×·¯³ª pB++·Î ´ÙÀ½ °´Ã¼·Î À̵¿ÇÒ ¶§´Â Á¤È®ÇÑ À§Ä¡¸¦ ãÁö ¸øÇÑ´Ù. ¿Ö³ÄÇϸé Æ÷ÀÎÅÍ¿¡ ´ëÇÑ ++ ¿¬»êÀº sizeof(´ë»óü)¸¸Å­ÀÇ À̵¿Àε¥ Base¿Í DerivedÀÇ Å©±â°¡ ´Ù¸£±â ¶§¹®ÀÌ´Ù.

ÄÄÆÄÀÏ·¯´Â pB°¡ °¡¸®Å°´Â ´ë»óüÀÇ Å©±â°¡ ¸â¹ö º¯¼ö¿Í vptr(°¡»ó ÇÔ¼ö Å×À̺íÀ» °¡¸®Å°´Â Æ÷ÀÎÅÍ)ÀÇ Å©±â¸¦ ´õÇÑ 8¹ÙÀÌÆ®¶ó°í »ý°¢Çϴµ¥ arDÀÇ ¿ä¼Ò´Â 12¹ÙÀÌÆ®ÀÇ Å©±â¸¦ °¡Áø´Ù. ++¿¬»êÀ¸·Î Áõ°¡ÇÑ °÷¿¡ ÀÖ´Â °´Ã¼¿¡´Â ¹Ýµå½Ã vptrÀÌ ÀÖ¾î¾ß Çϴµ¥ ±×·¸Áö ¸øÇÑ »óȲÀÌ ¹ú¾îÁö°í ¾û¶×ÇÑ °¡»ó ÇÔ¼ö Å×À̺íÀ» ã¾Æ ±× ³»¿ë´ë·Î Á¡ÇÁÇØ ¹ö¸°´Ù.

´ÙÀ½Àº ¶Ç ÇϳªÀÇ ¿¹¿ÜÀε¥ ºÎ¸ð ŸÀÔÀÇ Æ÷ÀÎÅÍ°¡ ÀÚ½ÄÀ» °¡¸®Å³ ¼ö ÀÖÁö¸¸ private »ó¼ÓÇÑ °æ¿ì´Â Á¤È®ÇÑ ºÎ¸ð ÀÚ½Ä °ü°è¶ó°í º¸±â ¾î·Á¿ö ÀÌ Á¤ÀÇ°¡ ¼º¸³µÇÁö ¾Ê´Â´Ù. private ±â¹ýÀ¸·Î Á¦Ç°¿¡ ³¯Â¥ Á¤º¸¸¦ Àç»ç¿ëÇÏ´Â ¿¹Á¦ÀÇ ³¡¿¡ ´ÙÀ½ Äڵ带 ÀÛ¼ºÇØ º¸ÀÚ.

 

class Product : private Date

{

....

int main()

{

     Product shrimp("»õ¿ì±ø", "³ó½É", 2020, 8, 15, 900);

     shrimp.OutProduct();

     Date *pD;

     pD = &shrimp;                // ¿¡·¯

}

 

Date¸¦ private »ó¼ÓÇÏ¿© Product¸¦ ÆÄ»ý½ÃÄ×´Ù. ÀÌ »óÅ¿¡¼­ Date ŸÀÔÀÇ Æ÷ÀÎÅÍ pD°¡ Product °´Ã¼ shrimpÀÇ ¹øÁö¸¦ ´ëÀԹ޾Ҵµ¥ ÀÌ ´ëÀÔ¹®Àº ¿¡·¯·Î 󸮵ȴÙ. ¿Ö³ÄÇϸé private »ó¼ÓÀº ÀÎÅÍÆäÀ̽º¸¦ »ó¼Ó¹ÞÁö ¾ÊÀ¸¹Ç·Î shrimp¿¡´Â OutDate¶ó´Â ÀÎÅÍÆäÀ̽º°¡ Á¸ÀçÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. pD¿¡ &shrimp¸¦ ´ëÀÔÇÏ´Â °ÍÀ» Çã¶ôÇϸé pD->OutDate()µµ °¡´ÉÇØ¾ß Çϴµ¥ shrimp °´Ã¼¿¡ OutDate´Â ¼û°ÜÁ® ÀÖ¾î ¿ÜºÎ¿¡¼­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ¾ø´Ù. »ç½Ç private »ó¼ÓÀº ±¸Çö¸¸ »ó¼ÓÇϹǷΠ±â¹Ý Ŭ·¡½º¿Í ÆÄ»ý Ŭ·¡½º´Â ºÎ¸ð Àڽİ£À̶ó°í º¸Áö ¾Ê´Â´Ù. ¹°·Ð public »ó¼ÓÀ¸·Î ¹Ù²Ù¸é À§ ÄÚµå´Â Àß µ¿ÀÛÇÑ´Ù.

C ¾ð¾î¿¡¼­ÀÇ ´ÙÇü¼º

´ÙÇü¼ºÀº °´Ã¼ ÁöÇâÀÇ Å« Ư¡ÀÌÀÚ ²ÉÀ̶ó°í ÇÒ¸¸Å­ ÈǸ¢ÇÑ ±â´ÉÀÌ´Ù. °´Ã¼ ÁöÇâÀº ƯÁ¤ ¾ð¾îÀÇ ±â´ÉÀÌ ¾Æ´Ï¶ó ÇÁ·Î±×·¡¸Ó°¡ ¹®Á¦¸¦ Ǫ´Â »ç°í ¹æ½ÄÀ̾ C++·Î¸¸ ´ÙÇü¼ºÀ» ±¸ÇöÇÒ ¼ö ÀÖ´Â °ÍÀº ¾Æ´Ï´Ù. C³ª ÆĽºÄ®°°Àº ±¸Á¶ÀûÀÎ ¾ð¾î´Â ¹°·ÐÀÌ°í ¾î¼Àºí¸®°°Àº Àú±Þ ¾ð¾î¿¡¼­µµ C++ ÄÄÆÄÀÏ·¯°¡ ÇÔ¼ö¸¦ µ¿ÀûÀ¸·Î °áÇÕÇÏ´Â ¹æ½ÄÀ» ±×´ë·Î Èä³»³»±â¸¸ ÇÑ´Ù¸é ¾ó¸¶µçÁö ´ÙÇü¼ºÀ» ±¸ÇöÇÒ ¼ö ÀÖ´Ù.

C¾ð¾î·Îµµ °´Ã¼ÀÇ Á¾·ù¸¦ ³ªÅ¸³»´Â ŸÀÔ Çʵ带 ÀÛ¼ºÇÏ°í °ø¿ëü·Î ÀÌµé °´Ã¼¸¦ ¹­À¸¸é ´ÙÇüÀûÀ¸·Î µ¿ÀÛÇÑ´Ù. ´ÙÇü¼ºÀÌ C++ÀÇ °íÀ¯ ±â´ÉÀÌ ¾Æ´Ï¶ó´Â °ÍÀ» Áõ¸íÇØ º¸±â À§ÇØ ±×·¡ÇÈ °´Ã¼ ÁýÇÕÀ» C¾ð¾î·Î ´Ù½Ã ÀÛ¼ºÇØ º¸ÀÚ. ¹°·Ð °í±â´ÉÀÇ °´Ã¼ ÁöÇâ ¾ð¾î°¡ ³ÑÃijª´Â ¿äÁò ¼¼»ó¿¡ C¾ð¾î·Î ´ÙÇü¼ºÀ» ±¸ÇöÇØ¾ß ÇÒ ½Ç¿ëÀû ÀÌÀ¯´Â ¾øÁö¸¸ ±âÁ¸ÀÇ C¾ð¾î¿¡ ´ëÇÑ Áö½ÄÀ» ¹ÙÅÁÀ¸·Î ´ÙÇü¼ºÀÇ ±âº» ¿ø¸®¸¦ ÀÌÇØÇϴµ¥ µµ¿òÀÌ µÈ´Ù. ´ÙÀ½ ¿¹Á¦´Â C ÄÄÆÄÀÏ·¯·Îµµ Àß ÄÄÆÄÀÏµÇ°í ´ÙÇüÀûÀ¸·Îµµ µ¿ÀÛÇÑ´Ù.

 

CPolymorphism

#include <stdio.h>

 

typedef enum { LINE, CIRCLE, RECTANGLE } Shape;

 

typedef struct {

     int x1, y1, x2, y2;

} Line;

 

typedef struct {

     int x, y, r;

} Circle;

 

typedef struct {

     int left, top, right, bottom;

} Rect;

 

typedef struct {

     Shape Type;

     union {

          Line L;

          Circle C;

          Rect R;

     } Data;

} Graphic;

 

void Draw(Graphic *p)

{

     switch (p->Type) {

     case LINE:

          puts("¼±À» ±ß½À´Ï´Ù.");

          break;

     case CIRCLE:

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

          break;

     case RECTANGLE:

          puts("¿ä°Ç »ç°¢ÇüÀÔ´Ï´Ù.");

          break;

     }

}

 

int main()

{

     Graphic ar[5] = {

          { LINE,1,2,3,4 },

          { CIRCLE,5,6,7,0 },

          { RECTANGLE,8,9,10,11 },

          { LINE,12,13,14,15 },

          { CIRCLE,16,17,18,0 },

     };

 

     int i;

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

          Draw(&ar[i]);

     }

}

½ÇÇà°á°ú

¼±À» ±ß½À´Ï´Ù.

µ¿±×¶ó¹Ì ±×·È´Ù Ä¡°í.

¿ä°Ç »ç°¢ÇüÀÔ´Ï´Ù.

¼±À» ±ß½À´Ï´Ù.

µ¿±×¶ó¹Ì ±×·È´Ù Ä¡°í.

 

°¢ µµÇü¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áö´Â Line, Circle, Rect µîÀÇ ±¸Á¶Ã¼¸¦ ¸ÕÀú ¼±¾ðÇÑ´Ù. ÀÌ ±¸Á¶Ã¼¿¡´Â Á÷¼±, ¿ø, »ç°¢Çü¿¡ ´ëÇÑ ÁÂÇ¥ Á¤º¸°¡ ¸â¹ö·Î Æ÷ÇԵǾî ÀÖ´Ù. ±×¸®°í ÀÌ ¸ðµç µµÇüÀ» Æ÷°ýÇÒ ¼ö ÀÖ´Â GraphicÀ̶ó´Â ±¸Á¶Ã¼¸¦ ¼±¾ðÇϴµ¥ ÀÌ ±¸Á¶Ã¼¿¡´Â µµÇüÀÇ Á¾·ù¸¦ Ç¥ÇöÇÏ´Â Type Çʵå¿Í °¢ µµÇüÀÇ Á¤º¸°¡ °ø¿ëü ¸â¹ö·Î Æ÷ÇԵȴÙ. µµÇüÀÇ Á¾·ù°¡ Á¦ÇÑÀûÀ̹ǷΠTypeÀº ¿­°ÅÇüÀ¸·Î ¼±¾ðÇß´Ù.

Graphic ŸÀÔÀÇ º¯¼ö Çϳª´Â ÇϳªÀÇ µµÇüÀ» Ç¥ÇöÇϴµ¥ ÇÑ µµÇüÀÌ ¿øÀ̸鼭 µ¿½Ã¿¡ »ç°¢ÇüÀÏ ¼ö´Â ¾øÀ¸¹Ç·Î µµÇü Á¤º¸¸¦ °ø¿ëü·Î ¼±¾ðÇÏ´Â °ÍÀÌ ¸Þ¸ð¸® °ü¸® Ãø¸é¿¡¼­ À¯¸®ÇÏ´Ù. ´Ü, ÀÌ·¸°Ô ÇÒ °æ¿ì ÀÌ º¯¼ö°¡ ¾î¶² µµÇüÀ» Ç¥ÇöÇÏ´ÂÁö ¾Ë ¼ö ¾ø¾î º°µµÀÇ Type Çʵ尡 ÇÊ¿äÇÏ´Ù. °ø¿ëü´Â ±â¾ï Àå¼Ò¸¦ °øÀ¯ÇÒ »ÓÀ̹ǷΠ¾î¶² Á¤º¸¸¦ °¡Áö°í ÀÖ´ÂÁö ½º½º·Î ±â¾ïÇØ¾ß ÇÑ´Ù. ÀÏ·ÃÀÇ ±¸Á¶Ã¼ ¼±¾ð¹®¿¡ ÀÇÇØ ´ÙÀ½°ú °°Àº °³³äÀûÀÎ °èÃþÀÌ Çü¼ºµÈ´Ù.

Draw ÇÔ¼ö´Â µµÇüÀ» ´ëÇ¥ÇÏ´Â Graphic ŸÀÔÀÇ Æ÷ÀÎÅ͸¦ ¹Þ¾Æ ÀÌ ±¸Á¶Ã¼ÀÇ Á¤º¸´ë·Î µµÇüÀ» ±×¸°´Ù. ĸ½¶È­ ±â´ÉÀÌ ¾øÀ¸¹Ç·Î Draw ÇÔ¼ö´Â ¿ÜºÎÀÇ Àü¿ª ÇÔ¼ö·Î Á¸ÀçÇÒ ¼ö ¹Û¿¡ ¾øÀ¸¸ç ±×¸®°íÀÚ ÇÏ´Â µµÇüÀÇ Á¤º¸¸¦ Àμö·Î Àü´Þ¹Þ´Â´Ù. À̶§ Àμö·Î Àü´ÞµÇ´Â Graphic *ŸÀÔÀº ¸ðµç µµÇüÀÇ ´ëÇ¥ ŸÀÔÀÌ µÇ´Âµ¥ »ó¼ÓÀÇ °³³äÀÌ ¾ø¾î °ø¿ëü·Î ¸ðµç Á¤º¸¸¦ Æ÷ÇÔÇÏ´Â ±¸Á¶Ã¼¸¦ ¸¸µé¾î ´ëÇ¥ ŸÀÔÀ¸·Î »ç¿ëÇÑ´Ù.

Draw ÇÔ¼ö´Â Graphic ŸÀÔÀÇ Àμö·ÎºÎÅÍ Type ¸â¹ö¸¦ ÀÐ¾î µµÇüÀ» ¾î¶² ½ÄÀ¸·Î ±×¸±Áö °áÁ¤ÇÑ´Ù. Type ¸â¹ö´Â ¸ðµç µµÇü¿¡ ¹Ýµå½Ã Á¸ÀçÇØ¾ß Çϸç ÀÚÁÖ »ç¿ëÇÏ´Â Á¤º¸À̹ǷΠ°¡±ÞÀû ù ¹ø° ¸â¹ö·Î ¹èÄ¡ÇÏ´Â °ÍÀÌ À¯¸®ÇÏ´Ù. TypeÀº µµÇüÀ» ±×¸± ¹æ¹ýÀ» ½ÇÇàÁß¿¡ °áÁ¤ÇÏ´Â Á¤º¸À̸ç C++ÀÇ vptr¿¡ ºñÀ¯ÇÒ ¼ö ÀÖ´Ù. Draw ÇÔ¼ö´Â switch ¹®À¸·Î ½ÇÇà½Ã¿¡ È£ÃâÇÒ ÇÔ¼ö¸¦ ¼±ÅÃÇÏ¿© µµÇüÀ» ±×¸®´Â ÇÔ¼ö°¡ µ¿ÀûÀ¸·Î °áÇյǴ °Í°ú È¿°ú°¡ µ¿ÀÏÇÏ´Ù.

main¿¡¼­ Å©±â 5ÀÇ Graphic ¹è¿­À» ¼±¾ðÇϴµ¥ °ø¿ëü´Â ù ¹ø° ¸â¹ö¿¡ ´ëÇؼ­¸¸ ÃʱⰪÀ» ÁÙ ¼ö ÀÖ¾î Type ´ÙÀ½ÀÇ ÃʱⰪÀº ¸ðµÎ LineÀÇ ¸â¹ö¿Í ´ëÀÀµÈ´Ù. ÀÌ ¿¹Á¦ÀÇ °æ¿ì Circle, RectÀÇ ¸â¹ö¿Í LineÀÇ ¸â¹ö°¡ ŸÀÔ, °³¼ö°¡ °ÅÀÇ ÀÏÄ¡Çؼ­ º° ¹®Á¦°¡ ¾øÁö¸¸ Line¿¡ ¾ø´Â ¸â¹ö´Â Ãʱâ½Ä¿¡ ¾µ ¼ö ¾ø°í ÃʱâÈ­ ÈÄ Á÷Á¢ ´ëÀÔÇØ¾ß ÇÑ´Ù. ½ÇÁ¦ ¿¹¿¡¼­´Â »ç¿ëÀÚ°¡ µµÇüÀ» ±×¸± ¶§ ÀÌ Á¤º¸°¡ ä¿öÁø´Ù. ar ±¸Á¶Ã¼ ¹è¿­ÀÇ ¸ð¾çÀº ´ÙÀ½°ú °°´Ù.

µµÇüÀÇ ÁýÇÕÀ» Ç¥ÇöÇÏ´Â ¹è¿­¿¡ ´ëÇØ ·çÇÁ¸¦ µ¹¸ç Draw(&ar[i])¸¦ ¹Ýº¹ÀûÀ¸·Î È£ÃâÇÏ¸é ¹è¿­ ³»ÀÇ ¸ðµç µµÇüÀÌ ±×·ÁÁø´Ù. ÀÌ ¹®ÀåÀÌ ´ÙÇüÀûÀ¸·Î µ¿ÀÛÇϴµ¥ ¶È°°Àº ÄÚµåÀÌÁö¸¸ ar[i]¿¡ ÀúÀåµÈ Á¤º¸¿¡ µû¶ó Á÷¼±À» ±ß±âµµ ÇÏ°í ¿øÀ» ±×¸®±âµµ ÇÑ´Ù. Draw¾È¿¡¼­ ¹«½¼ µ¿ÀÛÀ» ÇÏµç ¹Û¿¡¼­ º¸±â¿¡´Â Graphic °´Ã¼ÀÇ Æ÷ÀÎÅÍ¿Í ÇÔ²² ÀÌ ÇÔ¼ö¸¦ ºÎ¸£±â¸¸ ÇÏ¸é µµÇüÀÌ Á¦´ë·Î ±×·ÁÁø´Ù.

C¾ð¾î·Îµµ ´ÙÇü¼ºÀ» ±¸ÇöÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» Áõ¸íÇߴµ¥ C++¿¡ ºñÇؼ­´Â ¿©·¯ ¸ð·Î ºÒÆíÇÑ Á¡ÀÌ ¸¹´Ù. µµÇüµé°£ÀÇ °ü°è¸¦ ÇÑ ´«¿¡ ÆľÇÇϱ⠾î·Æ°í »õ·Î¿î µµÇüÀÌ ´Ã¾î³¯ ¶§¸¶´Ù Draw¿Í °ü·Ã ÇÔ¼ö¸¦ ¸Å¹ø ¼öÁ¤ÇØ¾ß ÇÑ´Ù´Â Á¡¿¡¼­ Äڵ带 À¯ÁöÇϱ⠾î·Æ´Ù. ¿ª½Ã CÀÇ ´ÙÇü¼ºÀº C++ÀÇ ´ÙÇü¼º¿¡ ºñÇؼ­´Â ÇÑ ¼ö ¾Æ·¡ÀÌ´Ù.

´ÙÇü¼ºÀº C++¾ð¾îÀÇ Ã¢½ÃÀÚ°¡ µ¶ÀÚÀûÀ¸·Î ¸¸µç ±â¹ýÀÌ ¾Æ´Ï¶ó °´Ã¼ ÁöÇâ °³³äÀÌ ¼Ò°³µÇ±â ÈξÀ ÀüºÎÅÍ ÀÌ¹Ì »ç¿ëµÇ¾î ¿Ô´ø ±â¼úÀÌ´Ù. ÇÁ·Î±×·¥ÀÇ ±Ô¸ð°¡ Ä¿Áö¸é ´©±¸³ª ÀÌ·± ±â¹ýÀÇ Çʿ伺À» ´À³¢°Ô µÇ¸ç ´©±º°¡¿¡ ÀÇÇØ ¸¸µé¾îÁö°í ´Ùµë¾îÁö±â ¸¶·ÃÀÌ´Ù. C++Àº À̸¦ ¾²±â ½±°í ¾ÈÀüÇϵµ·Ï ¾ð¾î Â÷¿ø¿¡¼­ ´ÙÇü¼ºÀ» Áö¿øÇÒ »ÓÀÌ´Ù. Á¤º¸¸¦ Æ÷°ýÇÏ´Â °ø¿ëü´Â »ó¼ÓÀ̶ó´Â ±â¹ýÀÌ µÇ°í Type Çʵå´Â vptrÀ» ÅëÇÑ µ¿Àû °áÇÕÀ¸·Î ±¸Ã¼È­µÇ¾ú´Ù.

usingÀ¸·Î ¾×¼¼½º ¼Ó¼º º¯°æ

using ¼±¾ðÀº ´Ù¸¥ ³×ÀÓ ½ºÆäÀ̽ºÀÇ ¸íĪÀ» ÀÌ ¼±¾ðÀÌ ÀÖ´Â °÷À¸·Î °¡Á® ¿À´Â ¹®ÀåÀε¥ Ŭ·¡½º °èÃþ »çÀÌ¿¡¼­µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Ŭ·¡½º ÀÚüµµ ÀÏÁ¾ÀÇ ±¹ÁöÀûÀÎ ³×ÀÓ ½ºÆäÀ̽º·Î º¼ ¼ö ÀÖ¾î using ¼±¾ðÀ¸·Î ¿øÇÏ´Â ¸íĪÀ» °¡Á®¿Â´Ù. Ŭ·¡½º¿¡¼­ using ¼±¾ðÀº ±â¹Ý Ŭ·¡½º ¸â¹öÀÇ ¾×¼¼½º ¼Ó¼ºÀ» ¿øÇϴ´ë·Î º¯°æÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù.

 

classusing1

#include <stdio.h>

 

class B

{

private:

     void p() { puts("Base private function"); };

protected:

     void f() { puts("Base protected function"); }

public:

     void u() { puts("Base public function"); }

};

 

class D : public B

{

protected:

     //  using B::u;

public:

     //  using B::f;

     void f() { B::f(); }

};

 

int main()

{

     D d;

     d.f();

     d.u();

}

½ÇÇà°á°ú

Base protected function

Base public function

 

±â¹Ý Ŭ·¡½º B¿¡ ¾×¼¼½º ¼Ó¼ºº°·Î ¼¼ °³ÀÇ ¸â¹ö ÇÔ¼ö°¡ ¼±¾ðµÇ¾î ÀÖ´Ù. D´Â ÀÌ Å¬·¡½º¸¦ public »ó¼Ó¹Þ¾ÒÀ¸¹Ç·Î f ÇÔ¼ö°¡ protected ¼Ó¼ºÀ¸·Î »ó¼ÓµÇ¸ç u´Â public ¼Ó¼ºÀ¸·Î »ó¼ÓµÈ´Ù. u´Â ¿ÜºÎ¿¡¼­µµ È£Ãâ°¡´ÉÇÏÁö¸¸ protected ¼Ó¼ºÀ» °¡Áö´Â f´Â D¿¡¼­¸¸ È£ÃâÇÒ ¼ö ÀÖ°í ¿ÜºÎ¿¡¼­´Â È£ÃâÇÒ ¼ö ¾ø´Ù. ¸¸¾à f¸¦ ¿ÜºÎ¿¡¼­ È£ÃâÇÒ ¼ö ÀÖµµ·Ï ÇÏ°í ½Í´Ù¸é µÎ °¡Áö ¹æ¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

¿ì¼± ÀÌ ÇÔ¼ö¸¦ public ¿µ¿ª¿¡ °°Àº À̸§À¸·Î ÀçÁ¤ÀÇÇÏ´Â ¹æ¹ýÀ» ¾µ ¼ö Àִµ¥ ÀÌ·¸°Ô µÇ¸é B::f´Â °¡·ÁÁø´Ù. ÀçÁ¤ÀÇµÈ f°¡ B::f¸¦ ´ë¸® È£ÃâÇÏ¸é ¿ÜºÎ¿¡¼­µµ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. protected ¾×¼¼½º ¼Ó¼ºÀ» °¡Áö´Â ¸â¹ö ÇÔ¼ö°¡ ÀçÁ¤ÀÇ¿¡ ÀÇÇØ publicÀ¸·Î À̵¿ÇÑ °ÍÀÌ´Ù. À§ ¿¹Á¦¸¦ ½ÇÇàÇϸé main¿¡¼­ d.f¸¦ È£ÃâÇÏ´Â °ÍÀÌ Çã°¡µÈ´Ù. DÀÇ f ÇÔ¼ö¸¦ ÁÖ¼® ó¸®ÇÏ¸é ¹°·Ð È£ÃâÇÒ ¼ö ¾ø´Ù.

µÎ ¹ø° ¹æ¹ýÀº using ¼±¾ðÀ¸·Î protected ¿µ¿ª¿¡ ÀÖ´Â f ÇÔ¼ö¸¦ public ¿µ¿ªÀ¸·Î °¡Á®¿À´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô µÇ¸é »ó¼Ó¹ÞÀº f°¡ public ¿µ¿ª¿¡ ¼±¾ðµÈ °Í°ú °°¾ÆÁ® ¿ÜºÎ¿¡¼­µµ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. ÀçÁ¤ÀÇµÈ f ÇÔ¼ö¸¦ ÁÖ¼® ó¸®ÇÏ°í using ¼±¾ð¸¸ ³²°Ü µÎ¾îµµ Àß ½ÇÇàµÈ´Ù. µÑ ´Ù ÁÖ¼® ó¸®ÇÏ¸é ¿ÜºÎ¿¡¼­ f¸¦ È£ÃâÇÒ ¼ö ¾ø´Ù. using ¼±¾ðÀº public ¿µ¿ª¿¡ ÀÖ´Â ¸íĪÀ» protected·Î ¼û±æ ¼öµµ ÀÖ´Ù. B::u´Â ±×´ë·Î µÎ¸é publicÀÌÁö¸¸ protected³ª private·Î ¿Å±â¸é ¿ÜºÎ¿¡¼­ È£ÃâÇÒ ¼ö ¾ø´Ù.

using ¼±¾ðÀº Á¢±Ù °¡´ÉÇÑ ¸â¹öÀÇ ¾×¼¼½º ¼Ó¼ºÀ» º¯°æÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù. ¾îµð±îÁö³ª Á¢±Ù °¡´ÉÇÑ ¸â¹ö¿¡ ´ëÇؼ­¸¸ ÀÌ ÁöÁ¤À» »ç¿ëÇÒ ¼ö ÀÖÀ» »ÓÀε¥ ¿¹Á¦¿¡¼­ BÀÇ private ¿µ¿ª¿¡ ÀÖ´Â p ÇÔ¼ö¸¦ public ¿µ¿ª¿¡ µÎ°í ½Í´Ù°í Çؼ­ using B::p; ¼±¾ðÀ» »ç¿ëÇÒ ¼ö´Â ¾ø´Ù. Àڽŵµ Á¢±ÙÇÏÁö ¸øÇÏ´Â ¸â¹ö¿¡ ´ëÇÑ ¾×¼¼½º ÁöÁ¤À» º¯°æÇÑ´Ù´Â °Í ÀÚü°¡ ¸»ÀÌ µÇÁö ¾Ê´Â´Ù. ¿À·ÎÁö ±â¹Ý Ŭ·¡½ºÀÇ Çã°¡µÈ ¸â¹ö(protected, public)¸¸ using ¼±¾ðÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

´ÙÀ½ ¿¹Á¦´Â private »ó¼Ó½Ã ¿ÜºÎ·Î °ø°³µÇÁö ¾Ê´Â ÀÎÅÍÆäÀ̽º¸¦ °ø°³Çϱâ À§ÇØ using ¼±¾ðÀ» »ç¿ëÇÑ´Ù.

 

classusing2

#include <stdio.h>

 

class B

{

protected:

     void f() { puts("Base protected function"); }

public:

     int m;

};

 

class D : private B

{

protected:

     using B::m;

public:

     using B::f;

};

 

class G : public D

{

public:

     void gf() {

          m = 1234;

     }

};

 

int main()

{

     D d;

     d.f();

     //  d.m=1234;

}

½ÇÇà°á°ú

Base protected function

 

D´Â B¸¦ private »ó¼Ó¹Þ¾ÒÀ¸¹Ç·Î BÀÇ f, m ¸â¹ö´Â ¸ðµÎ private°¡ µÈ´Ù. ÀÌ »óÅ¿¡¼­´Â D ¿ÜºÎ³ª ÆÄ»ý Ŭ·¡½º¿¡¼­ »ó¼Ó¹ÞÀº ¸â¹ö¸¦ ¾×¼¼½ºÇÒ ¼ö ¾ø´Â °ÍÀÌ Á¤»óÀÌ´Ù. ÇÏÁö¸¸ D°¡ using ¼±¾ðÀ¸·Î ÀÌ ¸â¹öÀÇ ¾×¼¼½º ¼Ó¼ºÀ» º¯°æÇÏ¿´À¸¹Ç·Î º¯°æµÈ ¼Ó¼º´ë·Î ¾×¼¼½º°¡ Çã°¡µÈ´Ù. fÀÇ °æ¿ì public ¿µ¿ª¿¡ using ¼±¾ðÇÏ¿© Ŭ·¡½º ¿ÜºÎÀÎ main¿¡¼­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. mÀÇ °æ¿ì protected ¿µ¿ª¿¡ using ¼±¾ðÇÏ¿© ÀÌÂ÷ ÆÄ»ý Ŭ·¡½ºÀÎ G°¡ ÀÌ ¸â¹ö¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸ main¿¡¼­´Â mÀ» ÀÐÀ» ¼ö ¾ø´Ù.

°¡»ó ÇÔ¼ö Å×À̺í

Á¤Àû °áÇÕÀº ÄÄÆÄÀÏ·¯°¡ È£ÃâµÉ ÇÔ¼öÀÇ ÁÖ¼Ò¸¦ ºÐ¸íÈ÷ ¾Ë ¶§ »ç¿ëÇϴµ¥ ºñÇØ µ¿Àû °áÇÕÀº È£ÃâµÉ ÇÔ¼ö¸¦ ÄÄÆÄÀÏÁß¿¡ °áÁ¤ÇÒ ¼ö ¾øÀ» ¶§ »ç¿ëÇÑ´Ù. ½ÇÇàÁß¿¡ È£Ãâ ÇÔ¼ö¸¦ °áÁ¤ÇØ¾ß ÇÑ´Ù¸é µ¿Àû °áÇÕ¿¡ ÀÇÇØ »ý¼ºµÇ´Â ÄÚµå´Â °´Ã¼ÀÇ Å¸ÀÔÀ» ÆǺ°Çؼ­ ÀÌ Å¸ÀÔ¿¡ ¸Â´Â ÇÔ¼ö¸¦ ¼±ÅÃÇÏ´Â µ¿ÀÛÀ¸·Î ¹ø¿ªÇØ¾ß ÇÑ´Ù. µ¿Àû °áÇÕÀº °ú¿¬ ¾î¶² ½ÄÀ¸·Î ±¸ÇöµÇ´ÂÁö ¿¬±¸ÇØ º¸ÀÚ.

C++ ¾ð¾î´Â °¡»ó ÇÔ¼öÀÇ Á¤ÀÇ¿Í µ¿ÀÛ ¹æ½Ä¿¡ ´ëÇØ ±ÔÁ¤ÇÏ°í ÀÖÁö¸¸ ¾î¶² ½ÄÀ¸·Î ±¸ÇöÇØ¾ß ÇÑ´Ù°í ¸í½ÃÇÏÁö´Â ¾ÊÀ¸¸ç ¾î¶°ÇÑ °­Á¦µµ ¾ø´Ù. ±×·¡¼­ µ¿Àû °áÇÕÀ» ±¸ÇöÇÏ´Â ¹æ½ÄÀº ÄÄÆÄÀÏ·¯¸¶´Ù ´Ù¸¦ ¼ö ÀÖÀ¸¸ç ÄÄÆÄÀÏ·¯ °³¹ßÀÚ°¡ C++ÀÇ ¿ä±¸¿¡ ¸Â°Ô ÀÛ¼ºÇϱ⸸ ÇÏ¸é µÈ´Ù. µ¿Àû °áÇÕÀ» ±¸ÇöÇÏ´Â ¹æ¹ýÀº ¿©·¯ °¡Áö°¡ ÀÖÁö¸¸ ´ëºÎºÐÀÇ ÄÄÆÄÀÏ·¯´Â vtableÀ̶ó´Â °¡»ó ÇÔ¼ö ¸ñ·ÏÀ» ÀÛ¼ºÇÏ°í °¢ °´Ã¼¿¡ vtableÀ» °¡¸®Å°´Â ¼û°ÜÁø ¸â¹ö vptrÀ» Ãß°¡ÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇÑ´Ù.

vtable(°¡»ó ÇÔ¼ö Å×À̺í)À̶õ °¡»ó ÇÔ¼öÀÇ ¹øÁö ¸ñ·ÏÀ» °¡Áö´Â ÀÏÁ¾ÀÇ ÇÔ¼ö Æ÷ÀÎÅÍ ¹è¿­ÀÌ´Ù. Áï, ÀÌ Å¬·¡½º¿¡ ¼Ò¼ÓµÈ °¡»ó ÇÔ¼öµéÀÌ ¾î¶² ¹øÁö¿¡ ÀúÀåµÇ¾î ÀÖ´ÂÁö Ç¥ ÇüÅ·ΠÀúÀåÇØ ³õÀº ¸ñ·ÏÀÌ´Ù. ¹°·Ð vtableÀ» ¾î¶»°Ô ±¸ÇöÇÒ °ÍÀΰ¡´Â ÄÄÆÄÀÏ·¯ Á¦ÀÛÀÚÀÇ ÀÚÀ¯Àε¥ ´ëºÎºÐ ´Ü¼øÇÑ ¹è¿­À» »ç¿ëÇÏÁö¸¸ ¿¬°á ¸®½ºÆ®¸¦ »ç¿ëÇÏ´Â ÄÄÆÄÀÏ·¯µµ ÀÖ´Ù°í ÇÑ´Ù.

ÄÄÆÄÀÏ·¯´Â °¡»ó ÇÔ¼ö¸¦ ´Ü ÇÑ °³¶óµµ °¡Áø Ŭ·¡½º¿¡ ´ëÇØ vtableÀ» ÀÛ¼ºÇϴµ¥ ÀÌ Å×ÀÌºí¿¡´Â Ŭ·¡½º¿¡ ¼Ò¼ÓµÈ °¡»ó ÇÔ¼öÀÇ ½ÇÁ¦ ¹øÁö°¡ ¼±¾ðµÈ ¼ø¼­´ë·Î ±â·ÏµÇ¾î ÀÖ´Ù. ±×¸®°í ÀÌ Å¬·¡½º ŸÀÔÀÇ °´Ã¼°¡ »ý¼ºµÉ ¶§ °¢ °´Ã¼ÀÇ ¼±µÎ¿¡ vtableÀÇ ¹øÁöÀÎ vptrÀ» ±â·ÏÇÑ´Ù. vptrÀÌ °´Ã¼ÀÇ ¼±µÎ¿¡ ¿À°í ´ÙÀ½À¸·Î ÀÌ °´Ã¼ÀÇ ¸â¹ö°¡ ¼ø¼­´ë·Î ¿Â´Ù. ´ÙÀ½ ¿¹Á¦¸¦ ÅëÇØ vtableÀÇ ½Çü¸¦ ±¸°æÇØ º¸ÀÚ.

 

vtable

#include <stdio.h>

 

class B {

private:

     int memB;

public:

     B() : memB(0x11111111) { }

     virtual void f1() { puts("B::f1"); }

     virtual void f2() { puts("B::f2"); }

     virtual void f3() { puts("B::f3"); }

     void normal() { puts("non virtual"); }

};

 

class D : public B

{

private:

     int memD;

public:

     D() : memD(0x22222222) { }

     virtual void f1() { puts("D::f1"); }

     virtual void f2() { puts("D::f2"); }

};

 

int main()

{

     B *pB;

     B b;

     D d;

 

     pB = &b;

     pB->f2();

     pB = &d;

     pB->f2();

     pB->f3();

}

½ÇÇà°á°ú

B::f2

D::f2

B::f3

 

B°¡ ¼¼ °³ÀÇ °¡»ó ÇÔ¼ö¿Í ÇϳªÀÇ ºñ°¡»ó ÇÔ¼ö¸¦ Á¤ÀÇÇÏ°í ÀÖÀ¸¸ç À̸¦ »ó¼Ó¹ÞÀº D´Â ±× Áß f1, f2¸¦ ÀçÁ¤ÀÇÇÑ´Ù. Å×½ºÆ®ÀÇ ÆíÀǸ¦ À§ÇØ ¸â¹ö º¯¼öµµ Çϳª¾¿ ¼±¾ðÇß´Ù. B¿Í DÀÇ °´Ã¼ b¿Í d°¡ »ý¼ºµÇ¾úÀ» ¶§ ¸Þ¸ð¸®¿¡ ±¸ÇöµÈ ¸ð¾çÀº ´ÙÀ½°ú °°´Ù.

ÄÄÆÄÀÏ·¯´Â B Ŭ·¡½º¸¦ À§ÇØ B Ŭ·¡½º¿¡ ¼ÓÇÑ °¡»ó ÇÔ¼öÀÇ ¹øÁö¸¦ vtable·Î ÀÛ¼ºÇÑ´Ù. vtableÀº °¡»ó ÇÔ¼öµéÀÇ Æ÷ÀÎÅÍ ¹è¿­ÀÌ¸ç ºñ°¡»ó ÇÔ¼öÀÇ ¹øÁö´Â ¸ñ·Ï¿¡¼­ Á¦¿ÜµÈ´Ù. ºñ°¡»ó ÇÔ¼ö´Â Á¤ÀûÀ¸·Î °áÇյǹǷΠÅ×ÀÌºí¿¡ ÀÖÀ» ÇÊ¿ä°¡ ¾ø´Ù. B ŸÀÔÀÇ b°´Ã¼¿¡´Â ÀÚ½ÅÀÇ ¸â¹ö º¯¼ö memB¾Õ¿¡ BŬ·¡½ºÀÇ vtable¿¡ ´ëÇÑ Æ÷ÀÎÅÍ vptrÀÌ ¸ÕÀú ¹èÄ¡µÇ°í ÀÌ Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â vtable¿¡´Â ÀÚ½ÅÀÌ È£ÃâÇÒ ¼ö ÀÖ´Â °¡»ó ÇÔ¼ö¿¡ ´ëÇÑ ½ÇÁ¦ ¹øÁö°¡ ±â·ÏµÇ¾î ÀÖ´Ù. B Ŭ·¡½º´Â ¸ðµç °¡»ó ÇÔ¼öÀÇ Äڵ带 Á¤ÀÇÇÏ°í ÀÖÀ¸¸ç vtable¿¡´Â ÀÚ½ÅÀÇ ¸â¹ö ÇÔ¼öµé¿¡ ´ëÇÑ ¹øÁö¸¸ ÀÖ´Ù.

D Ŭ·¡½ºµµ °¡»ó ÇÔ¼ö¸¦ °¡Áö°í ÀÖ¾î D¿¡ ´ëÇؼ­µµ vtableÀ» ÀÛ¼ºÇÑ´Ù. ÀÌ Å×À̺íÀÇ f1, f2´Â D°¡ ÀçÁ¤ÀÇÇÑ ÇÔ¼ö¸¦ °¡¸®Å°°í ÀÖÀ¸¸ç f3´Â B·ÎºÎÅÍ »ó¼Ó¹ÞÀº B::f3¸¦ °¡¸®Å°°í ÀÖ´Ù. ÀÌ Ç¥¿¡ ÀÇÇØ D ŸÀÔÀÇ °´Ã¼°¡ f1, f2¸¦ È£ÃâÇϸé D::f1, D::f2°¡ È£ÃâµÇÁö¸¸ f3¿¡ ´ëÇؼ­´Â »ó¼Ó¹ÞÀº B::f3°¡ È£ÃâµÇ¾î¾ß ÇÑ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. D ŸÀÔÀÇ °´Ã¼ d¿¡´Â »ó¼Ó¹ÞÀº memB¿Í memD ¾Õ¿¡ DŬ·¡½ºÀÇ vtableÀ» °¡¸®Å°´Â Æ÷ÀÎÅÍ vptrÀÌ ¹èÄ¡µÇ¾î ÀÖ´Ù.

ÀÌ »óÅ¿¡¼­ pB->f2() È£Ãâ¹®ÀÌ Ã³¸®µÇ´Â °úÁ¤À» »ó»óÇØ º¸ÀÚ. pB°¡ b °´Ã¼ ±×·¯´Ï±î B ŸÀÔÀÇ °´Ã¼¸¦ °¡¸®Å°°í ÀÖ´Ù¸é b °´Ã¼ÀÇ vptrÀÌ °¡¸®Å°´Â vtable¿¡¼­ È£ÃâÇÒ ÇÔ¼öÀÇ ¹øÁö¸¦ °áÁ¤ÇÑ´Ù. vtable¿¡´Â °¡»ó ÇÔ¼öÀÇ ¹øÁö°¡ ¼±¾ðµÈ ¼ø¼­´ë·Î ÀÛ¼ºµÇ¾î ÀÖ°í ÄÄÆÄÀÏ·¯´Â pB->f2°¡ µÎ ¹ø° °¡»ó ÇÔ¼ö¶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖ¾î vtableÀÇ µÎ ¹ø° ÁÖ¼Ò¸¦ È£ÃâÇÑ´Ù. ¸¸¾à pB°¡ D ŸÀÔÀÇ °´Ã¼ÀÎ d¸¦ °¡¸®Å°°í ÀÖ´Ù¸é d°´Ã¼ÀÇ vptrÀÌ °¡¸®Å°´Â vtable¿¡¼­ È£ÃâÇÒ ÇÔ¼öÀÇ ¹øÁö¸¦ ã´Â´Ù. °á±¹ ¾î¶² ŸÀÔÀÇ °´Ã¼°¡ Àü´ÞµÇ´Â°¡¿¡ µû¶ó ÂüÁ¶ÇÏ´Â vtableÀÌ ¹Ù²î°í µû¶ó¼­ ½ÇÁ¦ È£ÃâµÉ ÇÔ¼öµµ ´Þ¶óÁø´Ù.

vtableÀ» »ç¿ëÇÏ´Â ¹æ¹ýÀº ½ÇÇàÁß¿¡ È£ÃâÇÒ ÇÔ¼ö¸¦ °áÁ¤ÇѴٱ⺸´Ù È£ÃâÇÒ ÇÔ¼öÀÇ ¸ñ·ÏÀ» vtable¿¡ ¹Ì¸® ÀÛ¼ºÇØ ³õ°í ½ÇÇàÁß¿¡´Â °´Ã¼ÀÇ vtableÀ» ã°í vtable¿¡¼­ ´Ù½Ã È£ÃâÇÒ ÇÔ¼öÀÇ ¹øÁö¸¦ ã´Â ¹æ¹ýÀÌ´Ù. Áï, ½ÇÇàÁß¿¡ È£ÃâÇÒ ÇÔ¼ö¸¦ ½Å¼ÓÇÏ°Ô °áÁ¤Çϱâ À§ÇØ ÄÄÆÄÀÏÇÒ ¶§ ¸ðµç ¿¹ºñ µ¿ÀÛÀ» ¹Ì¸® ÃëÇØ ³õ´Â´Ù. ÀÌ·¸°Ô ¸¸¹ÝÀÇ Áغñ°¡ µÇ¾î ÀÖÀ¸¸é °¡»ó ÇÔ¼ö È£Ãâ¹®Àº °´Ã¼¿¡¼­ vtableÀ» ã°í vtable¿¡¼­ ÇÔ¼ö ¹øÁö¸¦ ã¾Æ Á¡ÇÁÇÏ´Â ¹®ÀåÀ¸·Î ¹ø¿ªÇÒ ¼ö ÀÖ´Ù. ÄÄÆÄÀÏ ¼Óµµ°¡ ´À·ÁÁö°í ½ÇÇà ÆÄÀÏÀÌ ¾à°£ Ä¿Áö°ÚÁö¸¸ °¡»ó ÇÔ¼ö È£Ãâ ¼Óµµ´Â ±ØÀûÀ¸·Î »¡¶óÁø´Ù.

vtableÀÇ ÀåÁ¡Àº ¹Ì·¡¿¡ Ãß°¡µÉ ÀÚ½Ä Å¬·¡½º¿¡ ´ëÇؼ­µµ ¾ÆÁÖ Àß µ¿ÀÛÇÑ´Ù´Â Á¡ÀÌ´Ù. D¸¦ ÆÄ»ý½ÃÄÑ G Ŭ·¡½º¸¦ ¸¸µé¾ú°í G´Â f1 °¡»ó ÇÔ¼ö¸¦ ÀçÁ¤ÀÇÇÑ´Ù°í ÇØ º¸ÀÚ. ÀÌ Å¬·¡½º¸¦ ÄÄÆÄÀÏÇÒ ¶§ G¿¡ ´ëÇÑ vtableÀÌ ÀÛ¼ºµÇ°í ÀÌ Å×ÀÌºí¿¡´Â G::f1, D::f2, B::f3ÀÇ ÁÖ¼Ò°¡ ÀÛ¼ºµÈ´Ù. ±×·¡¼­ B *ÇüÀÇ pB°¡ GÇüÀÇ °´Ã¼ g¸¦ °¡¸®Å°´Â »óȲÀÌ µÇ´õ¶óµµ pB->f1() È£Ãâ¹®Àº »õ·Î Ãß°¡µÈ GÀÇ f1À» Àß Ã£¾Æ°£´Ù. pB->f1() È£Ãâ¹®ÀÌ ÀÌ¹Ì ÄÄÆÄÀϵǾî ÀÖ´õ¶óµµ gÀÇ vtableÀÌ ÀÌ È£Ãâ¹®ÀÇ ¿ä±¸¿¡ ¸Â°Ô ÀÛ¼ºµÇ±â ¶§¹®ÀÌ´Ù.

G ´ÙÀ½¿¡ X, Y, Z°¡ °è¼Ó ÆÄ»ýµÇ¾îµµ pB´Â ÀÌ °´Ã¼µéÀ» °¡¸®Å³ ¼ö ÀÖ°í °¢ Ŭ·¡½º´Â ÀÚ½ÅÀÌ È£ÃâÇÒ °¡»ó ÇÔ¼ö ¸ñ·ÏÀÇ vtableÀ» °¡Á® Ç×»ó Á¤È®ÇÏ°Ô µ¿Àû °áÇյȴÙ. °èÃþÀÌ º¹ÀâÇØÁö¸é vtableµµ ¹«Ã´ º¹ÀâÇØÁö°ÚÁö¸¸ ÄÄÆÄÀÏ·¯°¡ ÀÌ Å×À̺íÀ» ¾Ë¾Æ¼­ Àß °ü¸®ÇÏ°í Å×À̺íÀ» µÚÁ® ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÀÏÀº CPUÀÇ ¸òÀ̹ǷΠ¿ì¸®´Â Ŭ·¡½º °èÃþ¸¸ Àß µðÀÚÀÎÇÏ¸é µÈ´Ù.

Ŭ·¡½º ŸÀÔÀÇ Æ÷ÀÎÅÍ(p)¿¡ ÀÇÇÑ °¡»ó ÇÔ¼ö È£Ãâ¹®ÀÇ ¹ø¿ª °á°ú¸¦ ¸»·Î Ç¥ÇöÇØ º¸¸é ´ÙÀ½°ú °°´Ù. È£ÃâÇÒ ÇÔ¼ö°¡ ÇØ´ç Ŭ·¡½ºÀÇ ¸î ¹ø° °¡»ó ÇÔ¼öÀÎÁö¸¦ ¸ÕÀú Á¶»ç(n)ÇÏ°í Æ÷ÀÎÅÍ°¡ °¡¸®Å°´Â °÷ÀÇ Ã¹ ¹ø° ¼û°ÜÁø ¸â¹ö¿¡ ÀÖ´Â vptrÀÌ °¡¸®Å°´Â °÷ÀÇ vtableÀÇ n¹ø° ÁÖ¼Ò°¡ °¡¸®Å°´Â ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °ÍÀÌ´Ù. ½ÄÀ¸·Î Ç¥ÇöÇϸé p->vptr->vtable[n]À» È£ÃâÇÑ´Ù. °¡»ó ÇÔ¼ö´Â vtableÀ» ÅëÇØ È£ÃâµÇ°í ±×·¯±â À§ÇØ ¹øÁö¸¦ °¡Á®¾ß ÇϹǷΠ¾Æ¹«¸® Äڵ尡 ª¾Æµµ ÀζóÀÎÀÌ µÉ ¼ö´Â ¾ø´Ù.

°¡»ó ÇÔ¼ö¸¦ È£ÃâÇÏ´Â °úÁ¤ÀÌ ÀÌ·¸°Ô º¹ÀâÇϱ⠶§¹®¿¡ µ¿Àû °áÇÕÀº Á¤Àû °áÇÕº¸´Ù È£Ãâ ¼Óµµ°¡ ´À¸®´Ù. »Ó¸¸ ¾Æ´Ï¶ó °¡»ó ÇÔ¼ö¸¦ °¡Áø Ŭ·¡½ºº°·Î vtableÀ̶ó´Â ¿©ºÐÀÇ ¸Þ¸ð¸®¸¦ ´õ ¼Ò¸ðÇÏ¸ç °´Ã¼µµ vptrÀ» À§ÇØ 4¹ÙÀÌÆ®¾¿ Ä¿Áø´Ù. ±×·¡¼­ ¸â¹ö ÇÔ¼ö¿¡ ´ëÇÑ °áÇÕ ¹æ¹ýÀÇ µðÆúÆ®°¡ Á¤ÀûÀ¸·Î µÇ¾î ÀÖÀ¸¸ç virtual Å°¿öµå¸¦ ¾µ ¶§¸¸ µ¿Àû °áÇÕÀ» ÇÑ´Ù.

¸¸¾à vtableÀÇ ½Çü¸¦ ¹Ýµå½Ã ´«À¸·Î È®ÀÎÇÏ°í¾ß ¸»°Ú´Ù¸é À§ ¿¹Á¦ÀÇ pB=&b ´ÙÀ½¿¡ Áß´ÜÁ¡À» ¼³Á¤ÇÑ ÈÄ *pB°¡ °¡¸®Å°´Â °÷ÀÇ ¸Þ¸ð¸® ³»¿ëÀ» µé¿©´Ù º¸¸é µÈ´Ù. ¿¹Á¦ÀÇ memB, memD´Â ¸Þ¸ð¸® ´ýÇÁ¿¡¼­ °´Ã¼ÀÇ À§Ä¡¸¦ ½±°Ô ãµµ·Ï µµ¿ÍÁÖ±â À§ÇØ ÀϺη¯ ¾Ë¾Æº¸±â ½¬¿î °ªÀ¸·Î ÃʱâÈ­ÇØ ³õ¾Ò´Ù. Æ÷ÀÎÅ͸¦ µû¶ó ¸î ¹ø À̵¿ÇØ º¸¸é °¡»ó ÇÔ¼öÀÇ º»Ã¼°¡ ÀÖ´Â ¹øÁö¸¦ ãÀ» ¼ö ÀÖ´Ù.