13-3-´Ù.±íÀº º¹»ç

±¸Á¶Ã¼³¢¸® ´ëÀÔÀÌ °¡´ÉÇÏ´Ù´Â °ÍÀº ¹®¹ýÀûÀ¸·Î ´ëÀÔÀÌ Çã¿ëµÈ´Ù´Â ¾ê±âÀÌ´Ù. ±×·¯³ª ½ÇÁ¦·Î´Â ´ëÀÔ¿¡ ÀÇÇØ ¿¹»óÄ¡ ¸øÇÑ ¹®Á¦°¡ ¹ß»ýÇÏ´Â °æ¿ìµµ ÀÖ´Ù. ±¸Á¶Ã¼ ¸â¹ö Áß¿¡ Æ÷ÀÎÅÍ°¡ ÀÖ°í ÀÌ Æ÷ÀÎÅÍ°¡ ±¸Á¶Ã¼ ¿ÜºÎÀÇ ¸Þ¸ð¸®¸¦ °¡¸®Å°°í Àִٰųª ¶Ç´Â ºñ½ÁÇÑ ¹æ½ÄÀ¸·Î ¿ÜºÎÀÇ ¾î¶² ´ë»óÀ» ÂüÁ¶ÇÏ°í ÀÖ´Ù¸é ´Ü¼øÈ÷ º¹»ç¸¸ Çؼ­´Â »çº»À» ¸¸µé ¼ö ¾ø´Ù. ¿¹¸¦ µé¾î ±¸Á¶Ã¼ ¸â¹ö Áß¿¡ À¯ÀÏÇÑ °ªÀ» °¡Á®¾ß ÇÏ´Â ID°¡ ÀÖ´Ù¸é ÀÌ °æ¿ìµµ ¹®Á¦°¡ µÈ´Ù. ¾î¶² ¹®Á¦°¡ ÀÖ´ÂÁö Æ÷ÀÎÅÍ ¸â¹ö¸¦ °¡Áø ±¸Á¶Ã¼ÀÇ ¿¹¸¦ º¸µµ·Ï ÇÏÀÚ.

 

¿¹ Á¦ : ShallowCopy

#include <Turboc.h>

 

struct tag_Friend {

     char *pName;

     int Age;

     double Height;

};

 

void main()

{

     tag_Friend Albert={NULL,80,165.0};

     tag_Friend Kim;

 

     Albert.pName=(char *)malloc(32);

     strcpy(Albert.pName,"¾Ë¹öÆ® ¾ÆÀν´Å¸ÀÎ");

 

     Kim=Albert;

     printf("À̸§=%s, ³ªÀÌ=%d, Å°=%.1f\n",Kim.pName,Kim.Age,Kim.Height);

 

     strcpy(Albert.pName,"¾ÆÀÌÀÛ ´ºÆ°");

     printf("À̸§=%s, ³ªÀÌ=%d, Å°=%.1f\n",Kim.pName,Kim.Age,Kim.Height);

     free(Albert.pName);

     free(Kim.pName);

}

 

tag_Friend ±¸Á¶Ã¼¿¡ ¹®ÀÚÇü Æ÷ÀÎÅÍ ¸â¹ö pNameÀÌ Æ÷ÇԵǾî Àִµ¥ Æ÷ÀÎÅÍ´Â Á¤Àû ¹è¿­¿¡ ºñÇØ °¡º¯ ±æÀÌ ¹®ÀÚ¿­À» ´Ù·ê ¼ö ÀÖ´Â ÀåÁ¡ÀÌ ÀÖ´Â ¹Ý¸é Á¤º¸¸¦ ÀúÀåÇϱâ Àü¿¡ µ¿Àû ÇÒ´çÀ» ÇØ¾ß ÇÏ´Â ¹ø°Å·Î¿òÀÌ ÀÖ´Ù. main¿¡¼­ Albert¶ó´Â À̸§À¸·Î ±¸Á¶Ã¼ º¯¼ö¸¦ ¼±¾ðÇÏ°í pName¿¡ 32ÀÚ ±æÀ̸¦ ÇÒ´çÇÑ ÈÄ ÀÌ ¸Þ¸ð¸®¿¡ À̸§À» º¹»çÇØ ³Ö¾ú´Ù. À̶§ Albert°¡ ¸Þ¸ð¸®¿¡ »ý¼ºµÈ ¸ð¾çÀº ´ÙÀ½°ú °°´Ù.

