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°¡ ³ªÁß¿¡ ÃʱâȵDZ⠶§¹®ÀÌ´Ù. 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¾ð¾î·Î ´Ù½Ã ÀÛ¼ºÇØ º¸ÀÚ. ¹°·Ð °í±â´ÉÀÇ °´Ã¼ ÁöÇâ ¾ð¾î°¡ ³ÑÃ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 ¼±¾ðÀº ±â¹Ý Ŭ·¡½º ¸â¹öÀÇ ¾×¼¼½º ¼Ó¼ºÀ» ¿øÇϴ´ë·Î º¯°æÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù.
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´Â
¸Þ¸ð¸® ´ýÇÁ¿¡¼ °´Ã¼ÀÇ À§Ä¡¸¦ ½±°Ô ãµµ·Ï µµ¿ÍÁÖ±â À§ÇØ ÀϺη¯ ¾Ë¾Æº¸±â ½¬¿î °ªÀ¸·Î ÃʱâÈÇØ ³õ¾Ò´Ù. Æ÷ÀÎÅ͸¦
µû¶ó ¸î ¹ø À̵¿ÇØ º¸¸é °¡»ó ÇÔ¼öÀÇ º»Ã¼°¡ ÀÖ´Â ¹øÁö¸¦ ãÀ» ¼ö ÀÖ´Ù.