[C++]°­ÁÂ(9)<--new ¿¬»êÀÚ




new ÇÒ´ç ´ë»ó;

¾ÆÁÖ °£´ÜÇÏ´Ù. ÇÒ´ç ´ë»ó¿¡ µé¾î°¥ ¼ö ÀÖ´Â °ÍÀº int, char, double µîÀÇ µ¥
ÀÌÅÍ Å¸ÀÔÀº ¹°·ÐÀÌ°í ±¸Á¶Ã¼, ¹è¿­ µîµµ °¡´ÉÇÏ´Ù. new ¿¬»êÀÚ´Â sizeof(ÇÒ´ç
´ë»ó) ¸¸Å­ÀÇ ¸Þ¸ð¸®¸¦ heapÀ¸·ÎºÎÅÍ ÇÒ´çÇÏ¿© ±× ¹øÁö°ªÀ» ¸®ÅÏÇÑ´Ù. À̶§ ¸®
ÅϵǴ ¹øÁö°ªÀº ÇÒ´ç ´ë»óÀ» pointÇÏ´Â Æ÷ÀÎÅÍÇüÀ̱⠶§¹®¿¡ °ð¹Ù·Î Æ÷ÀÎÅÍ
º¯¼ö¿¡ ´ëÀÔÀÌ °¡´ÉÇÏ´Ù. mallocÀÇ °æ¿ì¿¡´Â ¹«Á¶°Ç void *ÇüÀ» ¸®ÅÏÇϱ⠶§¹®
¿¡ º°µµÀÇ Ä³½ºÆ® ¿¬»êÀÚ¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.
´ÙÀ½ÀÌ new ¿¬»êÀÚ¸¦ ÀÌ¿ëÇÑ µ¿Àû ¸Þ¸ð¸® ÇÒ´çÀÇ ¿¹ÀÌ´Ù.

int *pi = new int;
double *pd = new double;
long *pl = new long;

delete ¿¬»êÀÚ´Â new ¿¬»êÀÚ¿Í ÇÏ´Â ÀÏÀÌ ¹Ý´ëÀÎ ¿¬»êÀÚÀÌ´Ù. new ¿¬»êÀÚ°¡
ÇÒ´çÇÑ µ¿Àû¸Þ¸ð¸®¸¦ ÇÒ´ç ÇØÁ¦½ÃÅ°´Â ¿ªÇÒÀ» Çϴµ¥ delete µÚ¿¡ ÇÒ´ç ÇØÁ¦ÀÇ
´ë»óÀÌ µÉ Æ÷ÀÎÅ͸¦ ±âÀÔÇØÁÖ¸é µÈ´Ù. ÀÌ Æ÷ÀÎÅÍ´Â ´ë°³ new ¿¬»êÀÚ°¡ ¸®ÅÏÇÑ
¹øÁö°ªÀ» ´ëÀÔ¹ÞÀº Æ÷ÀÎÅÍÀÌ´Ù.
À§¿¡¼­ ÇÒ´çÀÇ ¿¹·Î º¸¿´´ø µ¿Àû ¸Þ¸ð¸®¸¦ delete ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© ÇÒ´çÀ»
ÇØÁ¦ÇÏ´Â ±¸¹®Àº ´ÙÀ½°ú °°ÀÌ °£´ÜÇÏ´Ù.

delete pi;
delete pd;
delete pl;