À̸§ ¹®ÀÚ¿­ÀÌ ±¸Á¶Ã¼¿¡ Æ÷ÇԵǾî ÀÖÁö´Â ¾ÊÁö¸¸ µ¿ÀûÀ¸·Î ÇÒ´çµÈ ¸Þ¸ð¸®ÀÇ ¹øÁö¸¦ ¸â¹ö·Î °¡Áö°í ÀÖÀ¸¹Ç·Î ÀÌ ¹øÁö¸¦ ÀÐÀ¸¸é À̸§ ¹®ÀÚ¿­À» ¾òÀ» ¼ö ÀÖ´Ù. ¾î·µç Albert ±¸Á¶Ã¼·ÎºÎÅÍ ¾ÆÀν´Å¸Àο¡ ´ëÇÑ ¸ðµç Á¤º¸¸¦ Àаųª ¾µ ¼ö ÀÖ´Â °ÍÀÌ´Ù. ÀÌ »óÅ¿¡¼­ KimÀ̶ó´Â °°Àº ŸÀÔÀÇ ±¸Á¶Ã¼¿¡ Albert¸¦ ´ëÀÔÇߴµ¥ ÀÌ·¸°Ô µÇ¸é KimÀº AlbertÀÇ ¸ðµç ¸â¹ö¸¦ ±×´ë·Î ´ëÀÔ¹ÞÀ¸¸ç ¶È°°Àº Á¤º¸¸¦ °¡Áö°Ô µÈ´Ù. ´ëÀÔ Á÷ÈÄ¿¡ KimÀÇ ¸â¹ö¸¦ Ãâ·ÂÇØ º¸¸é °ú¿¬ ¶È°°Àº Á¤º¸°¡ Ãâ·ÂµÈ´Ù´Â °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

±×·¯³ª Á¦´ë·Î ´ëÀÔµÈ °Í °°Áö¸¸ ¸Þ¸ð¸® ³»ºÎ¸¦ µé¿©´Ù º¸¸é ±²ÀåÈ÷ ºÒ¾ÈÇÑ »óŶó´Â °ÍÀ» ¾Ë ¼ö Àִµ¥ µÎ ±¸Á¶Ã¼ º¯¼öÀÇ pName ¹øÁö°¡ ¶È°°Àº °÷À» °¡¸®Å°°í ÀÖ´Â °ÍÀÌ´Ù. ´ëÀÔ ¿¬»êÀÚ·Î ´ëÀÔÇßÀ¸¹Ç·Î ¹øÁö±îÁöµµ ±×´ë·Î ´ëÀԵǾú´Ù. ´ëÀÔÇÏ´Â ½ÃÁ¡¿¡¼­ µÎ º¯¼ö´Â ¶È°°Àº Á¤º¸¸¦ °¡Áö±â´Â ÇÏÁö¸¸ µ¿Àû ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ °øÀ¯ÇÏ°í Àֱ⠶§¹®¿¡ ÀáÀçÀûÀÎ ¹®Á¦°¡ ¹ß»ýÇÒ ¼ÒÁö¸¦ ¸¹ÀÌ °¡Áö°í ÀÖ´Ù. ÀÌ ¶§ÀÇ ¸Þ¸ð¸® »óȲÀº ´ÙÀ½°ú °°´Ù.

