C¿Í C++°ü·Ã |
---|
Á¦¸ñ | Virtual Function 1998/07/15 (09:52) |
À̸§ | ±èÈ¿¿ø |
¹øÈ£ | 8 |
Á¶È¸ | 630 |
º»¹® |
< °´Ã¼ ÁöÇâ ÇÁ·Î±×·¡¹Ö : Virtual Functions > °£È¤ static bindingÀ̶ó°íµµ ÇÏ´Â Ãʱâ¹ÙÀεù(early binding)Àº È£ÃâÇÑ ÇÔ¼ö¸¦ ÄÄÆÄÀÏÇÒ¶§ °áÁ¤ÇÏ´Â ÇÁ·Î¼¼½ºÀÌ´Ù. ¸ðµç CÇÁ·Î±×·¥Àº ¸ðµç ÇÔ¼ö¿Í ¼ºê·çƾ ÇÔ¼ö È£ÃâÀ» À§ÇØ Ãʱ⠹ÙÀεùÀ» »ç¿ëÇÑ´Ù. C++Àº ½ÇÇàÀ» À§ÇØ ÇÁ·Î±×·¥ÀÌ ¸Þ¸ð¸®ÀÇ ¾îµð¿¡ ·ÎµåµÉ °ÍÀÎÁö ÄÄÆÄÀÏ ½Ã°£¿¡´Â ¾Ë ¼ö ¾ø´Ù. ½ÇÇàµÉ ÄÄÇ»ÅÍ ±¸¼º¿¡ µû¶ó ù¹ø° »ç¿ë°¡´ÉÇÑ ¸Þ¸ð¸® ÁÖ¼Ò´Â ´Ù¸£±â ¶§¹®ÀÌ´Ù. ±×·¡¼, C++Àº ÇÁ·Î±×·¥À» ÄÄÆÄÀÏ ÇÒ¶§ ÄÄÆÄÀÏ ÈÀÏ ¾È¿¡ ¼øÂ÷ÀûÀ¸·Î ÄÄÆÄÀÏµÈ ÈÀÏÀ» ÃàÀûÇÑ´Ù. main()ÇÔ¼ö°¡ È£ÃâµÈ ÈÄ¿¡, ±×·ÎºÎÅÍ »ó´ëÀûÀÎ À§Ä¡¸¦ ±â¾ïÇÏ´Â °ÍÀÌ´Ù. ÇÁ·Î±×·¥À» ½ÇÇàÇÒ¶§ .EXE ÇÁ·Î±×·¥ ·Î´õ´Â ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ ¼ö ÀÖ°í ¸ðµç ÇÔ¼ö È£Ãâ¿¡ ±× ÁÖ¼Ò¸¦ ´õÇÒ ¼ö ÀÕ´Â ¸Þ¸ð¸®¿¡¼ ù¹ø° °¡´ÉÇÑ ÀÚÀ¯ °ø°£À» °áÁ¤ÇÑ´Ù. µû¶ó¼, ÄÄÆÄÀϵɶ§ ¸ðµç ÁÖ¼ÒµéÀº »ó´ëÀûÀÌ°í, ½ÇÇàµÉ ¶§´Â Àý´ëÀûÀÌ µÈ´Ù. Áö¿¬¹ÙÀεù(late binding)Àº ÇÁ·Î±×·¥ÀÌ ½ÇÁ¦·Î ½ÇÇàµÉ ¶§±îÁö ÇÔ¼ö È£Ãâ¿¡ ¾Æ¹«°Íµµ ÀúÀåµÇÁö ¾ÊÀ»¶§ ¹ß»ýÇÑ´Ù. Áö¿¬¹ÙÀεùÀº ÇÁ·Î±×·¥ÀÇ ÁÖ¾îÁø ÁöÁ¡¿¡¼ ÇÔ¼ö¸¦ È£ÃâÇÒ ÇÔ¼ö¸¦ °áÁ¤Çϱâ À§ÇØ ½ÇÇà½Ã°£±îÁö ±â´Ù¸®´Â ÇÁ·Î¼¼½ºÀÌ´Ù. void (*fun[])(float)={doSin,doCos,doTan}; void doSin(float num); void doCos(float num); void doTan(float num); °ú °°ÀÌ, ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¼±¾ðÇÒ¶§. fun[str](number); ¶ó°í È£ÃâÇϸé, ÄÄÆÄÀÏ·¯´Â ÄÄÆÄÀÏÇÒ ´ç½Ã¿¡, ¾Æ¹«·± ÁÖ¼Òµµ »ðÀÔÇÒ ¼ö ¾ø°Ô µÈ´Ù. ½ÇÇà½Ã°£±îÁö ¼¼°³ÀÇ ÇÔ¼öÁß¿¡¼ ¾î¶² °ÍÀ¸·Î °áÁ¤ÇÒ ¼ö°¡ ¾ø°Ô µÈ´Ù. °¡»óÇÔ¼ö(Virtual Function)Àº OOP¸¦ À§ÇØ Áö¿¬ ¹ÙÀεù ü°è¸¦ Á¦°øÇÑ´Ù. ½ÇÇà½Ã°£¿¡ ÇÁ·Î±×·¥ÀÌ È£ÃâÇÒ ÇÔ¼ö¸¦ °áÁ¤ÇÑ´Ù. °¡»óÇÔ¼ö°¡ ÇÊ¿äÇÒ ¶§´Â ´ÙÀ½°ú °°´Ù. 'Ŭ·¡½º ±ºÀ¸·ÎºÎÅÍ ¸î°³ÀÇ °´Ã¼¸¦ Á¤ÀÇÇÒ¶§, ±×¸®°í ±º ³»ÀÇ Çϳª ÀÌ»óÀÇ Å¬·¡½º°¡ °øÅë À̸§À» °¡Áø ÇÔ¼öµéÀ» Æ÷ÇÔÇÒ¶§, °¡»óÇÔ¼ö¸¦ »ç¿ëÇÏÀÚ.' Base Class : Building public prData(); ÆÄ»ý Class: Office public prData(); ÆÄ»ý ClassÀÎ Office°´Ã¼¿¡ ´ëÇÏ¿©, prData()¸¦ ½ÇÇàÇϸé, Office°´Ã¼ ³»ÀÇ prData()°¡ ½ÇÇàµÇ´Â °ÍÀÌ ¾Æ´Ï¶ó, Base ClassÀÎ Building°´Ã¼ ³»ÀÇ prData()°¡ ½ÇÇàµÈ´Ù. ÀÌ°ÍÀÌ °¡»ó ÇÔ¼öÀÇ Çʿ伺À» ¸»ÇØÁÖ°í ÀÖ´Ù. ÀÌ ¹®Á¦´Â Ãʱ⠹ÙÀεùÀÌ ¿øÀÎÀÌ´Ù. ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÄÄÆÄÀϽÿ¡ °áÁ¤Çϱ⠶§¹®¿¡, ¾î´À Ŭ·¡½º¿¡ ¼ÓÇÑ ÇÔ¼ö¸¦ °¡¸®Å°´ÂÁö¸¦ Á¦´ë·Î °áÁ¤ÇÒ ¼ö°¡ ¾ø°Ô µÈ´Ù. ÇÔ¼ö¾Õ¿¡ virtualÀ̶ó´Â Å°¿öµå¸¦ Æ÷ÇÔÇÏ°Ô µÇ¸é, *this°´Ã¼°¡ ±â¹Ý Ŭ·¡½º¿¡¼ ³ª¿Â °ÍÀ̶ó¸é, ±â¹ÝŬ·¡½ºÀÇ ÇÔ¼ö¸¦ È£ÃâÇϸç, ÆÄ»ý Ŭ·¡½º(°°Àº À̸§ÀÇ ÇÔ¼ö¸¦ Æ÷ÇÔÇÏ´Â) ¿¡¼ ³ª¿Â °ÍÀ̶ó¸é, ÆÄ»ý Ŭ·¡½º ³»ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÏ°Ô µÈ´Ù. ¹°·Ð, °°Àº À̸§ÀÇ ÇÔ¼ö¸¦ Æ÷ÇÔÇÏÁö ¾Ê´Â ÆÄ»ý Ŭ·¡½º¶ó¸é, ±â¹Ý Ŭ·¡½º³»ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. virtualÅ°¿öµå´Â ±â¹Ý Ŭ·¡½ºÀÇ ÇÔ¼ö ¼±¾ð¿¡¸¸ Ãß°¡ÇÏ¸é µÈ´Ù. virtual void prData(void); // in base Class ¶§·Î´Â, ±â¹Ý Ŭ·¡½º °¡»ó ÇÔ¼ö°¡ Äڵ带 Æ÷ÇÔÇÏÁö ¾ÊÀ¸¸ç, ÈÄ¼Ó Å¬·¡½º¸¦ ÆÄ»ýÇϱâ À§Çؼ¸¸ Á¸ÀçÇÒ ¶§, pure virtual function(¼ø¼ö °¡»ó ÇÔ¼ö)¶ó°í ºÒ¸°´Ù. À̶§´Â ¼ø¼ö °¡»ó ÇÔ¼ö¸¦ Æ÷ÇÔÇϴ Ŭ·¡½º·ÎºÎÅÍ´Â °´Ã¼¸¦ Çü¼ºÇÒ ¼ö ¾ø´Ù. ¼ø¼ö °¡»ó ÇÔ¼ö¸¦ °¡Áø ±â¹Ý Ŭ·¡½º´Â Ãß»óÀûÀÌ°í, ³ª¸ÓÁö »ó¼Ó ±ºÀÇ ¸ðÇüÀ̱⠶§¹®¿¡ abstract base class(Ãß»ó ±â¹Ý Ŭ·¡½º) ¶ó°í Çϸç, °´Ã¼¸¦ Çü¼ºÇϱâ À§Çؼ´Â °áÄÚ »ç¿ëµÉ ¼ö ¾ø´Ù. virtual void prData(void)=0; ¶ó´Â ¼±¾ðÀ» »ç¿ëÇϸé, ÄÄÆÄÀÏ·¯°¡ ±â¹Ý Ŭ·¡½º °´Ã¼¸¦ Çü¼ºÇÒ ¼ö ¾øÀ¸¹Ç·Î, ÄÄÆÄÀÏ ½Ã¿¡ ¿¡·¯°¡ ¹ß»ýÇÑ´Ù. '=0'À» Ãß°¡ÇÏÁö ¾ÊÀ¸¸é, ½ÇÇà ½Ã°£ ¿¡·¯°¡ ³ª¹Ç·Î, debugÇϱⰡ ´õ ¾î·Æ´Ù. <È¿À²¼ºÀÇ ¹®Á¦> ½ÇÇà½Ã°£¿¡ ÁÖ¼Ò¸¦ ºÐ¼®Çϱâ À§ÇØ °£Á¢ ÇÔ¼ö È£Ãâ Ç¥ÀÇ Á¤±³ÇÑ ½Ã½ºÅÛÀ» »ç¿ëÇØ¾ß Çϸé, vtableÀ̶ó°í ÇÏ´Â, °¡»ó ÇÔ¼ö ÁÖ¼ÒÀÇ Ç¥´Â ´ÙÇüÀûÀ¸·Î È£ÃâµÉ ¼ö ÀÖ´Â ÇÔ¼öÀÇ ÁÖ¼Ò¸¦ Æ÷ÇÔÇÑ´Ù. °¢ Ŭ·¡½º´Â vtableÀÇ º¹»çº»À» °¡Áö¸ç, ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÉ¶§ »ó¼Ó °èÃþ¿¡¼ Á¤È®ÇÑ ¸â¹ö ÇÔ¼ö¸¦ ã±â À§Çؼ vtableÀº Áß°£ ¸Å°³Ã¼·Î »ç¿ëµÈ´Ù. °¡»ó ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÀÏ¹Ý ¸â¹ö ÇÔ¼ö È£ÃâÀ» »ç¿ëÇÏ´Â °Íº¸´Ù ´ú È¿À²ÀûÀÓÀº »ç½ÇÀÌ´Ù. Ŭ·¡½ºµé »çÀÌ¿¡¼ ¸ðµç ¸â¹ö ÇÔ¼ö¸¦ ´Ù¸£°Ô ¸í¸íÇÏ´Â °Í ¶ÇÇÑ ¼Ò½ºÀÇ ºñÈ¿À²¼ºÀ» Áõ°¡½Ãų ¼ö ÀÖÀ¸¹Ç·Î, ±â¹Ý Ŭ·¡½º ÇÔ¼ö ¾Õ¿¡ virtualÀ» »ðÀÔÇÏ´Â ¹®Á¦¸¦ ½ÅÁßÈ÷ »ý°¢ÇØ¾ß ÇÑ´Ù. ÀÌ·± °¡»ó ÇÔ¼öÀÇ ºñÈ¿À²ÀûÀΠƯ¼ºÀº C++ ¼³°èÀÚµéÀÌ ¿Ö ¸ðµç ±â¹Ý Ŭ·¡½º ÇÔ¼ö¸¦ À§ÇØ virtualÀ» default·Î ÇÏÁö ¾Ê¾Ò´ÂÁö¸¦ ¾Ë ¼ö ÀÖ´Ù. |