new ¿¬»êÀÚ¿¡ ÀÇÇØ ÇÒ´çµÈ ¸Þ¸ð¸®´Â delete ¿¬»êÀÚ°¡ È£ÃâµÇ¾î ÇÒ´çÀ» ´Éµ¿Àû
À¸·Î ÇØÁ¦Çϱâ Àü¿¡´Â ±×´ë·Î ÇÒ´çµÈ ä·Î ³²°Ô µÈ´Ù. µû¶ó¼­ ¼³»ç ÇÔ¼ö ³»ºÎ
¿¡¼­ µ¿Àû ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ¿© º¯¼ö¸¦ »ý¼ºÇÏ¿´´Ù°í ÇÏ´õ¶óµµ ±× º¯¼ö´Â ÇÔ¼ö¸¦
¹þ¾î³ªµµ ±×´ë·Î Á¸ÀçÇϰԵȴÙ. Áï scope ruleÀÇ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â º¯¼ö°¡ µÈ
´Ù.
¸¸¾à new ¿¬»êÀÚ·Î ÇÒ´çÇÑ ¸Þ¸ð¸®¸¦ ÇÒ´ç ÇØÁ¦¸¦ ÇÏÁö ¾Ê°í ÇÁ·Î±×·¥À» ³¡³»
°Ô µÇ¸é ÇÁ·Î±×·¥ÀÌ ³¡³ª´Â ½ÃÁ¡¿¡¼­ ¹Ì ȸ¼öµÈ ¸Þ¸ð¸®°¡ ÀÚµ¿À¸·Î ÇÒ´çÀÌ ÇØ
Á¦µÈ´Ù. ÇÏÁö¸¸ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â µ¿¾È¿¡´Â °è¼Ó ÇÒ´çµÈ ä·Î ³²¾Æ ÀÖÀ¸¹Ç
·Î ÇÒ´çÇÑ ¸Þ¸ð¸®´Â »ç¿ëÀÌ ³¡³­ ÈÄ ¹Ýµå½Ã ÇÒ´ç ÇØÁ¦ÇØ ÁÖ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù.
´ÙÀ½¿¡ new, delete ¿¬»êÀÚ¸¦ »ç¿ëÇÑ ±Ø´ÜÀûÀ¸·Î °£´ÜÇÑ µ¿Àû ¸Þ¸ð¸®ÀÇ ÇÒ´ç
¿¹¸¦ º¸ÀÚ.

#include <iostream.h>

void main()
{
 int *pi = new int;    // ¿©±â¼­ µ¿Àû ¸Þ¸ð¸®¸¦ ÇÒ´ç
 *pi = 3;
 cout << *pi << endl;
 delete pi;          // ÇÒ´çÀ» ÇØÁ¦ÇÑ´Ù.
}

Á¤¼öÇü º¯¼ö Çϳª¸¦ ´ãÀ» ¼ö ÀÖ´Â 2¹ÙÀÌÆ®ÀÇ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ¿© ÀÌ ¹øÁö°ªÀ»
Á¤¼öÇü Æ÷ÀÎÅÍÀÎ pi¿¡ ´ëÀÔÇÏ¿´´Ù. ÀÌ·¸°Ô »ý¼ºµÈ Á¤¼öÇü º¯¼ö¸¦ ÇÁ·Î±×·¥ÀÇ
³»ºÎ¿¡¼­ »ç¿ëÇÏ´Ù°¡ ÇÁ·Î±×·¥ÀÌ Á¾·áµÇ±â Á÷Àü¿¡ delete ¿¬»êÀÚ¸¦ ÅëÇØ ÇÒ´ç
À» ÇØÁ¦ÇÏ¿´´Ù. »ç½Ç ÀÌ·± ½ÄÀ¸·Î ±âº» µ¥ÀÌÅÍ Å¸ÀÔ¿¡ ´ëÇØ new ¿¬»êÀÚ¸¦ »ç¿ë
ÇÏ´Â ÀÏÀº µå¹® ÀÏÀ̸ç new ¿¬»êÀÚ°¡ Á¦´ë·Î ¾²ÀÌ´Â ¶§´Â ±¸Á¶Ã¼³ª ¹è¿­, ¶Ç´Â
classÀÇ °´Ã¼¸¦ »ý¼ºÇÒ¶§ÀÌ´Ù.
new ¿¬»êÀÚ µÚ¿¡ ±¸Á¶Ã¼ÀÇ Å±׸¦ ÇÒ´ç ´ë»óÀ¸·Î ±âÀÔÇØÁÖ¸é ±¸Á¶Ã¼°¡ Â÷ÁöÇÏ
´Â ¸Þ¸ð¸®ÀÇ Å©±â ¸¸Å­ ¸Þ¸ð¸®¸¦ ÇÒ´çÇØÁÖ°Ô µÈ´Ù. ´ÙÀ½¿¡ ±¸Á¶Ã¼¸¦ ÇÒ´çÇÏ´Â
new ¿¬»êÀÚ¸¦ º¸ÀÚ.

#include <iostream.h>
#include <string.h>

struct person          // ±¸Á¶Ã¼ personÀ» ¼±¾ð
{
 char name[15];
 int age;
 double hakjum;
};