¿ì¼± µÎ º¯¼ö Áß ÇÑÂÊÀÇ pNameÀ» ¹Ù²Ù¸é ¾çÂÊÀÌ ¸ðµÎ ¿µÇâÀ» ¹Þ´Â´Ù´Â Á¡ÀÌ ¹®Á¦´Ù. KimÀÌ AlbertÀÇ »çº»À¸·Î »ý¼ºµÇ¾ú´Âµ¥ AlbertÀÇ pNameÀ» º¯°æÇϸé KimÀÇ À̸§µµ °°ÀÌ º¯°æµÉ ¼ö¹Û¿¡ ¾øÀ¸¸ç ¹Ý´ëÀÇ °æ¿ìµµ ¸¶Âù°¡Áö´Ù. ´ëÀÔ¿¡ ÀÇÇØ µÎ º¯¼ö°¡ ÀϽÃÀûÀ¸·Î °°Àº »óÅ°¡ µÇ±â´Â ÇßÁö¸¸ ¼­·Î Á¾¼ÓÀûÀÎ °ü°è°¡ µÇ¾úÀ¸¹Ç·Î ¿ÏÀüÇÑ »çº»À̶ó ÇÒ ¼ö ¾ø´Ù. Á¤¼öÇü º¯¼ö iÀÇ °ªÀ» j=i·Î ´ëÀÔÇÏ¿© »çº» j¸¦ ¸¸µé¾ú´Ù¸é j°¡ ¾î¶»°Ô µÇ´õ¶óµµ i´Â ¿µÇâÀ» ¹ÞÁö ¸»¾Æ¾ß ÇÑ´Ù.

¶Ç ´Ù¸¥ ¹®Á¦Á¡Àº µÎ º¯¼ö°¡ Æı«µÉ ¶§ ¸Þ¸ð¸®¸¦ ÀÌÁßÀ¸·Î ÇØÁ¦ÇÒ À§ÇèÀÌ ÀÖ´Ù´Â °ÍÀÌ´Ù. Albert´Â ÀÚ½ÅÀÇ ¸â¹ö pNameÀÌ µ¿ÀûÀ¸·Î ÇÒ´çµÇ¾úÀ¸¹Ç·Î Æı«µÇ±â Àü¿¡ ÀÌ ¸Þ¸ð¸®¸¦ ÇØÁ¦ÇÏ·Á°í ÇÒ °ÍÀÌ´Ù. ÀÌ·¸°Ô µÇ¸é KimÀÇ pNameµµ °°ÀÌ ÇØÁ¦µÇ¾î ¹ö·Á KimÀº Á¤º¸¸¦ ÀÒ¾î ¹ö¸®°Ô µÇ°í ¶ÇÇÑ KimÀÌ pNameÀ» ÇØÁ¦ÇÒ ¶§´Â ÀÌ¹Ì ÇØÁ¦µÈ ¸Þ¸ð¸®¸¦ ÀÌÁßÀ¸·Î ÇØÁ¦ÇÏ°Ô µÇ¹Ç·Î ÀÌ»ó µ¿ÀÛÀ» ÇÏ°Ô µÈ´Ù.

ÀÌó·³ ´ëÀÔ ¿¬»êÀÚ·Î ´Ü¼ø ´ëÀÔÇÏ¿© ±¸Á¶Ã¼ÀÇ »çº»À» ¸¸µå´Â °ÍÀ» ¾èÀº º¹»ç(Shallow Copy)¶ó°í ÇÑ´Ù. ±¸Á¶Ã¼ÀÇ ¸â¹öµéÀÌ Á¤¼ö³ª ½Ç¼ö µûÀ§ÀÇ ´Ü¼ø ŸÀÔ¸¸ ÀÖÀ» °æ¿ì´Â ¾èÀº º¹»ç¸¸À¸·Îµµ ¿ÏÀüÇÑ »çº»À» ¸¸µé ¼ö ÀÖÁö¸¸ Æ÷ÀÎÅÍ°¡ Æ÷ÇԵǾî ÀÖÀ» °æ¿ì´Â ´ëÀÔ¿¡ ÀÇÇØ ¶È°°Àº ¹øÁö¸¦ °¡¸®Å°´Â ¹®Á¦Á¡ÀÌ ÀÖ´Ù. Æ÷ÀÎÅÍ¿¡ ´ëÇؼ­´Â º°µµÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ ÈÄ ³»¿ëÀ» º¹»çÇØ¾ß µÎ º¯¼ö°¡ ¿ÏÀüÇÑ µ¶¸³¼ºÀ» °¡Áö°Ô µÈ´Ù.

 ÀÌ·± ½ÄÀ¸·Î Æ÷ÀÎÅÍ ¸â¹ö¿¡ ´ëÇؼ­´Â ¹øÁö¸¦ ¹Ù·Î ´ëÀÔÇÏÁö ¾Ê°í ÇÊ¿äÇÑ ±æÀ̸¸Å­ µû·Î ÇÒ´çÇÑ ÈÄ ¿øº»ÀÇ ³»¿ë¸¸ ÃëÇÏ´Â º¹»ç¸¦ ±íÀº º¹»ç(Deep Copy)¶ó°í ÇÑ´Ù. ¿øº»ÀÇ ¸â¹ö»Ó¸¸ ¾Æ´Ï¶ó ¸â¹ö°¡ °¡¸®Å°´Â °÷ÀÇ ³»¿ë±îÁöµµ °°ÀÌ º¹»çÇÏ´Â Á» ´õ º¹ÀâÇÑ º¹»ç ¹æ¹ýÀÌ´Ù. À§ ¿¹Á¦¿¡¼­ Albert¸¦ ±íÀº º¹»çÇÏ¿© »çº»À» ÀÛ¼ºÇÏ·Á¸é ´ÙÀ½ µÎ ÁÙÀ» »ðÀÔÇØ¾ß ÇÑ´Ù.

 

     Kim=Albert;

     Kim.pName=(char *)malloc(strlen(Albert.pName)+1);

     strcpy(Kim.pName,Albert.pName);

     printf("À̸§=%s, ³ªÀÌ=%d, Å°=%.1f\n",Kim.pName,Kim.Age,Kim.Height);

 

ÀÏ´Ü ¸ðµç ¸â¹ö¸¦ º¹»çÇ쵂 Æ÷ÀÎÅÍ ¸â¹ö¿¡ ´ëÇؼ­´Â ¿øº»ÀÇ ±æÀ̸¸Å­ º°µµ·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í ¿øº»ÀÇ ³»¿ë¸¸ º¹»çÇß´Ù. ÀÌ·¸°Ô µÇ¸é µÎ º¯¼ö°¡ ¿ÏÀüÈ÷ µ¶¸³µÈ ¸Þ¸ð¸®¸¦ °¡Áö¹Ç·Î Á¾¼Ó¼ºÀÌ »ç¶óÁö¸ç ÇÑÂÊÀÇ ³»¿ëÀ» º¯°æÇصµ ¹Ý´ëÂÊÀº ÀüÇô ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù. ¶ÇÇÑ °¢ º¯¼ö°¡ °³º°ÀûÀ¸·Î ¸Þ¸ð¸®¸¦ ÇØÁ¦Çصµ ¾Æ¹«·± ¹®Á¦°¡ ¾ø´Ù.

Æ÷ÀÎÅÍ°¡ Æ÷ÇÔµÈ ±¸Á¶Ã¼¸¦ ´Ù·ê ¶§´Â °¢º°ÇÑ ÁÖÀÇ°¡ ÇÊ¿äÇÏ´Ù. ƯÈ÷ C++¿¡¼­ °´Ã¼³¢¸® ´ëÀÔÇÒ ¶§ ÀÌ·± ¹®Á¦°¡ ÈçÈ÷ ³ªÅ¸³­´Ù.