void main()
{

 person *pp = new person;   // ±¸Á¶Ã¼¸¦ À§ÇÑ ¸Þ¸ð¸® ÇÒ´ç
 strcpy( pp -> name, "kim nyun hang");
 pp -> age = 21;
 pp -> hakjum = 3.99;

 cout << pp -> name << "'s hakjum is "
     << pp -> hakjum << endl;
 delete pp;            // ÇÒ´ç ÇØÁ¦
 person *pa = new person;   // ¶Ç »õ·Î¿î ¸Þ¸ð¸®¸¦ ÇÒ´ç
 strcpy( pa -> name, "kim hyun a");
 pa -> age = 19;
 pa -> hakjum = 3.28;

 cout << pa -> name << "'s hakjum is "
     << pa -> hakjum << endl;
 delete pa;           // ÇÒ´ç ÇØÁ¦
}

½ÇÁ¦·Î ÇÒ´çµÇ´Â ¸Þ¸ð¸®´Â sizeof( person)ÀÇ Å©±â°¡ µÇ¸ç ÇÒ´ç Á÷ÈÄ¿¡ person
ÇüÀÇ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇϹǷΠÀÌ Æ÷ÀÎÅÍ°ªÀ» person *Çü º¯¼ö¿¡ °ð¹Ù·Î ´ëÀÔÇÏ¿©
µÎ¾ú´Ù°¡ '->' ¿¬»êÀÚ¿Í ÇÔ²² »ç¿ëÇϸé personÇüÀÇ ±¸Á¶Ã¼¸¦ °ð¹Ù·Î »ç¿ëÇÒ ¼ö
ÀÖ´Ù.
¿©±â¼­ º¸´Ù½ÃÇÇ new ¿¬»êÀÚ´Â ¸Þ¸ð¸® ÇÒ´ç »Ó¸¸ ¾Æ´Ï¶ó ¸¶Ä¡ º¯¼ö¸¦ »ý¼ºÇØ
³»´Â ¿ªÇÒÀ» ÇÏ´Â °Íó·³ º¸ÀδÙ. new ¿¬»êÀÚ µÚ¿¡ »ý¼ºÇÏ°íÀÚ ÇÏ´Â º¯¼öÀÇ Å¸
ÀÔ¸¸ Àû¾î ÁÖ°í new ¿¬»êÀÚ°¡ ¸®ÅÏÇÏ´Â Æ÷ÀÎÅ͸¦ ¹Þ¾ÆµÎ¸é Æ÷ÀÎÅ͸¦ »ç¿ëÇÏ¿©
»ý¼ºÇÑ º¯¼ö¸¦ ÀÏ¹Ý Á¤Àû º¯¼ö¿Í ¸¶Âù°¡Áö·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´õ±¸³ª classÀÇ
°´Ã¼¸¦ »ý¼ºÇÒ ¶§´Â °´Ã¼¸¦ ÃʱâÈ­ÇÏ´Â ÇÔ¼ö±îÁöµµ È£Ãâ ÇØÁֹǷΠ°ú¿¬ OOP¿¡
ÀûÇÕÇÑ ¸Þ¸ð¸® °ü¸® ¿¬»êÀÚÀÌ´Ù. ´ÙÀ½Àº new ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© ¹è¿­À» »ý¼ºÇØ
º¸µµ·Ï ÇÏÀÚ.

#include <iostream.h>

void main()
{
 int *pi = new int[5];    // ¹è¿­À» »ý¼º
 int i;
 for ( i = 0; i < 5; i ++)
     pi[ i ]=i;
 for ( i = 0; i < 5; i ++)
     cout << "p[" << i << "] = " << pi[ i] << endl;
 delete pi;
}

new ¿¬»êÀÚ µÚ¿¡ ¹è¿­À» ±×´ë·Î ±âÀÔ¸¸ ÇØÁÖ¸é µÈ´Ù. À̶§ ÇÒ´çµÇ´Â ½ÇÁ¦ ¸Þ¸ð
¸®´Â sizeof( int[5]) Áï, 10 ¹ÙÀÌÆ®ÀÌ´Ù. new ¿¬»êÀÚÀÇ ¿¡·¯ 󸮴 malloc
ÇÔ¼ö¿Í µ¿ÀÏÇÑ ¹æ¹ýÀ» »ç¿ëÇϴµ¥ ÇÒ´çÇÒ ¸Þ¸ð¸®°¡ ºÎÁ·Çϸé NULLÀ» ¸®ÅÏÇÑ´Ù.
±×·¡¼­ malloc ÇÔ¼ö¿Í ¸¶Âù°¡Áö·Î ¸Þ¸ð¸® ÇÒ´ç ÈÄ Æ÷ÀÎÅÍ°ªÀ» °Ë»çÇØ º¸¸é Á¦
´ë·Î ÇÒ´çµÇ¾ú´Â Áö¸¦ ¾Ë ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â ÀϺη¯ ¸¹Àº ¾çÀÇ ¸Þ¸ð¸®¸¦ ¿ä
±¸ÇÏ¿© ¿¡·¯¸¦ À¯¹ß½ÃÄÑ ¾î¶»°Ô ¿¡·¯¸¦ ó¸®ÇÏ´Â °¡¸¦ º¸¿©ÁØ´Ù.

#include <iostream.h>
#include <stdlib.h>

void main()
{
 char *pc = new char[65535u];
 if ( pc == NULL)       // ¿¡·¯ °Ë»ç
 {
     cout << "\a\n No more free heap memory !\n";
     exit(1);
 }
 // else some operation here

 delete pc;
}

±×·¯³ª ÀÌ·± ¿¡·¯ ó¸® ¹æ¹ýÀº ½ÇÁ¦ ÇÁ·Î±×·¡¹Ö¿¡¼­´Â Àß »ç¿ëµÇÁö ¾ÊÀ¸¸ç ¿¡
·¯ handler ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇϰųª ¾Æ´Ï¸é new ¿¬»êÀÚÀÇ ±â´ÉÀ»
»ç¿ëÀÚ°¡ º¯°æÇÏ¿© ¿¡·¯ 󸮸¦ Çϵµ·Ï ÇÑ´Ù. new ¿¬»êÀÚ´Â ¸Þ¸ð¸® ÇÒ´ç¿¡ ½Ç
ÆÐÇÒ °æ¿ì _new_handler¶ó´Â ÇÔ¼ö¸¦ È£ÃâÇϵµ·Ï µÇ¾î ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â ´Ü¼øÈ÷
ÇÁ·Î±×·¥À» ³¡³»±â¸¸ Çϵµ·Ï µÇ¾î Àִµ¥ »ç¿ëÀÚ°¡ set_new_handler ÇÔ¼ö¸¦ »ç
¿ëÇÏ¿© ¾ó¸¶µçÁö ¼öÁ¤ °¡´ÉÇÏ´Ù. ´ÙÀ½¿¡ _new_handlerÇÔ¼öÀÇ ±â´ÉÀ» ¹Ù²Ù¾î º»
¿¹Á¦¸¦ º¸ÀδÙ.

#include <iostream.h>
#include <stdlib.h>
#include <new.h>

void new_error()     // ÀÌ ÇÔ¼ö°¡ ¿¡·¯ handler ÇÔ¼öÀÌ´Ù.
{
 cout << "\a\n No more free heap memory !\n";
 exit(1);
}

void main()
{
 set_new_handler( new_error);
 char *pc = new char[65535u];    // ¿©±â¼­ ¿¡·¯ ¹ß»ý
 // some operation here

 delete pc;
}

new ¿¬»ê ½ÇÇà µµÁß ¸Þ¸ð¸® ºÎÁ·À¸·Î ¿¡·¯°¡ ¹ß»ýÇϸé _new_handler ÇÔ¼ö¸¦ È£
ÃâÇ쵂 new ¿¬»ê ÀÌÀü¿¡ set_new_handler ÇÔ¼ö¿¡ ÀÇÇØ new_error ÇÔ¼ö°¡ ¿¡·¯
handler ÇÔ¼ö·Î ÁöÁ¤ÀÌ µÇ¾úÀ¸¹Ç·Î ¿¡·¯ ¹ß»ý½Ã´Â ¹«Á¶°Ç new_error ÇÔ¼ö°¡ È£
ÃâµÈ´Ù. ¿©±â¼­ Á¤ÀÇÇÑ new_error ÇÔ¼ö¿¡¼­´Â ´Ü¼øÈ÷ ¿¡·¯°¡ ³µ´Ù´Â »ç½ÇÀ» ¾Ë
¸®±â¸¸ ÇÏ°í ÇÁ·Î±×·¥À» Á¾·áÇÏ°í ÀÖÀ¸³ª Á» ´õ ¼¶¼¼ÇÑ Ã³¸®¸¦ ÇÏ´Â °Íµµ °¡´É
ÇÏ´Ù.


À̾ °è¼ÓµË´Ï´Ù. ==============>>>>>>>


--------------------------------------------------------------------------------

    

 ´ÙÀ½