· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Docbook Sgml/C++Programming-HOWTO

C++ Programming HOW-TO

C++ Programming HOW-TO

Al Dev (Alavoor Vasudevan)

      
    

Á¤Áö¿ë

      
    

ÀÌ ¹®¼­´Â C++¿¡ °üÇÑ URL°ú C++ online Ã¥¿¡ ´ëÇÑ ¸µÅ©, C++ ÇÁ·Î±×·¡¹Ö ÆÁ µîÀ» Æ÷°ýÀûÀ¸·Î Á¦°øÇÑ´Ù. ÀÌ ¹®¼­´Â C++¿¡¼­ °Þ´Â ´Ù¾çÇÑ ¸Þ¸ð¸® °ü·Ã ¹®Á¦¸¦ ÇØ°áÇØÁÖ´Â Java¿Í ºñ½ÁÇÑ libraryµµ Á¦°øÇÑ´Ù. ÀÌ library¸¦ ÀÌ¿ëÇϸé, java ¼Ò½ºÄڵ带 C++·Î ÄÄÆÄÀÏ ÇÒ ¼öµµ ÀÖ´Ù. ÀÌ ¹®¼­´Â "C++ ¾ð¾îÀÇ Áý"¿ªÇÒÀ» ÇÑ´Ù. ÀÌ ¹®¼­¿¡¼­ Á¦°øµÇ´Â Á¤º¸´Â C++ ¾ð¾î¸¦ ÀûÀýÈ÷ »ç¿ëÇÏ°í ¸ðµç ¿î¿µÃ¼Á¦ - ¸®´ª½º, MS-DOS, BeOS, Apple Macintosh OS, Microsoft Windows 95/98/NT/2000, OS/2, IBM OSes (MVS, AS/400 µî..), VAX VMS, Novell Netware, À¯´Ð½º-like OSµé(Solaris, HPUX, AIX, SCO, Sinix, BSD µî..)°ú ±âŸ C++À» Áö¿øÇÏ´Â ¸ðµç ¿î¿µÃ¼Á¦(¾Æ¸¶µµ ¼¼»óÀÇ °ÅÀÇ ¸ðµç ¿î¿µÃ¼Á¦°¡ ÀÌ¿¡ ¼ÓÇÒ °ÍÀÌ´Ù) - ¿¡ Àû¿ëÇÏ´Â °ÍÀ» µµ¿ÍÁÙ °ÍÀÌ´Ù.

고친 과정
고침 41.82002-03-31고친이 Á¤Áö¿ë
¼öÁ¤ÆÇ ¹ø¿ª
고침 5.02000-06-15고친이 ±èÁöÈñ, À±ÁÖö
ÃÖÃÊ ¹ø¿ª

차례
1. ¼­¹®
1.1. C++ ÇÁ·Î±×·¥? C++ vs. Java/PHP
1.2. ¾î¶² °ÍÀ» ¼±ÅÃÇÒ °ÍÀΰ¡. Ada95, C, C++, Java ¾Æ´Ï¸é PHP?
1.3. ÇöÀç C++ ÄÄÆÄÀÏ·¯ÀÇ ¹®Á¦Á¡
2. ÃßõÇÒ¸¸ÇÑ C++ ÄÄÆÄÀÏ·¯
2.1. MS Windows 2000/NT/95/98/ME/XP¸¦ À§ÇÑ ÄÄÆÄÀÏ·¯
2.2. UNIX¿Í ±âŸ UNIX-like ½Ã½ºÅÛµéÀÇ ÄÄÆÄÀÏ·¯
3. ¿©·¯°¡Áö ¹®ÀÚ¿­°ü·Ã class
3.1. Multiple Inheritance - ÀڽŸ¸ÀÇ ¹®ÀÚ¿­ class ¸¸µé±â
4. String class ´Ù¿î¹Þ±â
4.1. ¾î¶»°Ô ÀúÀÚÀÇ String class¸¦ ¹ÏÀ» ¼ö ÀÖ³ª?
5. String class »ç¿ëÇϱâ
5.1. ¿¬»êÀÚ
5.2. ÇÔ¼ö
5.3. String classÀÇ À̸§ ¹Ù²Ù±â
5.3.1. Case 1: ´Ü¼øÇÑ À̸§ ¹Ù²Ù±â
5.3.2. Case 2: À̸§ÀÌ °ãÄ¥ ¶§
6. String.h ÆÄÀÏ
6.1. StringBuffer.h
6.2. StringTokenizer.h
7. Ç¥ÁØ C++ ¶óÀ̺귯¸® string class
7.1. ¿¹Á¦·Î »ìÆìº¸´Â string
7.2. ¹®ÀÚ¿­À» ã±â
7.3. string tokenizer
8. File class
9. C++ ¿¡¼­ÀÇ ¸Þ¸ð¸® ÇÒ´ç
9.1. C++ Zap (Delete) ÇÔ¼ö
9.2. my_malloc °ú my_free ÀÇ »ç¿ë
9.3. C++ ¿¡¼­ÀÇ °¡¹ÙÁö ÄÝ·ºÅÍ
10. Æ÷ÀÎÅͰ¡ ¹®Á¦ÀÌ´Ù
11. µð¹ö±ë
11.1. µð¹ö±ë ÆÄÀÏ
12. C++À» À§ÇÑ IDE(Integrated Development Enviroment)¿Í ¿¡µðÅÍ
12.1. IDE µé
12.2. ¿¡µðÅÍ
12.3. ´Ù¸¥ Âü°íÇÒ¸¸ÇÑ ³»¿ë
13. C++ Online ÅØ½ºÆ®¿Í ¹®¼­µé
13.1. C++ »çÀÌÆ®µé
13.2. C++ Tutorials
13.3. À¯¿ëÇÑ ¸µÅ©µé
13.4. C++ Quick-Reference
13.5. C++ Usenet ´º½º±×·ì
13.6. Java ÇüÅÂÀÇ API
14. C++ ÄÚµù °ü½À
15. C++ ½ºÅ©¸³Æ® ¾ð¾î
15.1. PIKE & PHP (C/C++ Scripting Languages)
15.2. SoftIntegration Ch (C/C++ ½ºÅ©¸³Æ® ¾ð¾î)
15.3. PHP (C++ Scripting Language)
16. Templates
17. STL References
17.1. STL °³¿ä
17.2. Çì´õ ÆÄÀÏ
17.3. ÄÁÅ×ÀÌ³Ê class ÀÎÅÍÆäÀ̽º
17.4. º¤ÅÍ : Vectors
17.4.1. º¤ÅÍ ¸¸µé±â
17.4.2. º¤Å͸¦ üũÇϱâ
17.4.3. º¤ÅÍÀÇ ¿ø¼Ò¿¡ Á¢±ÙÇϱâ
17.4.4. º¤ÅÍÀÇ ¿ø¼Ò¸¦ Ãß°¡ / »èÁ¦Çϱâ
17.4.5. Vector Iterator
17.4.6. º¤ÅÍÀÇ ºñ±³
17.5. Iterator ¿Í STL
17.6. ¸®½ºÆ®
17.7. ÁýÇÕ(Set)
17.7.1. SetÀ» ¸¸µé±â
17.7.2. Function Objects¶õ ¹«¾ùÀΰ¡?
17.7.3. Ãâ·ÂÇϱâ
17.7.4. ¿ø¼ÒÀÇ ¼ö ±¸Çϱâ
17.7.5. ÁýÇÕÀÌ ¼­·Î °°ÀºÁö °Ë»çÇϱâ
17.7.6. ¿ø¼Ò¸¦ Ãß°¡Çϰųª »èÁ¦Çϱâ
17.7.7. ¿ø¼Ò¸¦ ã±â
17.7.8. ÁýÇÕ ¿¬»ê
17.8. ¸Ê
17.9. STL ¾Ë°í¸®Áò
18. C++¿¡¼­ÀÇ ¾²·¹µå
18.1. ¾²·¹µå Æ©Å丮¾ó
18.2. C++¿¡¼­ ¾²·¹µå class µðÀÚÀÎÇϱâ
18.2.1. ¼Ò°³
18.2.2. ¾²·¹µå¿¡ ´ëÇÑ °£´ÜÇÑ ¼Ò°³
18.2.3. ±âº»ÀûÀÎ Á¢±Ù¹æ¹ý
18.2.4. ±¸Çö
18.2.5. Thread Class »ç¿ëÇϱâ
18.2.6. °á·Ð
19. C++ À¯Æ¿¸®Æ¼µé
19.1. ¸Þ¸ð¸® Åø
20. ÀÌ ¹®¼­ÀÇ ´Ù¸¥ Æ÷¸Ë
20.1. Acrobat PDF Æ÷¸Ë
20.2. linuxdoc À» Docbook Æ÷¸ËÀ¸·Î ¹Ù²Ù±â
20.3. MS WinHelp Æ÷¸ËÀ¸·Î ¹Ù²Ù±â
20.4. ¿©·¯°¡Áö Æ÷¸ËÀÇ ¹®¼­¸¦ Àбâ
21. ´Ù¸¥ ¾ð¾î·ÎÀÇ ¹ø¿ª
22. Copyright
23. ºÎ·Ï A String ÇÁ·Î±×·¥ ÆÄÀÏ

1. ¼­¹®

(ÀÌ ¹®¼­ÀÇ ÃֽůÇÀº http://milkyway.bounceme.net/HOWTO/cpphowto/C++Programming-HOWTO.html ¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù)

ÀÌ ¹®¼­ÀÇ ¸ñÀûÀº C++¿¡ °üÇÑ URL°ú C++ online Ã¥¿¡ ´ëÇÑ ¸µÅ©, C++ ÇÁ·Î±×·¡¹Ö ÆÁ µîÀ» Æ÷°ýÀûÀ¸·Î Á¦°øÇÏ´Â °ÍÀÌ´Ù. ¶ÇÇÑ, ÀÌ ¹®¼­´Â Java ½ºÅ¸ÀÏÀÇ String class, string tokenizer, ¸Þ¸ð¸® ÇÔ¼öµî ÀϹÝÀûÀÎ C++ ÇÁ·Î±×·¥¿¡¼­ ³Î¸® ¾²ÀÏ ¼ö ÀÖ´Â ¸¹Àº ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. C++ °ú Java´Â ¿À´Ã³¯ ¸¹Àº ¼ÒÇÁÆ®¿þ¾î ÇÁ·ÎÁ§Æ®¿¡¼­ ¾²À̰í ÀÖ´Ù. ÇÁ·Î±×·¡¸Ó´Â C++°ú Java¸¦ ¹ø°¥¾Æ°¡¸ç ¾²°ÔµÉ °ÍÀ̰í, ÀÌ Java ½ºÅ¸ÀÏÀÇ class°¡ ¸Å¿ì À¯¿ëÇÔÀ» ¾Ë°Ô µÉ °ÍÀÌ´Ù. ÀÌ library¿Í C++ Ç¥ÁØ ¶óÀ̺귯¸®ÀÇ »ç¿ë¹ýÀ» ¾Ë·ÁÁÙ ´Ù¾çÇÑ ¿¹Á¦°¡ Á¦½ÃµÉ °ÍÀÌ´Ù.

ÀÌ ¹®¼­´Â C++¿¡ ´ëÇÑ ±³°ú¼­°¡ ¾Æ´Ï¸ç, ÀÌ¿¡ ´ëÇØ¼­´Â ÀÌ¹Ì ¸î°¡Áö ÁÁÀº on-line Ã¥µéÀÌ ÀÖ´Ù. C++ÀÌ ²Ï ¿À·£½Ã°£µ¿¾È »ç¿ëµÇ¾î¿Ô±â ¶§¹®¿¡, ¸Å¿ì ¸¹Àº ¼öÀÇ C++ ¹®¼­/±Û/Æ©Å丮¾óÀÌ ÀÎÅÍ³Ý»ó¿¡ Á¸ÀçÇÑ´Ù. ¸¸¾à ´ç½ÅÀÌ C++À» óÀ½ Á¢ÇÏ´Â °ÍÀ̰í, C++ ÇÁ·Î±×·¥À» Â¥ º» ÀûÀÌ ¾ø´Ù¸é, 13절Àå¿¡ ¸µÅ©µÇ¾î ÀÖ´Â on-line C++ Ã¥À» ¸ÕÀú Àо°Å³ª, Amazon À̳ª barnes°ú °°Àº °÷¿¡¼­ C++ Ã¥À» »ç º¼ °ÍÀ» ÃßõÇÑ´Ù.

´©±º°¡°¡ ¸»Çßµí - C/C++ ¾ð¾î´Â OS³ª µð¹ÙÀ̽ºµå¶óÀ̹ö, ºü¸¥ ÀÀ´äÀ» ÇÊ¿äÇÏ´Â real-time ÇÁ·Î±×·¥µîÀ» ¸¸µå´Â ½Ã½ºÅÛ ¿£Áö´Ï¾î³ª ¾²¶ó°í Çϰí, ´ç½ÅÀº 2002³âº¸´Ù ÄÄÇ»ÅͰ¡ ¸î¹é¸¸¹è »¡¶óÁú 2005³âÀ» »ý°¢Çϸé Java³ª PHP-scriptingÀ» ½á¾ßÇÑ´Ù. Çϵå¿þ¾î ´Â Á¡Á¡ ½Î¸é¼­µµ, »¡¶óÁø´Ù.


1.1. C++ ÇÁ·Î±×·¥? C++ vs. Java/PHP

C++Àº °¡Àå °­·ÂÇÑ ¾ð¾îµé Áß ÇϳªÀ̰í, Java³ª PHP-scripting °°Àº °ÍÀÌ ³ªÅ¸³µÁö¸¸, ¾ÕÀ¸·Îµµ ¿À·£ ½Ã°£µ¿¾È ¾²ÀÌ°Ô µÉ °ÍÀÌ´Ù. ½Ç½Ã°£ÀÇ ¸Å¿ì ºü¸¥ ÀÀ´äÀ» ÇÊ¿äÇÏ´Â ÇÁ·Î±×·¥¿¡´Â C³ª C++ÀÌ »ç¿ëµÈ´Ù. C++Àº ¸Å¿ì ºü¸£°Ôµ¿ÀÛÇϰí, ½ÇÁ¦·Î Javaº¸´Ù 10¹è¿¡¼­ 20¹è Á¤µµ ºü¸£´Ù . Java´Â C++¿¡¼­ "ÆÄ»ýµÈ" ¾ð¾îÀÌ´Ù. JavaÀÇ ´Ü ÇϳªÀÇ ¹®Á¦Á¡Àº ¹Ù·Î - "Java ´Â ´À¸®´Ù!!"´Â °ÍÀÌ´Ù. VMÀ§¿¡¼­ µµ´Â Java ¹ÙÀÌÆ®ÄÚµå´Â ÄÄÆÄÀÏµÈ ½ÇÇàÄڵ庸´Ù ´À¸®°í, JIT(Just-In-Time) ÄÄÆÄÀÏ·¯ À§¿¡¼­ ´õ ºü¸£°Ô µ¹±â´Â ÇÏÁö¸¸, ¿©ÀüÈ÷ C++º¸´Ù´Â ´À¸®´Ù. ÃÖÀûÈ­ µÈ C/C++ ÇÁ·Î±×·¥Àº JIT ³ª ±× ÀÌÀüÀÇ ÄÄÆÄÀÏ·¯·Î ÄÄÆÄÀÏ µÈ Java Äڵ庸´Ù ¾à 3 ¿¡¼­ 4¹è Á¤µµ ºü¸£´Ù!! ±×·¸´Ù¸é, ¿Ö »ç¶÷µéÀÌ Java¸¦ ¾²´Â°¡? ÀÌ´Â Java°¡ ¼ø¼öÇÑ °´Ã¼ÁöÇâÀ» Áö¿øÇϰí, JavaÀÇ ÀÚµ¿È­µÈ ¸Þ¸ð¸® °ü¸®·Î ÀÎÇØ ÇÁ·Î±×·¡¹ÖÇϱⰡ ½¬¿ì¸ç, ÇÁ·Î±×·¡¸ÓµéÀÌ Á÷Á¢ ¸Þ¸ð¸® °ü¸®Çϱ⸦ ½È¾îÇϱ⠶§¹®ÀÌ´Ù. ÀÌ ¹®¼­´Â C++ÀÇ ¸Þ¸ð¸® °ü¸®¸¦ ÀÚµ¿È­ÇÏ¿© ÈξÀ »ç¿ëÇϱ⠽±°Ô ÇϰíÀÚ Çß´Ù. ¿©±â¼­ ³ª¿À´Â library´Â C++À» Java ¸¸Å­ ½±°Ô ´À³¢°Ô ÇØÁÙ °ÍÀ̰í, C++ÀÌ Java¿Í °æÀïÇÒ ¼ö ÀÖµµ·Ï ÇØÁÙ °ÍÀÌ´Ù.

¼öµ¿ÀûÀÎ ¸Þ¸ð¸® °ü¸®¸¦ À§ÇØ C++ ÇÁ·Î±×·¥ µð¹ö±ëÀÇ ´ëºÎºÐ ½Ã°£ÀÌ ¼Ò¸ðµÈ´Ù. ÀÌ ¹®¼­´Â µð¹ö±ë ½Ã°£À» ÁÙÀ̱â À§ÇÑ ¸î°¡Áö ¾ÆÀ̵ð¾î¿Í ÆÁÀ» ÁÙ °ÍÀÌ´Ù.

¾ðÁ¦ C++À» ½á¾ßÇÏ°í ¾ðÁ¦ Java/PHP¸¦ ½á¾ßÇϴ°¡?

¾Æ·¡¿Í °°Àº °æ¿ì¿£ C++À» ½á¶ó:

  • ½ÇÇà¼Óµµ¿Í ¼º´ÉÀÌ ¸Å¿ì Áß¿äÇÑ ÇÁ·Î±×·¥À» ¸¸µé ¶§.

  • ¸¸µå´Â ÇÁ·Î±×·¥ÀÇ »ç¿ëÀÚ ¼ö°¡ ¸¹À» ¶§. C++Àº ÄÄÆÄÀÏ-¸µÅ·-µð¹ö±ë »çÀÌŬÀÌ ÇÊ¿äÇϱ⠶§¹®¿¡, ÇÁ·Î±×·¥ °³¹ß¿¡ ´õ ¸¹Àº ½Ã°£ÀÌ ¼Ò¿äµÈ´Ù. µû¶ó¼­ »ç¿ëÀÚ¼ö°¡ ÃæºÐÈ÷ ¸¹À» ¶§¿¡³ª Àû´çÇÏ´Ù. ½ÇÇàÆÄÀÏÀ» ¸¸µé±â À§ÇØ ¸¹Àº ¼öÀÇ objectÆÄÀÏÀ» ¸µÅ©ÇÏ´Â °ÍÀº ²Ï ½Ã°£ÀÌ °É¸°´Ù. (¸µÅ©Çϴµ¥ °É¸®´Â ½Ã°£À» ÁÙÀ̱â À§ÇØ archive³ª ¶óÀ̺귯¸®, °øÀ¯ ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù.)

  • C++ÇÁ·Î±×·¡¹Ö °æÇèÀÌ ¸¹À» ¶§.

Java/PHP¸¦ ½á¾ßÇÒ °æ¿ì:

  • (C/C++·Î ÀÛ¼ºµÇ´Â °Í¿¡ ºñÇØ¼­) ½ÇÇà¼Óµµ¿Í ¼º´ÉÀÌ Áß¿äÇÏÁö ¾ÊÀ» ¶§.

  • »ý»ê ºñ¿ëÀ» ³·Ãß±â À§ÇØ - ÄÄÆÄÀÏ-¸µÅ© »çÀÌŬÀÌ ¾ø±â ¶§¹®¿¡, Java/PHP´Â C++º¸´Ù °³¹ßÀÌ ºü¸£´Ù.

  • ºü¸¥ °³¹ßÀÌ ÇÊ¿äÇÒ ¶§.

  • ÄÚµå À¯Áöº¸¼ö¸¦ ½±°Ô Çϱâ À§ÇØ. C++ À» À¯Áöº¸¼öÇÏ´Â °ÍÀÌ Java³ª PHP-scripting º¸´Ù ÈξÀ ¾î·Æ´Ù.

  • Java¿Í PHP-scriptingÀº ¹Ì·¡ÀÌ´Ù, Çϵå¿þ¾îÀÇ ¼Óµµ´Â ºÐÀÚ¿Í ¿øÀÚ, ¿øÀÚº¸´Ù ÀÛÀº Å©±âÀÇ ÄÄÇ»ÅÍ µµÀÔ°ú ÇÔ²² ±ÞµîÇÒ °ÍÀÌ´Ù. ¹Ì·¡ÀÇ ÄÄÇ»ÅÍ´Â ¿À´Ã³¯ ÄÄÇ»ÅÍÀÇ ¼öÁ¶¹èÀÇ ¼º´ÉÀ» °¡Áú °ÍÀÌ´Ù. ¹Ì·¡¿¡ Çϵå¿þ¾î ¼º´ÉÀÌ Áøº¸ÇÔ°ú ÇÔ²², Java³ª PHP-scriptÀÇ ´À¸° ½ÇÇà ¼Óµµ´Â Áß¿äÄ¡ ¾Ê°Ô µÉ °ÍÀÌ´Ù. ¿À´Ã³¯ ´ç½ÅÀÌ ¾²´Â ÄÄÇ»ÅÍ(ÇöÀç´Â 2002³âÀÌ´Ù.)´Â ¾öû³ª°Ô ´À¸®°í, ±â¾î°¡°í ÀÖÀ¸¸ç, ÃæºÐÈ÷ ºü¸£Áö ¸øÇÏ´Ù.

NOTE: Java ÄÄÆÄÀÏ·¯ (JIT ³ª ´Ù¸¥ °Íµé)¿¡ ¸¹Àº Áøº¸°¡ ÀÖ¾ú´Ù. Java ÇÁ·Î±×·¥Àº GNU GCJ http://gcc.gnu.org/java·Î ÄÄÆÄÀÏ µÉ ¼ö ÀÖ´Ù. GCJ´Â °£ÆíÇϰí, ÃÖÀûÈ­µÇ¾îÀÖÀ¸¸ç, Áøº¸ÀûÀÎ Java ÇÁ·Î±×·¡¹Ö ¾ð¾î¸¦ À§ÇÑ ÄÄÆÄÀÏ·¯ÀÌ´Ù. GCJ´Â Java source Äڵ带 ¸Ó½Å ÄÚµå·Î ¹Ù·Î ÄÄÆÄÀÏ ÇÒ ¼öµµ ÀÖ°í, Java ¹ÙÀÌÆ®ÄÚµå(class file)·Î ÄÄÆÄÀÏ ÇÒ ¼öµµ ÀÖ´Ù.

GCJ Á¤º¸:


1.2. ¾î¶² °ÍÀ» ¼±ÅÃÇÒ °ÍÀΰ¡. Ada95, C, C++, Java ¾Æ´Ï¸é PHP?

¾ð¾îÀÇ ¼±ÅÃÀº ¾î·Á¿î ÀÏÀÌ´Ù. ¿©±â¿£ ³Ê¹«³ª ¸¹Àº °í·ÁÇÒ »çÇ×ÀÌ ÀÖ´Ù - °³¹ßÀÚ, »ç¶÷ÀÇ ´É·Â, ºñ¿ë, Åøµé, Á¤Ã¥ (±¹°¡ÀÇ Á¤Ä¡ Á¤Ã¥±îÁöµµ), »ç¾÷°¡³ª ȸ»çµé¿¡ ´ëÇÑ ¿µÇâ±îÁö. ±â¼úÀûÀÎ ÀÌÀ¯·Î´Â ÃÖÀûÀÇ ¾ð¾îÀÏÁö¶óµµ ´Ü¼øÈ÷ Á¤Ä¡ÀûÀÎ °áÁ¤À¸·Î ÀÎÇØ ¼±ÅõÇÁö ¸øÇÒ ¼öµµ ÀÖ´Ù.

David WheelerÀÇ ¾ð¾î ºñ±³¸¦ º¸ÀÚ. Ada ºñ±³ Â÷Æ®. Ada°¡ 93%, Java´Â 72%, C++Àº 68% C´Â 53%À» °¢°¢ ¹Þ¾Ò´Ù. C++°ú Java´Â Á¡¼ö¸é¿¡¼­´Â ºñ½ÁÇÏ´Ù (4% Â÷ÀÌ). AdaÀÇ °³¹ß ºñ¿ëÀº Stephen F. Zeigler¿¡ µû¸£¸é C++ÀÇ ¹ÝÀýÀÌ´Ù. Ada95´Â ¾Æ·¡¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù -

C++ ÄÄÆÄÀÏ·¯´Â C ÄÄÆÄÀÏ·¯º¸´Ù ÈξÀ º¹ÀâÇϰí, C++Àº Cº¸´Ù ¾à°£ ´À¸®°Ô µ¿ÀÛÇÒ ¼ö ÀÖ´Ù. C ÄÄÆÄÀÏ·¯´Â ÃæºÐÈ÷ ¿À·¨µ¿¾È Àß ¾²¿©Á®¿Ô´Ù.

¸î¸î ½Ã½ºÅÛ¿¡¼­, ´ç½ÅÀº »ý¼ºµÈ Äڵ带 ÃÖÀûÈ­ Çϱâ À§ÇØ ¸î°¡Áö ¿É¼ÇÀ» ¾µ ¼ö ÀÖ´Ù.

¿À´Ã³¯, C´Â ÁÖ·Î ¿î¿µÃ¼Á¦³ª µð¹ÙÀ̽º µå¶óÀ̹ö, ºü¸£°Ô ÀÛµ¿ÇؾßÇÏ´Â ÇÁ·Î±×·¥À» ¾²±â À§ÇØ ·Î¿ì·¹º§ ½Ã½ºÅÛ ÇÁ·Î±×·¡¹Ö¿¡ ¾²ÀδÙ.

Note: ÀÌ HOWTO¿¡ Á¦°øµÇ´Â String, StringBuffer, StringTokenizer class¸¦ ÀÌ¿ëÇÏ¿© C++ Äڵ带 Java¿Í ¿ÏÀüÈ÷ ¶È°°ÀÌ ¾µ ¼ö ÀÖ´Ù. ÀÌ ¹®¼­ÀÇ ÀϺδ C++·Î Java class¸¦ Èä³»³¿À¸·Î½á C++°ú JavaÀÇ Â÷À̸¦ ÁÙÀ̰íÀÚ Çß´Ù. C++°ú Java¸¦ ¿Ô´Ù°¬´ÙÇÏ´Â Java ÇÁ·Î±×·¡¸ÓµéÀº ÀÌ String class¸¦ ÁÁ¾ÆÇÒ °ÍÀÌ´Ù.

¸¸¾à C++ÀÇ ÀÛ¼º-ÄÄÆÄÀÏ-µð¹ö±ë-ÄÄÆÄÀÏ ½ÎÀÌŬÀÌ ½È´Ù¸é, web °³¹ßÀ̳ª ÀϹÝÀûÀÌ ÇÁ·Î±×·¡¹Ö¿¡ ¾²ÀÏ ¼ö ÀÖ´Â PHP°°Àº script ¾ð¾î¸¦ ¾Ë¾Æº¸¾Æ¶ó. PHP³ª PERL°°Àº script¾ð¾î´Â ºü¸¥ ¾îÇø®ÄÉÀÌ¼Ç °³¹ßÀ» °¡´ÉÇÏ°Ô ÇÑ´Ù. PHP´Â ¸î°¡Áö °´Ã¼ÁöÇâÀ» À§ÇÑ Æ¯Â¡µµ °®°í ÀÖ´Ù. PHP HOWTO´Â http://doc.kldp.org/wiki.php/LinuxdocSgml/PHP-HOWTO ¿¡¼­ º¼ ¼ö ÀÖ°í, ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â PHP °ø½Ä ȨÆäÀÌÁö¸¦ Âü°íÇÏ¸é µÈ´Ù.


1.3. ÇöÀç C++ ÄÄÆÄÀÏ·¯ÀÇ ¹®Á¦Á¡

C++Àº C¸¦ Æ÷ÇÔÇϱ⠶§¹®¿¡, CÀÇ *³ª»Û* Á¡µéÀ» ¸ðµÎ °®°í ÀÖ´Ù. ¸Þ¸ð¸®ÀÇ ¼öµ¿ ÇÒ´ç°ú ÇØÁ¦´Â Áö·çÇϰí, ¿¡·¯¸¦ ¸¸µé¾î³»±â ÀϾ¥ÀÌ´Ù. ( 9.3절 ¸¦ º¸¶ó).

C ÇÁ·Î±×·¡¹Ö¿¡¼­´Â ´ÙÀ½°ú °°Àº °Íµé·Î ÀÎÇØ ¸Þ¸ð¸® ¸¯À̳ª ¿À¹öÇ÷ο찡 ¸Å¿ì ÈçÇÏ´Ù.

	Datatype  char * and char[]
	String functions like strcpy, strcat, strncpy, strncat, etc..
	Memory functions like malloc, realloc, strdup, etc..

char *¿Í strcpyÀÇ »ç¿ëÀº "¿À¹öÇ÷οì", "°æ°èħ¹ü¿¡·¯(fence past errors)", "¸Þ¸ð¸® ¿À¿°(memory corruption)", "´Ù¸¥º¯¼ö ħ¹ü(step-on-others-toe)" À̳ª "¸Þ·Î¸® ¸¯(memory leaks)" µîÀÇ ²ûÂïÇÑ ¸Þ¸ð¸® ¹®Á¦¸¦ ÀÏÀ¸Å²´Ù. ¸Þ¸ð¸® ¹®Á¦´Â ¸Å¿ì µð¹ö±ëÀÌ Èûµé°í, µû¶ó¼­ °íÄ¡±â´Âµ¥ ¸¹Àº ½Ã°£ÀÌ µç´Ù. ¸Þ¸ð¸® ¹®Á¦´Â ÇÁ·Î±×·¡¸ÓÀÇ »ý»ê¼ºÀ» ¶³¾î¶ß¸°´Ù. ÀÌ ¹®¼­´Â C++ÀÇ ÀÌ·¯ÇÑ ´ÜÁ¡À» ÇØ°áÇϱâ À§ÇØ °í¾ÈµÈ ¿©·¯°¡Áö ¹æ¹ýµéÀ» ÅëÇØ, ÇÁ·Î±×·¡¸ÓÀÇ »ý»ê¼ºÀ» ³ôÀ̴µ¥ µµ¿òÀ» ÁÖ°íÀÚ ÇÑ´Ù. ¸Þ¸ð¸® °ü·Ã ¹ö±×´Â Àâ±â Èûµé°í, °æÇ踹Àº ÇÁ·Î±×·¡¸Óµéµµ ¸Þ¸ð¸® °ü·Ã ¹®Á¦¸¦ °íÄ¡´Â µ¥´Â ¸çÄ¥¿¡¼­ ¸îÁÖ°¡ °É¸°´Ù. ¸Þ¸ð¸® ¹ö±×´Â ¸î´Þµ¿¾È ÄÚµå ¼Ó¿¡ ¼û¾î¼­ °©ÀÛ½º·± ÇÁ·Î±×·¥ Á¤Áö¸¦ ÀÏÀ¸Å³ ¼ö ÀÖ´Ù. char * ¿Í C/C++¿¡¼­ÀÇ Æ÷ÀÎÅÍ »ç¿ëÀ¸·Î ÀÎÇÑ ¸Þ¸ð¸® ¹ö±×´Â µð¹ö±ë°ú ÇÁ·Î±×·¥ Á¤Áö·Î ÀÎÇØ ¸Å³â 20¾ï ´Þ·¯¿¡ ÇØ´çÇÏ´Â ½Ã°£ÀÇ ¼Ò¸ð¸¦ ÀÏÀ¸Å²´Ù. ¸¸¾à C++¿¡¼­ char * °ú Æ÷ÀÎÅÍ ¸¦ »ç¿ëÇÑ´Ù¸é, ±×¸®°í ƯÈ÷ ÇÁ·Î±×·¥ÀÇ Å©±â°¡ 10,000 ÁÙÀÌ ³Ñ¾î°¡´Â »óȲÀ̶ó¸é, ¸Å¿ì Èûµç ÀÏÀÌ µÉ °ÍÀÌ´Ù.

µû¶ó¼­, ¾Æ·¡ÀÇ °ÍµéÀÌ C-style¿¡¼­ÀÇ ¹®Á¦Á¡À» ±Øº¹Çϱâ À§ÇØ Á¦¾ÈµÇ¾ú´Ù. ¾Õ¿¡ ³ª¿Ã ¼ö·Ï ´õ ÁÁÀº °ÍÀÌ´Ù.

  1. Æ÷ÀÎÅÍ ´ë½Å ·¹ÆÛ·±½º¸¦ »ç¿ëÇÑ´Ù.

  2. (ÀÌ HOWTO¿¡ ÁÖ¾îÁø) Java Çü½ÄÀÇ class¸¦ »ç¿ëÇϰųª, C++ Ç¥ÁضóÀ̺귯¸®ÀÇ string class¸¦ »ç¿ëÇÑ´Ù.

  3. C++¿¡¼­ÀÇ ¹®ÀÚ Æ÷ÀÎÅÍ(char *) »ç¿ëÀº String class¸¦ »ç¿ëÇÏÁö ¸øÇÒ ¶§·Î ±× »ç¿ëÀ» Á¦ÇÑÇÑ´Ù.

  4. ¸¸¾à C++¿¡¼­ÀÇ ¹®ÀÚ Æ÷ÀÎÅÍ(char *)¸¦ »ç¿ëÇÏ°í ½ÍÁö ¾ÊÀ» ¶§´Â, extern ¿¬°è¸¦ ÀÌ¿ëÇÏ´Â (char *)¸¦.

"CÀÇ char *"¸¦ »ç¿ëÇϱâ À§Çؼ­´Â, C ÇÁ·Î±×·¥À» ´Ù¸¥ ÆÄÀÏ¿¡ ³Ö°í, ¿¬°è¸í½Ã ¹® extern "C" ¸¦ ÀÌ¿ëÇÏ¿© C++ ÇÁ·Î±×·¥¿¡ ¸µÅ©ÇÑ´Ù -

extern "C" {
#include <some_c_header.h>
}

extern "C" {
    comp();
    some_c_function();
}

extern "C" ´Â ¿¬°è ¸í½ÃÀ̰í, ¾ç Áß°ýÈ£·Î µÑ·¯½ÎÀÎ ºí·Ï¾ÈÀÇ ¸ðµç ³»¿ëÀÌ C++ÀÌ ¾Æ´Ñ CÀÇ ¿¬°è ¹æ¹ýÀ» »ç¿ëÇÑ´Ù´Â ¸»ÀÌ´Ù.

'String Ŭ·¡½º'´Â ¸Þ¸ð¸® ÇÒ´ç°ú ÇØÁ¦¸¦ À§ÇØ »ý¼ºÀÚ¿Í ÆÄ±«ÀÚ¸¦ ÀÌ¿ëÇϰí, ltrim, substring µîµî°ú °°Àº ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.

¶ÇÇÑ °ü·ÃµÈ 7절 ¸¦ »ç¿ëÇÏ´Â C++ ÄÄÆÄÀÏ·¯¿¡¼­ ã¾Æº¸¾Æ¶ó. string Ŭ·¡½º´Â Ç¥ÁØ C++ ¶óÀ̺귯¸®ÀÇ ÀϺÎÀ̰í, ¿©·¯°¡Áö ¹®ÀÚ¿­ °ü·Ã ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù.

C++ 'string Ŭ·¡½º' ¿Í 'String Ŭ·¡½º' ¶óÀ̺귯¸®°¡ ¸¹Àº ¹®ÀÚ¿­ ÇÔ¼ö¸¦ Á¦°øÇϱ⠶§¹®¿¡, Á÷Á¢ ¹®ÀÚ¿­ ÇÔ¼ö¸¦ ¾²±â À§ÇØ ¹®ÀÚ Æ÷ÀÎÅ͸¦ »ç¿ëÇÒ Çʿ伺ÀÌ °ÅÀÇ ¾ø´Ù. ¶ÇÇÑ, C++ ÇÁ·Î±×·¡¸Ó´Â Ç×»ó 'malloc'À̳ª 'free'´ë½Å 'new', 'delete'¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

µÎ ¹®ÀÚ¿­ Ŭ·¡½º´Â char * ³ª char []°¡ ÇÒ ¼ö ÀÖ´Â ¸ðµç ÀÏÀ» ÇÒ ¼ö ÀÖ´Ù. ±×¸®°í ´õ ÁÁÀº Á¡Àº ¸Þ¸ð¸® ¹®Á¦³ª ¸Þ¸ð¸® ÇÒ´ç¿¡ ´ëÇØ ÀüÇô °ÆÁ¤ÇÒ Çʿ䰡 ¾ø´Ù´Â °ÍÀÌ´Ù.


2. ÃßõÇÒ¸¸ÇÑ C++ ÄÄÆÄÀÏ·¯

ISO¿Í ANSI¿¡ ÀÇÇØ äÅÃµÈ ÇöÀçÀÇ C++ Ç¥ÁØÀº 1997³â¿¡ óÀ½ ¿Ï¼ºµÇ¾ú´Ù. ¾ÆÁ÷ ¸ðµç ÄÄÆÄÀÏ·¯°¡ À̸¦ µû¸£°í ÀÖÁö ¾Ê°í, ¸ðµç Ư¡µéÀÌ ´Ù Áö¿øµÇÁö´Â ¾Ê´Â ´Ù´Â °ÍÀÌ´Ù. - Ç¥ÁØ¿¡ ¸Â´Â ÄÄÆÄÀÏ·¯¸¦ ¾²´Â °ÍÀº ¸Å¿ì Áß¿äÇÏ´Ù.


2.1. MS Windows 2000/NT/95/98/ME/XP¸¦ À§ÇÑ ÄÄÆÄÀÏ·¯

MS Windows´Â C++°³¹ß·Î ²Ï À¯¸íÇϱ⠶§¹®¿¡, ÀÌ ¹®¼­¿¡ ÁÖ¾îÁø String class ¶óÀ̺귯°¡ Àß ÀÛµ¿Çϰí, Windows XP/2000/NT/95/98/ME µî ¸ðµç ¹öÀü¿¡¼­ Àß ÀÛµ¿ÇÑ´Ù. MS Windows¸¦ À§ÇÑ C++ ÄÄÆÄÀÏ·¯ :

ÀÌ ¹®¼­ÀÇ String Ŭ·¡½º´Â À§¿¡ ¾ð±ÞµÈ ¸ðµç ÄÄÆÄÀÏ·¯·Î Å×½ºÆ® µÇ¾ú°í, MS Visual C++ v6.0, Borland C++ v5.2, Borland C++ v5.5.1, Bloodshed ÄÄÆÄÀÏ·¯¿¡¼­ Àß µ¿ÀÛÇÑ´Ù.


2.2. UNIX¿Í ±âŸ UNIX-like ½Ã½ºÅÛµéÀÇ ÄÄÆÄÀÏ·¯

GNU ¼¼°è¿¡¼­´Â GCC(GNU Compiler Collection)¸¦ »ç¿ëÇÏ´Â °ÍÀÌ °¡Àå ÁÁÀº ¼±ÅÃÀÌ´Ù. GCC´Â ´ëºÎºÐÀÇ ¸®´ª½º ¹èÆ÷ÆÇ, FreeBSD, ±âŸ Unix Ŭ·Ðµé¿¡ µé¾îÀÖ´Ù. GCC ȨÆäÀÌÁö´Â http://gcc.gnu.orgÀÌ´Ù. ÃֽŹöÀüÀÇ GCC(3.0)Àº °¡Àå Ç¥ÁØÀ» Àß ÁؼöÇÑ ÄÄÆÄÀÏ·¯ Áß ÇϳªÀÌ´Ù.


3. ¿©·¯°¡Áö ¹®ÀÚ¿­°ü·Ã class

¹®ÀÚ¿­ class´Â ÇÁ·Î±×·¡¹Ö¿¡¼­ °¡Àå Áß¿äÇÑ °Íµé Áß ÇϳªÀ̰í, ¹®ÀÚ¿­ Á¶Á¤À» À§ÇØ ¸Å¿ì ¸¹ÀÌ ¾²ÀδÙ. ¹®ÀÚ¿­ class´Â ¿©·¯°¡Áö°¡ ÀÖ°í, ¹°·Ð À̵éÀ» »ó¼Ó¹ÞÀ½À¸·Î½á ÀڽŸ¸ÀÇ ¹®ÀÚ¿­ class¸¦ ¸¸µé ¼öµµ ÀÖ´Ù.


3.1. Multiple Inheritance - ÀڽŸ¸ÀÇ ¹®ÀÚ¿­ class ¸¸µé±â

À§¿¡ ¸»ÇÑ °Í °°ÀÌ, Çϳª ȤÀº ¿©·¯ class¸¦ »ó¼Ó¹Þ¾Æ ÀڽŸ¸ÀÇ ¹®ÀÚ¿­ class¸¦ ¸¸µé ¼öµµ ÀÖ´Ù. ¿©±â¼­´Â Ç¥ÁØ C++ ¶óÀ̺귯¸®ÀÇ string class¿Í ºÎ·Ï AÀÇ String class ¸¦ »ó¼Ó¹ÞÀ½À¸·Î½á ´ÙÁß»ó¼ÓÀ» ÀÌ¿ëÇÑ ¹®ÀÚ¿­ class¸¦ ¸¸µé¾î º¼ °ÍÀÌ´Ù.

¿ì¼± ¿¹Á¦ ÆÄÀÏ 'string_multi.h'¸¦ 23절 ¿¡¼­ ´Ù¿î·Îµå ¹Þ¾Æ¶ó.

ÀÌ ÆÄÀÏÀº ´ÙÀ½°ú °°´Ù :

// ******************************************************************
// String class¿Í Ç¥ÁØ ¶óÀ̺귯¸®ÀÇ "string" class¸¦ »ó¼Ó¹ÞÀ½À¸·Î½á
// Á÷Á¢ ¹®ÀÚ¿­ class¸¦ ¸¸µé¾îº¸´Â ¿¹½Ã¸¦ À§ÇÑ ÇÁ·Î±×·¥
// ******************************************************************

#ifndef __STRING_MULTI_H_ALDEV_
#define __STRING_MULTI_H_ALDEV_

#include <string>
#include "String.h"
#include "StringBuffer.h"

#ifdef NOT_MSWINDOWS
#else
using namespace std;  // MS Visual C++ compiler Version 6.0 ¿¡¼­ ÇÊ¿äÇÔ.
#endif

// Áß¿ä! : C++¿¡¼­´Â »ý¼ºÀÚ, ÆÄ±«ÀÚ, º¹»ç ¿¬»êÀÚ°¡ °°ÀÌ »ó¼ÓµÇÁö ¾Ê´Â´Ù.
//	µû¶ó¼­ ¸¸¾à =, + µîÀÇ ¿¬»êÀÚ°¡ base class¿¡ Á¤ÀǵǾî ÀÖ°í, base
//	classÀÇ »ý¼ºÀÚ¸¦ ÀÌ¿ëÇÑ´Ù¸é, ¹Ýµå½Ã °°Àº ¿ªÇÒÀ» ÇÏ´Â »ý¼ºÀÚ¸¦
//	»ó¼Ó¹Þ´Â class¿¡µµ ¸¸µé¾îÁÖ¾î¾ß ÇÑ´Ù.
//	¾Æ·¡¿¡ ÁÖ¾îÁø mystring(), mystring(char [])¸¦ º¸¾Æ¶ó.
//
//	¶ÇÇÑ atmpstrÀÌ mystringÀ¸·Î ¼±¾ðµÇ¾ú´Ù°í ÇÒ ¶§, atmpstr + mstr 
//	°ú °°ÀÌ ¿¬»êÀÚ¸¦ ¾µ ¶§, ½ÇÁ¦·Î ºÒ¸®´Â °ÍÀº atmpstr.operator+(mstr)ÀÌ´Ù. 

class mystring:public String, string
{
	public:
		mystring():String() {}  // =, + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿äÇÏ´Ù
		mystring(char bb[]):String(bb) {}  // =, + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿äÇÏ´Ù

		mystring(char bb[], int start, int slength):String(bb, start, slength) {}
		mystring(int bb):String(bb) {}  // + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿äÇÏ´Ù
		mystring(unsigned long bb):String(bb) {}  // + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿äÇÏ´Ù
		mystring(long bb):String(bb) {}  // + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿äÇÏ´Ù
		mystring(float bb):String(bb) {}  // + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿äÇÏ´Ù
		mystring(double bb):String(bb) {}  // + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿äÇÏ´Ù
		mystring(const String & rhs):String(rhs) {}  // + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿äÇÑ Copy Constructor
		mystring(StringBuffer sb):String(sb) {}  // Java¿ÍÀÇ È£È¯À» À§ÇØ
		mystring(int bb, bool dummy):String(bb, dummy) {}  // StringBuffer class¸¦ À§ÇØ

		int mystraa; // mystringÀÇ ÃÖÀûÈ­
	private:
		int mystrbb; // mystringÀÇ ÃÖÀûÈ­
};

#endif // __STRING_MULTI_H_ALDEV_


4. String class ´Ù¿î¹Þ±â

¸ðµç ÇÁ·Î±×·¥°ú ¿¹Á¦´Â ÀÌ ¹®¼­ÀÇ ºÎ·Ï¿¡ ÁÖ¾îÁø´Ù. String class¿Í ¶óÀ̺귯¸®, ¿¹Á¦ ÇÁ·Î±×·¥À» ÇϳªÀÇ tar zip ¾ÐÃàÆÄÀÏ·Î ¹­¾î³õÀº ¸µÅ©°¡ ´ÙÀ½°ú °°´Ù.


4.1. ¾î¶»°Ô ÀúÀÚÀÇ String class¸¦ ¹ÏÀ» ¼ö ÀÖ³ª?

Ȥ String class¸¦ ¹ÏÀ» ¼ö ¾øÀ» ¼öµµ ÀÖ´Ù. À̸¦ ÇØ°áÇϱâ À§ÇØ, ÀúÀÚÀÇ String class¸¦ °ËÁõÇÒ °úÇÐÀûÀÎ ¹æ¹ýÀÌ ÀÖ´Ù. Çö´ë ÄÄÇ»ÅÍ °øÇÐÀÚµéÀº ¼ÒÇÁÆ®¿þ¾î¸¦ °ËÁõÇϱâ À§ÇØ ¸Ó¸®°¡ ¾Æ´Ñ CPU¸¦ ¾´´Ù. »ç¶÷ÀÇ ¸Ó¸®´Â ³Ê¹« ´À¸®±â ¶§¹®¿¡ Å×½ºÆ®¿Í °ËÁõÀ» À§Çؼ­´Â ÄÄÇ»ÅÍÀÇ ÈûÀ» ºô¸®´Â °ÍÀÌ ÁÁ´Ù.

ÇÁ·Î±×·¥ example_String.cpp À¸·Î °¡¼­ 'Source code for C++' ¸¦ ¼±ÅÃÇØ¶ó. ( ºÎ·Ï A ¿¡µµ ÁÖ¾îÁø´Ù. 23절 ) À§ ÇÁ·Î±×·¥Àº ¼ö¹é¸¸¹øÀÇ Å×½ºÆ®¸¦ ÀÚµ¿À¸·Î ÇÒ ¼ö ÀÖ´Â Å×½ºÆ® ¸ðµâÀ» °®°í ÀÖ´Ù. String class¿¡ ÀÌ Å×½ºÆ®¸¦ ÇØº»´Ù¸é, String class°¡ °ß°íÇÏ°í ¿Ïº®ÇÑ ÇÁ·Î±×·¥ÀÓÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

Á÷Á¢ 50000¹Ýº¹À¸·Î Å×½ºÆ® ÇØº¸¾Ò´õ´Ï ¿À·ù¾øÀÌ Àß µ¿ÀÛÇÏ¿´´Ù. ¶ÇÇÑ, ¾î¶°ÇÑ ¸Þ¸ð¸® ¸¯µµ ¹ß°ßÇÒ ¼ö ¾ø¾ú´Ù. Å×½ºÆ®´Â ¸®´ª½º¿¡¼­ /usr/bin/gtop, UNIX top ¸í·É¾î, KDEStart->System->KDE System Guard and KDEStart->System->Process management µîÀ» »ç¿ëÇÏ¿© cpu¿Í ¸Þ¸ð¸®¸¦ üũÇϸç ÀÌ·ç¾îÁ³´Ù.

³ª´Â ¹Ýº¹È½¼ö ¸¦ õ¸¸¹øÀ̳ª ±× ÀÌ»óÀ¸·Î ³õ°í Å×½ºÆ® ÇØº¸±â¸¦ ÃßõÇÑ´Ù. ¹Ýº¹È½¼ö°¡ Ŭ¼ö·Ï ½Å·Ú¼ºÀº ´õ¿í ³ô¾ÆÁú °ÍÀÌ´Ù!! Å×½ºÆ®¸¦ µ¹·Á³õ°í ¹äÀ» ¸ÔÀ¸·¯ ´Ù³à¿À¸é °á°ú¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù!!


5. String class »ç¿ëÇϱâ

ÀÌ String class´Â Ç¥ÁØ C++ ¶óÀ̺귯¸®ÀÇ string class¿Í ´Ù¸£´Ù´Âµ¥ ÁÖÀÇÇ϶ó. ÀÌ Æ¯º°ÇÑ String class´Â Á÷Á¢ ¸¸µé¾îÁø °ÍÀ̰í, Java ÇÁ·Î±×·¡¸ÓµéÀÌ C++À» ½±°Ô »ç¿ëÇϵµ·Ï Çϱâ À§ÇØ ¸¸µé¾îÁ³´Ù. ¸¸¾à ´ç½ÅÀÌ C++°ú ´õ Àͼ÷ÇÏ´Ù¸é Ç¥ÁØ C++ ¶óÀ̺귯¸®¿¡ Á¦°øµÇ´Â ÁøÂ¥ string class ¸¦ »ç¿ë ÇÏ´Â °ÍÀÌ ÁÁ´Ù.

String class¸¦ »ç¿ëÇϱâ À§ÇØ, 23절ÀÇ "example_String.cpp" ¿¹Á¦ ÇÁ·Î±×·¥°ú 23절ÀÇ String class¸¦ º¸¾Æ¶ó.

'String class' ´Â char¿Í char * ŸÀÔÀ» ¿Ïº®ÇÏ°Ô ´ë½ÅÇÒ ¼ö ÀÖ´Ù. 'String class'¸¦ char ó·³ »ç¿ëÇÒ ¼öµµ ÀÖ°í, ¿©·¯°¡Áö ´Ù¾çÇÑ ±â´Éµµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. 23절 ¿¡ ÁÖ¾îÁø makefile¿¡¼­ ¸¸µé¾îÁö´Â 'libString.a'¸¦ ¸µÅ©ÇؾßÇϰí, C++ ¶óÀ̺귯¸®°¡ À§Ä¡ÇÑ ¸ðµç °÷ÀÇ ¶óÀ̺귯¸®¸¦ /usr/lib ³ª /lib µð·ºÅ丮¿¡ ¶óÀ̺귯¸®¸¦ º¹»çÇØ³Ö¾î¾ß ÇÑ´Ù. 'libString.a'¸¦ »ç¿ëÇϱâ À§Çؼ­´Â, ´ÙÀ½°ú °°ÀÌ ÄÄÆÄÀÏÇ϶ó.

	g++ example.cpp -lString
´ÙÀ½¿¡ ÁÖ¾îÁø ¿¹Á¦ Äڵ带 º¸¶ó.
	String aa;

	aa = "Creating an Universe is very easy, similar to creating a baby human.";

	// ÇÁ·Î±×·¥¿¡¼­ aa.val()À» 'char *' °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
	for (unsigned long tmpii = 0; tmpii < aa.length(); tmpii++)
	{
		//fprintf(stdout, "aa.val()[%ld]=%c ", tmpii, aa.val()[tmpii]);
		fprintf(stdout, "aa[%ld]=%c ", tmpii, aa[tmpii]);
	}

	// ½ÇÁ¦·Î 'char *'·Î »ç¿ëÇϸé..
	for (char *tmpcc = aa.val(); *tmpcc != 0; tmpcc++)  
	{
		fprintf(stdout, "aa.val()=%c ", *tmpcc);
	}


5.1. ¿¬»êÀÚ

'String class' ´Â ¾Æ·¡¿Í °°Àº ¿¬»êÀÚ¸¦ Á¦°øÇÑ´Ù :-

  • Equal to ==

  • Not equal to !=

  • Assignment =

  • Add to itself and Assignment +=

  • String concatenation or addition +

¿¬»êÀÚ¸¦ »ç¿ëÇÏ´Â ¿¹Á¦¸¦ º¸ÀÚ.
	String aa;
	String bb("Bill Clinton");

	aa = "put some value string";  // assignment operator
	aa += "add some more"; // Add to itself and assign operator
	aa = "My name is" + " Alavoor Vasudevan "; // string cat operator

	if (bb == "Bill Clinton")  // boolean equal to operator
		cout << "bb is equal to 'Bill Clinton' " << endl;

	if (bb != "Al Gore")   // boolean 'not equal' to operator
		cout << "bb is not equal to 'Al Gore'" << endl;


5.2. ÇÔ¼ö

String class¿¡¼­ Á¦°øµÇ´Â ÇÔ¼öµéÀº Java ÀÇ String class¿Í °°Àº À̸§À» °®´Â´Ù. ÇÔ¼ö À̸§°ú µ¿ÀÛÀº JavaÀÇ String class¿Í ¿ÏÀüÈ÷¶È°°´Ù. StringBuffer class¿ª½Ã Á¦°øµÈ´Ù. À̵éÀº Java¿Í C++°£ÀÇ Æ÷ÆÃÀ» ½±°Ô ÇÒ °ÍÀÌ´Ù (Àß¶ó³»±â & ºÙ¿©³Ö±â¿Í ÃÖ¼ÒÇÑÀÇ ÄÚµå Á¶Á¤ ¸¸À» ÇÊ¿ä·Î ÇÒ °ÍÀÌ´Ù). JavaÀÇ ÇÔ¼ö¿¡ µé¾îÀÖ´Â Äڵ带 C++ÀÇ ¸â¹öÇÔ¼ö·Î º¹»çÇϱ⸸ ÇÏ¸é µÉ °ÍÀ̰í, ÃÖ¼ÒÇÑÀÇ º¯°æ¸¸À¸·Îµµ C++¿¡¼­ Àß ÄÄÆÄÀÏ µÉ °ÍÀÌ´Ù. ¶Ç´Ù¸¥ ÀÌÁ¡Àº Java¿Í C++À» ¸ðµÎ »ç¿ëÇÏ´Â °³¹ßÀÚµéÀÌ µÑ °£ÀÇ ¹®¹ýÀ̳ª ÇÔ¼ö À̸§À» µû·Îµû·Î ±â¾ïÇÒ Çʿ䰡 ¾ø¾îÁø´Ù´Â °ÍÀÌ´Ù.

¿¹¸¦µé¾î integer¸¦ ¹®ÀÚ¿­·Î ¹Ù²Ù´Â °ÍÀ» º¸¸é,

	String	aa;

	aa = 34;  // '=' ¿¬»êÀÚ°¡ int¸¦ stringÀ¸·Î ¹Ù²Û´Ù.
	cout << "The value of aa is : " << aa.val() << endl;

	aa = 234.878;  //  '=' ¿¬»êÀÚ°¡ float¸¦ stringÀ¸·Î ¹Ù²Û´Ù.
	cout << "The value of aa is : " << aa.val() << endl;

	aa = 34 + 234.878;
	cout << "The value of aa is : " << aa.val() << endl;
	// Ãâ·ÂÀº '268.878'ÀÏ °ÍÀÌ´Ù.

	// castingÀÌ ÇÊ¿äÇÏ´Ù.
	aa = (String) 34 + " Can create infinite number of universes!! " + 234.878;
	cout << "The value of aa is : " << aa.val() << endl;
	// Ãâ·ÂÀº '34 Can create infinite number of universes!! 234.878'ÀÏ °ÍÀÌ´Ù.

String classÀÇ ÇÔ¼öÀ̸§¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº 23절 ¸¦ Âü°íÇØ¶ó. °°Àº String.hÆÄÀÏÀÌ ´ÙÀ½ ¼½¼Ç¿¡µµ ³ª¿Ã °ÍÀÌ´Ù.


5.3. String classÀÇ À̸§ ¹Ù²Ù±â

5.3.1. Case 1: ´Ü¼øÇÑ À̸§ ¹Ù²Ù±â

¸¸¾à String classÀÇ À̸§ÀÌ ¸¾¿¡ µéÁö ¾Ê´Â´Ù¸é, "typedef" ¸¦ À̸§À» ¹Ù²Ù±â À§ÇØ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

String.h¸¦ includeÇÏ´Â ¸ðµç ÆÄÀÏ¿¡ ´ÙÀ½ÀÇ ³»¿ëÀ» ³Ö¾î¶ó :

// StringÀ̶ó´Â À̸§ÀÌ ¸¾¿¡ µéÁö ¾Ê´Â´Ù¸é, ´ÙÀ½°ú °°ÀÌ ¹Ù²Ù¾î¶ó.
typedef String StringSomethingElseIwant;

// ÀÌÁ¦ ÄÚµå´Â ´ÙÀ½°ú °°ÀÌ µÉ °ÍÀÌ´Ù.
int main()
{
	StringSomethingElseIwant aa_renstr; 
	aa_renstr = "I renamed the String Class using typedef";

	// .....
}
example_String.cpp ¿¡ °¡¼­ 'Source code for C++'À» ¼±ÅÃÇØ¶ó.


5.3.2. Case 2: À̸§ÀÌ °ãÄ¥ ¶§

´Ù¸¥ °°Àº À̸§À» °¡Áø class¿Í À̸§ÀÌ °ãÄ¡´Âµ¥, µÎ class¸¦ ¸ðµÎ »ç¿ëÇÏ°í ½Í´Ù¸é, ´ÙÀ½°ú °°Àº ¹æ¹ýÀ» ½á¶ó. String.h¸¦ includeÇÏ´Â ¸ðµç ÆÄÀÏ¿¡ ´ÙÀ½ÀÇ ³»¿ëÀ» ³Ö¾î¶ó.

#define  String  String_somethingelse_which_I_want
#include "String.h"
#undef String

#include "ConflictingString.h"  // À̰͵µ StringÀ̶õ classÀÌ´Ù.

// ÄÚµå ³»¿ë..
int main()
{
	String_somethingelse_which_I_want aa;
	String bb; // À̰ÍÀº °ãÄ¡´Â String classÀÌ´Ù.

	aa = " some sample string";
	bb = " another string abraka-dabraka";
	.......
}
Àü󸮱Ⱑ ¸ðµç StringÀ» "String_somethingelse_which_I_want" À¸·Î ¹Ù²Ü °ÍÀ̰í, StringÀÇ Á¤ÀǸ¦ ¾ø¾Ù °ÍÀÌ´Ù. undef ´ÙÀ½ ºÎÅÍ´Â "String" class¸¦ Á¤ÀÇÇÏ´Â °ãÄ¡´Â string class header°¡ ¿À°Ô µÈ´Ù.


6. String.h ÆÄÀÏ

C++°ú Java´Â ¸¹Àº ¼ÒÇÁÆ®¿þ¾î ÇÁ·ÎÁ§Æ®¿¡¼­ °°ÀÌ ¾²ÀδÙ. C++°ú Java¸¦ ¿Ô´Ù°¬´ÙÇÏ´Â ÇÁ·Î±×·¡¸Óµé¿¡°Ô´Â ÀÌ ¹®ÀÚ¿­ class°¡ ¸Å¿ì À¯¿ëÇÒ °ÍÀÌ´Ù.

C++ (ȤÀº ´Ù¸¥ °´Ã¼ÁöÇâ ¾ð¾î)¿¡¼­´Â, "class µ¥ÀÌÅͱ¸Á¶"(ȤÀº ÀÎÅÍÆäÀ̽º) ¸¸ ÀÐÀ¸¸é ±× class¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÎÅÍÆäÀ̽º¸¸ ÀÌÇØÇÏ¸é µÇÁö, ÀÎÅÍÆäÀ̽ºÀÇ ±¸Çö±îÁö´Â ¾Ë Çʿ䰡 ¾ø´Â °ÍÀÌ´Ù. String classÀÇ °æ¿ì, String.h ÆÄÀÏ¿¡ ÀÖ´Â String class¸¸ Àаí ÀÌÇØÇÏ¸é µÈ´Ù. String class¸¦ ¾²±â À§ÇØ ±¸Çö(String.cpp)À» ¸ðµÎ ÀÐÀ» ÇÊ¿ä´Â ¾ø´Â °ÍÀÌ´Ù. °´Ã¼ÁöÇâ classµéÀº ½Ã°£À» Àý¾àÇÏ°Ô ÇØÁÖ°í, ±¸ÇöÀÇ ³»¿ëÀ» ±³¹¦ÇÏ°Ô ¼û°ÜÁØ´Ù.

( °´Ã¼ÁöÇâÀÎ Java¿¡µµ ÀÌ¿Í °°Àº ¿ªÇÒÀ» ÇÏ¿© ±¸Çö ³»¿ëÀ» ¼û°ÜÁÖ´Â 'interface' ¶õ °ÍÀÌ ÀÖ´Ù. )

¾Æ·¡ÀÇ ³»¿ëÀº String.h ÆÄÀÏÀ̰í, 23절À» Âü°íÇØ¶ó.

//
// Author : Al Dev  Email: alavoor[AT]yahoo.com
// string class³ª String class¸¦ ½á¶ó.
//
// ¸Þ¸ð¸® ¸¯À» ¸·±â À§ÇØ - ¹®ÀÚ º¯¼ö¸¦ °ü¸®Çϱâ À§ÇÑ ¹®ÀÚ class
// char[]³ª char *º¸´Ù´Â String class³ª string class¸¦ ½á¶ó.
//

#ifndef __STRING_H_ALDEV_
#define __STRING_H_ALDEV_

// ÇÁ·Î±×·¥ÀÌ Ä¿Áú ¼ö·Ï iostreamÀ» »ç¿ëÇÏÁö ¸»¾Æ¶ó.
#ifdef NOT_MSWINDOWS
#include <iostream>
#else
#include <iostream.h> // ÇÏÀ§È£È¯¼ºÀ» À§ÇØ. C++ Ç¥ÁØÀº .h°¡ ¾ø´Ù.
#endif // NOT_MSWINDOWS

#include <stdio.h>   // File°ú sprintf()¸¦ À§ÇØ
//#include <list.h> // list

// MS Windows 95 VC++°ú Borland C++ ÄÄÆÄÀÏ·¯ÀÎ °æ¿ì - 
// d:\program files\CBuilder\include\examples\stdlib\list.cpp ¿Í include\list.h
// À» º¸¶ó.
//#include <list> // for list
//using namespace std;

const short INITIAL_SIZE = 	50;
const short NUMBER_LENGTH = 300;
const int MAX_ISTREAM_SIZE = 2048;

//class StringBuffer;

// ³ª´Â ÀÌ ¹®ÀÚ¿­ class¸¦ Linux (Redhat 7.1)¿Í MS Windows Borland C++ v5.2 (win32) 
// ¿¡¼­ ÄÄÆÄÀÏ / Å×½ºÆ® ÇØº¸¾Ò´Ù.
// ¶ÇÇÑ, MS Visual C++ compiler¿¡¼­µµ ÀÛµ¿ÇÒ °ÍÀÌ´Ù.
class String
{
	public:
		String();
		String(const char bb[]);  // + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿ä
		String(const char bb[], int start, int slength); // ¹®ÀÚµéÀÇ ºÎºÐÁýÇÕ
		String(int bb);  // + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿ä
		String(unsigned long bb);  // + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿ä
		String(long bb);  // + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿ä
		String(float bb);  // + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿ä
		String(double bb);  // + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿ä
		String(const String & rhs);  // + ¿¬»êÀÚ¸¦ À§ÇØ ÇÊ¿äÇÑ copy constructor
		//String(StringBuffer sb);  // Java¿ÍÀÇ È£È¯¼ºÀ» À§ÇØ 
					    // - ±×·¯³ª MS windows¿¡¼­´Â 
					    // ÄÄÆÄÀϵÇÁö ¾Ê°í, core dump¸¦ ÀÏÀ¸Å²´Ù.
		String(int bb, bool dummy);  // StringBuffer class¸¦ À§ÇØ ÇÊ¿ä
		virtual ~String();  // virtual·Î ¼±¾ðÇÏ¿© »ó¼Ó¹ÞÀº classÀÇ ¼Ò¸êÀÚ°¡
				    // ºÒ¸®µµ·Ï ÇÑ´Ù.

		char *val() {return sval;} // svalÀ» publicÀ¸·Î ÇÏ´Â °ÍÀº À§ÇèÇϹǷÎ

		// JavaÀÇ StringÀ» Èä³»³½ ÇÔ¼öµé
		unsigned long length();
		char charAt(int where);
		void getChars(int sourceStart, int sourceEnd, 
				char target[], int targetStart);
		char* toCharArray();
		char* getBytes();

		bool equals(String str2); // == ¿¬»êÀÚ¸¦ ÂüÁ¶Ç϶ó
		bool equals(char *str2); // == ¿¬»êÀÚ¸¦ ÂüÁ¶Ç϶ó
		bool equalsIgnoreCase(String str2);

		bool regionMatches(int startIndex, String str2, 
				int str2StartIndex, int numChars);
		bool regionMatches(bool ignoreCase, int startIndex, 
				String str2, int str2StartIndex, int numChars);

		String toUpperCase();
		String toLowerCase();

		bool startsWith(String str2);
		bool startsWith(char *str2);

		bool endsWith(String str2);
		bool endsWith(char *str2);

		int compareTo(String str2);
		int compareTo(char *str2);
		int compareToIgnoreCase(String str2);
		int compareToIgnoreCase(char *str2);

		int indexOf(char ch, int startIndex = 0);
		int indexOf(char *str2, int startIndex = 0);
		int indexOf(String str2, int startIndex = 0);

		int lastIndexOf(char ch, int startIndex = 0);
		int lastIndexOf(char *str2, int startIndex = 0);
		int lastIndexOf(String str2, int startIndex = 0);

		String substring(int startIndex, int endIndex = 0);
		String replace(char original, char replacement);
		String replace(char *original, char *replacement);

		String trim(); // ¿À¹ö·Îµù µÈ trimÀ» ÂüÁ¶Ç϶ó.

		String concat(String str2);  // + ¿¬»êÀÚ¸¦ ÂüÁ¶
		String concat(char *str2); // + ¿¬»êÀÚ¸¦ ÂüÁ¶
		String concat(int bb);
		String concat(unsigned long bb);
		String concat(float bb);
		String concat(double bb);

		String reverse(); // ¿À¹ö·Îµù µÈ ´Ù¸¥ reverse()¸¦ ÂüÁ¶
		String deleteCharAt(int loc);
		String deleteStr(int startIndex, int endIndex); // JavaÀÇ "delete()"

		String valueOf(char ch)
			{char aa[2]; aa[0]=ch; aa[1]=0; return String(aa);}
		String valueOf(char chars[]){ return String(chars);}
		String valueOf(char chars[], int startIndex, int numChars);
		String valueOf(bool tf)
			{if (tf) return String("true"); else return String("false");}
		String valueOf(int num){ return String(num);}
		String valueOf(long num){ return String(num);}
		String valueOf(float num) {return String(num);}
		String valueOf(double num) {return String(num);}

		// ÀÌ ÆÄÀÏÀÇ ¾Æ·¡¿¡ ÁÖ¾îÁø StringBuffer¸¦ Âü°íÇ϶ó.

		// ---- ¿©±â±îÁö Java¸¦ Èä³»³½ ÇÔ¼öµé  -----

		//////////////////////////////////////////////////////
		// 		Java¿¡´Â ¾ø´Â Ãß°¡ÀûÀÎ ÇÔ¼öµé
		//////////////////////////////////////////////////////
		String ltrim();
		void ltrim(bool dummy); // Á÷Á¢ÀûÀ¸·Î object¸¦ º¯È­½ÃŲ´Ù.
		String rtrim();
		void rtrim(bool dummy); //  Á÷Á¢ÀûÀ¸·Î object¸¦ º¯È­½ÃŲ´Ù.
					// chopall Âü°í.

		void chopall(char ch='\n'); // ¸Ç µÚÀÇ ch¸¦ ¾ø¾Ø´Ù. rtrim Âü°í.
		void chop(); // ¸Ç µÚÀÇ ¹®ÀÚ¸¦ ¾ø¾Ø´Ù.

		void roundf(float input_val, short precision);
		void decompose_float(long *integral, long *fraction); 

		void roundd(double input_val, short precision);
		void decompose_double(long *integral, long *fraction); 

		void explode(char *separator); // token()°ú ¿À¹ö·Îµù µÈ explode()ÂüÁ¶
		String *explode(int & strcount, char separator = ' '); //  token()ÂüÁ¶
		void implode(char *glue);
		void join(char *glue);
		String repeat(char *input, unsigned int multiplier);
		String tr(char *from, char *to); // characterµéÀ» ¹Ù²Û´Ù(translate).
		String center(int padlength, char padchar = ' ');
		String space(int number = 0, char padchar = ' ');
		String xrange(char start, char end);
		String compress(char *list = " ");
		String left(int slength = 0, char padchar = ' ');
		String right(int slength = 0, char padchar = ' ');
		String overlay(char *newstr, int start = 0, int slength = 0, char padchar = ' ');

		String at(char *regx); // regxÀÇ Ã¹¹øÂ° match
		String before(char *regx); // regx ¾ÕÀÇ string
		String after(char *regx); // regx µÚÀÇ string
		String mid(int startIndex = 0, int length = 0);

		bool isNull();  
		bool isInteger();
		bool isInteger(int pos);
		bool isNumeric();
		bool isNumeric(int pos);
		bool isEmpty();  // length() == 0 °ú °°Àº »óÅÂ
		bool isUpperCase();
		bool isUpperCase(int pos);
		bool isLowerCase();
		bool isLowerCase(int pos);
		bool isWhiteSpace();
		bool isWhiteSpace(int pos);
		bool isBlackSpace();
		bool isBlackSpace(int pos);
		bool isAlpha();
		bool isAlpha(int pos);
		bool isAlphaNumeric();
		bool isAlphaNumeric(int pos);
		bool isPunct();
		bool isPunct(int pos);
		bool isPrintable();
		bool isPrintable(int pos);
		bool isHexDigit();
		bool isHexDigit(int pos);
		bool isCntrl();
		bool isCntrl(int pos);
		bool isGraph();
		bool isGraph(int pos);

		void clear();
		int toInteger();
		long parseLong();

		double toDouble();
		String token(char separator = ' '); // StringTokenizer¿Í explode()¸¦ ÂüÁ¶
		String crypt(char *original, char *salt);
		String getline(FILE *infp = stdin); // putline() ÂüÁ¶
		//String getline(fstream *infp = stdin); // putline() ÂüÁ¶

		void putline(FILE *outfp = stdout); // getline() ÂüÁ¶
		//void putline(fstream *outfp = stdout); // getline() ÂüÁ¶

		void swap(String aa, String bb); // aa¸¦ bb·Î ¹Ù²Û´Ù
		String *sort(String aa[]);  // StringÀÇ array¸¦ sortÇÑ´Ù
		String sort(int startIndex = 0, int length = 0);  // string ³»ÀÇ characterµéÀ» sort
		int freq(char ch); // ch°¡ µé¾îÀִ Ƚ¼ö¸¦ ¼¾´Ù
		void Format(const char *fmt, ...);
		String replace (int startIndex, int endIndex, String str);

		void substring(int startIndex, int endIndex, bool dummy); // object¸¦ Á÷Á¢ ¹Ù²Û´Ù
		void reverse(bool dummy); // object¸¦ Á÷Á¢ ¹Ù²Û´Ù
		String deleteCharAt(int loc, bool dummy); // object¸¦ Á÷Á¢ ¹Ù²Û´Ù
		String deleteStr(int startIndex, int endIndex, bool dummy);
		void trim(bool dummy); // object¸¦ Á÷Á¢ ¹Ù²Û´Ù
		String insert(int index, String str2);
		String insert(int index, String str2, bool dummy); // object¸¦ Á÷Á¢ ¹Ù²Û´Ù
		String insert(int index, char ch);
		String insert(int index, char ch, bool dummy); // object¸¦ Á÷Á¢ ¹Ù²Û´Ù
		String insert(char *newstr, int start = 0, int length = 0, char padchar = ' ');

		String dump(); // od -c ¿Í °°ÀÌ stringÀ» dumpÇÑ´Ù.

		// JavaÀÇ StringBuffer¸¦ À§ÇØ ÇÊ¿äÇÑ °Íµé
		void ensureCapacity(int capacity);
		void setLength(int len);
		void setCharAt(int where, char ch); // charAt(), getCharAt() Âü°í

		// JavaÀÇ Integer class, Long, Double class¸¦ À§ÇØ ÇÊ¿ä
		int parseInt(String ss) {return ss.toInteger();}
		int parseInt(char *ss)
			{String tmpstr(ss); return tmpstr.toInteger();}
		long parseLong(String ss) {return ss.parseLong();}
		long parseLong(char *ss)
			{String tmpstr(ss); return tmpstr.parseLong();}
		float floatValue() {return (float) toDouble(); }
		double doubleValue() {return toDouble(); }
		char * number2string(int bb);  // String(int) Âü°í
		char * number2string(long bb);  // String(long) Âü°í
		char * number2string(unsigned long bb);  // String(long) Âü°í
		char * number2string(double bb);  // String(double) Âü°í

		///////////////////////////////////////////////
		// 		°ãÄ¡´Â ÇÔ¼ö À̸§µé
		///////////////////////////////////////////////
		// char * c_str() // val() À» ´ë½Å»ç¿ë
		// bool find();  // regionMatches() ¸¦ ´ë½Å»ç¿ë
		// bool search();  // regionMatches() ¸¦ ´ë½Å»ç¿ë
		// bool matches(); // regionMatches() ¸¦ ´ë½Å»ç¿ë
		// int rindex(String str2, int startIndex = 0); lastIndexOf() À» ´ë½Å»ç¿ë
		// String blanks(int slength);  // repeat() ¸¦ ´ë½Å»ç¿ë
		// String append(String str2); // concat() À̳ª + operator À» ´ë½Å»ç¿ë
		// String prepend(String str2);  // + operatorÀ» ´ë½Å»ç¿ë append()Âü°í
		// String split(char separator = ' ');  // token(), explode() ³ª StringTokenizer class ¸¦ ´ë½Å»ç¿ë
		bool contains(char *str2, int startIndex = 0); // indexOf() ¸¦ ´ë½Å»ç¿ë
		// void empty(); is_empty() ¸¦ ´ë½Å»ç¿ë
		// void vacuum(); clear() ¸¦ ´ë½Å»ç¿ë
		// void erase(); clear() ¸¦ ´ë½Å»ç¿ë
		// void zero(); clear() ¸¦ ´ë½Å»ç¿ë
		// bool is_float(); is_numeric(); À» ´ë½Å»ç¿ë
		// bool is_decimal(); is_numeric(); À» ´ë½Å»ç¿ë
		// bool is_Digit(); is_numeric(); À» ´ë½Å»ç¿ë
		// float float_value(); toDouble(); À» ´ë½Å»ç¿ë
		// float tofloat(); toDouble(); À» ´ë½Å»ç¿ë
		// double double_value(); toDouble(); À» ´ë½Å»ç¿ë
		// double numeric_value(); toDouble(); À» ´ë½Å»ç¿ë
		// int int_value(); toInteger() ¸¦ ´ë½Å»ç¿ë
		// int tonumber(); toInteger() ¸¦ ´ë½Å»ç¿ë
		// String get(); substring() À̳ª val() À» ´ë½Å »ç¿ë. ±×·¯³ª Java ½ºÅ¸ÀÏÀÇ substringÀÌ ´õ ÁÁ´Ù
		// String getFrom(); substring() À̳ª val() À» ´ë½Å »ç¿ë. ±×·¯³ª Java ½ºÅ¸ÀÏÀÇ substringÀÌ ´õ ÁÁ´Ù
		// String head(int len); substring(0, len) À» ´ë½Å»ç¿ë
		// String tail(int len); substring(length()-len, length()) ¸¦ ´ë½Å»ç¿ë
		// String cut(); deleteCharAt() À̳ª deleteStr() À» ´ë½Å»ç¿ë
		// String cutFrom(); deleteCharAt() À̳ª deleteStr() À» ´ë½Å»ç¿ë
		// String paste(); insert() ¸¦ ´ë½Å»ç¿ë
		// String fill(); replace() ¸¦ ´ë½Å»ç¿ë
		// char firstChar(); // substring(0, 1); À» ´ë½Å»ç¿ë
		// char lastChar(); // substring(length()-1, length()); ¸¦ ´ë½Å»ç¿ë
		// String findNext(); token(), explode() À̳ª StringTokenizer class ¸¦ ´ë½Å»ç¿ë

		// begin();  iterator. operator [ii]¸¦ ´ë½Å»ç¿ë
		// end();  iterator. operator [ii]¸¦ ´ë½Å»ç¿ë
		// copy();  assignment =  ¿¬»ê´Ù¸¦ ´ë½Å »ç¿ë, String aa = bb;
		// clone();  assignment =  ¿¬»êÀÚ¸¦ ´ë½Å »ç¿ë, String aa = bb;
		// void putCharAt(int where, char ch); setCharAt() À» ´ë½Å»ç¿ë
		// void replaceCharAt(int where, char ch); setCharAt() À» ´ë½Å»ç¿ë
		// char getCharAt(int where); CharAt() À» ´ë½Å»ç¿ë
		// void parseArgs(int where, char ch); StringTokensizer class, token() À̳ª explode() ¸¦ ´ë½Å»ç¿ë
		// void truncate(); trim(), rtrim(), chop() À̳ª chopall() À» ´ë½Å»ç¿ë
		// ¼ýÀÚ¸¦ stringÀ¸·Î º¯È¯ : notostring(), int2str, long2strÀº number2string()À» »ç¿ë

		// ¿¬»êÀÚµé...
		String operator+ (const String & rhs);
		friend String operator+ (const String & lhs, const String & rhs);

		String& operator+= (const String & rhs); // ·¹ÆÛ·±½º¸¦ ÀÌ¿ëÇÏ¸é ´õ ºü¸¦ °ÍÀÌ´Ù.
		String& operator= (const String & rhs); // ·¹ÆÛ·±½º¸¦ ÀÌ¿ëÇÏ¸é ´õ ºü¸¦ °ÍÀÌ´Ù.
		bool operator== (const String & rhs); // ·¹ÆÛ·±½º¸¦ ÀÌ¿ëÇÏ¸é ´õ ºü¸¦ °ÍÀÌ´Ù.
		bool operator== (const char *rhs);
		bool operator!= (const String & rhs);
		bool operator!= (const char *rhs); 
		char operator [] (unsigned long Index) const;
		char& operator [] (unsigned long Index);
		friend ostream &  operator<< (ostream & Out, const String & str2);
		friend istream &  operator>> (istream & In, String & str2);

		bool String::operator< (const char *rhs) const; // map & vector ¸¦ À§ÇÑ À¯¿ëÇÑ method
		bool String::operator< (const String & rhs) const; // map & vector ¸¦ À§ÇÑ À¯¿ëÇÑ method

		//do later: static	list<String> 		explodeH;  // list head

	protected:
		char *sval; // svalÀ» publicÀ¸·Î ÇÏ´Â °ÍÀº À§ÇèÇÏ´Ù.
		void verifyIndex(unsigned long index) const; // Win32¿¡¼­ÀÇ  warning¶§¹®¿¡ inlineÀÌ ¾Æ´Ï´Ù.
		void verifyIndex(unsigned long index, char *aa) const;// Win32¿¡¼­ÀÇ  warning¶§¹®¿¡ inlineÀÌ ¾Æ´Ï´Ù.

		void _str_cat(char bb[]);
		void _str_cat(int bb);
		void _str_cat(unsigned long bb);
		void _str_cat(float bb);

		void _str_cpy(char bb[]);
		void _str_cpy(int bb); // itoa
		void _str_cpy(unsigned long bb);
		void _str_cpy(float bb); // itof

	private:
		// Note: ¸ðµç private º¯¼ö¿Í ÇÔ¼ö´Â _ (¹ØÁÙ)·Î ½ÃÀÛÇÑ´Ù.
		
		//static String *_global_String; // add ¿¬»ê¿¡¼­ ÇÊ¿ä
		//inline void _free_glob(String **aa);

		bool _equalto(const String & rhs, bool type = false);
		bool _equalto(const char *rhs, bool type = false);
		String *_pString;  // ³»ºÎ¿¡¼­ »ç¿ëÇÏ´Â Àӽà Æ÷ÀÎÅÍ
		char *_pNumber2String;  // ³»ºÎ¿¡¼­ »ç¿ëÇÏ´Â Àӽà Æ÷ÀÎÅÍ
		inline void _allocpString();
		inline void _allocpNumber2String();
		inline void Common2AllCstrs();
		inline void _reverse();
		inline void _deleteCharAt(int loc);
		inline void _deleteStr(int startIndex, int endIndex);
		inline void _trim();
		inline void _ltrim();
		inline void _rtrim();
		inline void _substring(int startIndex, int endIndex);
		void _roundno(double input_dbl, float input_flt, short precision, bool type);
};

// Àü¿ªº¯¼ö´Â String.cpp ¿¡¼­ Á¤ÀǵȴÙ

#endif // __STRING_H_ALDEV_


6.1. StringBuffer.h

C++ °ú Java´Â ¸¹Àº ¼ÒÇÁÆ®¿þ¾î ÇÁ·ÎÁ§Æ®¿¡¼­ µ¿½Ã¿¡ ¾²ÀδÙ. C++°ú Java¸¦ ¿Ô´Ù°¬´ÙÇÏ´Â ÇÁ·Î±×·¡¸Ó¿¡°Ô ÀÌ stringbuffer class´Â ¸Å¿ì À¯¿ëÇÒ °ÍÀÌ´Ù.

//
// Author : Al Dev  Email: alavoor[AT]yahoo.com
//

#ifndef __STRINGBUFFER_H_ALDEV_
#define __STRINGBUFFER_H_ALDEV_

// JavaÀÇ StringBuffer ¸¦ ¸ð¹æÇÑ °Í
// ÀÌ class´Â JavaÀÇ code¸¦ ÃÖ¼ÒÇÑÀÇ ¼öÁ¤¸¸À¸·Îµµ
// C++¿¡¼­ µ¿ÀÛÇϵµ·Ï Çϱâ À§ÇØ ¸¸µé¾îÁ³´Ù.
// Note: C++·Î ÄÚµùÇÏ´Â µ¿¾ÈÀº ÀÌ StringBuffer
// class¸¦ *¾²Áö ¸»¾Æ¶ó*.
// ÀÌ class´Â ¿ÀÁ÷ Java Äڵ带 cut/pasteÇÏ´Â °æ¿ì¸¦
// À§Çؼ­ ¾²¿©Áø °ÍÀÌ´Ù.
class StringBuffer: public String
{
	public:
		StringBuffer();
		~StringBuffer();
		StringBuffer(char *aa);
		StringBuffer(int size);
		StringBuffer(String str);

		int capacity();
		StringBuffer append(String str2);
			// operator + ÂüÁ¶
			//{ *this += str2; return *this;} // ÀÌ code´Â core dump¸¦ ÀÏÀ¸Å²´Ù

		StringBuffer append(char *str2);
		StringBuffer append(int bb);
		StringBuffer append(unsigned long bb) ;
		StringBuffer append(float bb) ;
		StringBuffer append(double bb) ;

		StringBuffer insert(int index, String str2);
		StringBuffer insert(int index, char ch);

		StringBuffer reverse();

		// JavaÀÇ "delete()"¿¡ ÇØ´ç. (delete´Â C++ÀÇ keywordÀ̹ǷΠ»ç¿ëÇÏÁö ¸øÇÑ´Ù)
		StringBuffer deleteStr(int startIndex, int endIndex);
		StringBuffer deleteCharAt(int loc);

		StringBuffer substring(int startIndex, int endIndex = 0);
		void assign(char *str);

	private:
		StringBuffer *_pStringBuffer;
		inline void allocpStringBuffer();
		inline void Common2AllCstrs();
};

#endif // __STRINGBUFFER_H_ALDEV_


6.2. StringTokenizer.h

C++ °ú Java´Â ¸¹Àº ¼ÒÇÁÆ®¿þ¾î ÇÁ·ÎÁ§Æ®¿¡¼­ µ¿½Ã¿¡ ¾²ÀδÙ. C++°ú Java¸¦ ¿Ô´Ù°¬´ÙÇÏ´Â ÇÁ·Î±×·¡¸Ó¿¡°Ô ÀÌ stringtokenizer class´Â ¸Å¿ì À¯¿ëÇÒ °ÍÀÌ´Ù.

//
// Author : Al Dev  Email: alavoor[AT]yahoo.com
//

#ifndef __STRINGTOKENIZER_H_ALDEV_
#define __STRINGTOKENIZER_H_ALDEV_

// JavaÀÇ StringBuffer ¸¦ ¸ð¹æÇÑ °Í
// JavaÀÇ Äڵ带 C++¿¡¼­ ȤÀº ±× ¹Ý´ë·Î ÄÄÆÄÀÏÇÏ´Â °ÍÀÌ
// °¡´ÉÇÏ°Ô ¸¸µé¾îÁ³´Ù.
class StringTokenizer: public String
{
	public:
		StringTokenizer(String str);
		StringTokenizer(String str, String delimiters);
		StringTokenizer(String str, String delimiters, bool delimAsToken);
		~StringTokenizer();

		int 	countTokens();
		bool 	hasMoreElements();
		bool 	hasMoreTokens();
		String 	nextElement(); // Java¿¡¼­´Â "Object"typeÀ» returnÇÑ´Ù.
		String 	nextToken();
		String 	nextToken(String delimiters);
	private:
		int		CurrentPosition; // ÇöÀç string¿¡¼­ÀÇ index
		int		TotalTokens;
		int		RemainingTokens;
		char *	ListOfDl; // delimiters(±¸ºÐÀÚ)µéÀÇ list
		char * 	WorkStr; // Àӽà ÀÛ¾÷ string
		char * 	OrigStr; // Áö³ª¿Â original string
		bool  	DlFlag;  // ±¸ºÐÀÚÀÎÁö¸¦ ³ªÅ¸³»´Â flag
		inline 	void vPrepWorkStr(char *delimiters = NULL);
};

#endif // __STRINGTOKENIZER_H_ALDEV_


7. Ç¥ÁØ C++ ¶óÀ̺귯¸® string class

À§¿¡ ¾ð±ÞµÈ String class (S°¡ ´ë¹®ÀÚÀÎ °Í¿¡ ÁÖÀÇ!)´Â Java¸¦ »ç¿ëÇÏ´Â »ç¶÷µéÀ» À§ÇÑ °ÍÀÎ ¹Ý¸é, Ç¥ÁØ C++ ¶óÀ̺귯¸®¿¡¼­ Á¦°øµÇ´Â "ÁøÂ¥" string class¸¦ ÁÖ¸ñÇÒ Çʿ䰡 ÀÖ´Ù.

string class´Â C¿¡¼­ÀÇ °¡Àå Å« ¹®Á¦Á¡ Áß ÇϳªÀÎ ¹®Àڹ迭ÀÇ ´ÜÁ¡À» ±Øº¹Çϱâ À§ÇØ ¸¸µé¾îÁ³´Ù. ¹®Àڹ迭ÀÌ ¹«Ã´ ºü¸£±ä ÇÏÁö¸¸, ¸¹Àº ´ÜÁ¡À» °®°í ÀÖ´Ù. ¹®Àڹ迭Àº ¸¹Àº ¹ö±×ÀÇ ¿øÀÎÀ̰í, À̸¦ parsingÇÏ´Â ÀÏÀº ±²ÀåÈ÷ ±ÍÂúÀº ÀÏÀÌ´Ù.

string class´Â ¹®ÀÚ¿­À» ÆÄ½ÌÇϰí, Á¶Á¤Çϴµ¥ ÇÊ¿äÇÑ ÁÁÀº ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇϰí, STL°úµµ ȣȯ°¡´ÉÇÏ´Ù. Áï, ¸ðµç STLÀÇ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦·Î ¹®ÀÚ¿­Àº vector<char> ( ¹®ÀÚµéÀ» À§ÇÑ container ȤÀº Áøº¸µÈ ¹®Àڹ迭 ) ·Î Ãë±ÞµÉ ¼ö ÀÖ´Ù.

´ÙÀ½ÀÇ »çÀÌÆ®¿¡¼­ Âü°íÇÒ¸¸ÇÑ °ÍµéÀ» ¾òÀ» ¼ö ÀÖ´Ù:


7.1. ¿¹Á¦·Î »ìÆìº¸´Â string

stringÀ» ¸¸µå´Â °ÍÀº ½±´Ù. Creating a string is easy:

#include <string>
#include <iostream>

using namespace std;

int main()
{
    string str("Hello World!"); // ȤÀº string str = "Hello World!";
    cout << str << endl;
}

ÀÌ ÄÚµå´Â "str'¶õ stringÀ» ¸¸µé°í, "Hello World!' ¶ó´Â ³»¿ëÀ» ³ÖÀ» °ÍÀÌ´Ù. ±×¸®°í coutÀ» »ç¿ëÇÏ¿© Ç¥ÁØÃâ·Â(stdout)À¸·Î Ãâ·ÂÇÒ °ÍÀÌ´Ù.

(ÀÌÁ¦ºÎÅÍ ¸ðµç Çì´õ¿Í namespace °ü·ÃºÎºÐÀº »ý·«ÇÒ °ÍÀÌ´Ù.)

¹®ÀÚ¿­ÀÇ ºÎºÐÀ» ±¸ÇÏ´Â °Í ¿ª½Ã ½±´Ù :

string str("Hello Universe!");
string start = str.substr(0, 5);
string end = str.substr(5);

¿©±â¼­´Â ù 6±ÛÀÚ¸¦ string "start"¿¡, ³ª¸ÓÁö´Â "end"¿¡ µé¾î°¥ °ÍÀÌ´Ù.

¹®ÀÚ¿­ÀÇ ±æÀ̸¦ ¾ò±â À§Çؼ­´Â, ¾Æ·¡¿Í °°ÀÌ ÇÏ¸é µÈ´Ù.

string str("How long is this string?");
cout << "Length of string is: " << str.size() << endl;

ȤÀº ÀÌ¿Í Á¤È®È÷ ¶È°°Àº ¿ªÇÒÀ» ÇÏ´Â length() ¸¦ ½áµµ µÈ´Ù.


7.2. ¹®ÀÚ¿­À» ã±â

¹®ÀÚ¿­À» ã´Â °ÍÀº ¹®Àڹ迭º¸´Ù ÈξÀ ½±´Ù. string class´Â ¹®ÀÚ¿­À» ã´Âµ¥ È¿À²ÀûÀÎ ¸â¹ö ÇÔ¼öµéÀ» Á¦°øÇÑ´Ù. ¸ðµç ¸â¹öÇÔ¼ö´Â string::size_type À» returnÇÑ´Ù.

표 1. ¹®ÀÚ¿­ °Ë»ö ¸â¹ö ÇÔ¼ö

¸â¹ö ÇÔ¼öÀÛµ¿ 
find() ÁÖ¾îÁø ºÎºÐ¹®ÀÚ¿­ÀÌ Ã³À½À¸·Î ³ªÅ¸³ª´Â °÷À» ã´Â´Ù 
find_first_of() find()¿Í °°À¸³ª ÁÖ¾îÁø ¹®ÀÚ°¡ óÀ½À¸·Î ³ªÅ¸³ª´Â À§Ä¡¸¦ ã´Â´Ù 
find_last_of() find first of()¿Í °°À¸³ª, ÁÖ¾îÁø ¹®ÀÚ°¡ ¸¶Áö¸·À¸·Î ³ªÅ¸³ª´Â À§Ä¡¸¦ ã´Â´Ù 
find_first_not_of() find first of() °ú °°À¸³ª ÁÖ¾îÁø ¹®ÀÚ°¡ ¾Æ´Ñ ù ¹®ÀÚ°¡ óÀ½À¸·Î ³ªÅ¸³ª´Â À§Ä¡¸¦ ã´Â´Ù 
find_last_not_of() find last of() °ú °°À¸³ª ÁÖ¾îÁø ¹®ÀÚ°¡ ¾Æ´Ñ ¹®ÀÚ¸¦ ã´Â´Ù. 
rfind() find()¿Í °°À¸³ª, ã´Â ¹æÇâÀÌ ¹Ý´ëÀÌ´Ù. (µÚÂʺÎÅÍ Ã£´Â´Ù) 
   

°¡Àå ÈçÇÑ »óȲÀº ¹®ÀÚ¿­À» ã´Â °ÍÀ̰í, ÀÌ´Â find() ÇÔ¼ö¸¦ »ç¿ëÇÏ¸é µÈ´Ù.

string str("Hello, can you find Ben?");
string::size_type position = str.find("Ben");
cout << "First occurence of Ben was found at: " << position << endl;

ÀÌ ÄÚµå´Â 'Ben'¿¡ ´ëÇØ ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏ´Â °Ë»öÀ» Çϰí, ½ÃÀÛÀ§Ä¡¸¦ 'position'¿¡ string::size_type ŸÀÔÀ¸·Î ³Ö´Â´Ù. ¸®ÅÏÇÏ´Â °ªÀÌ int°¡ ¾Æ´Ï¶ó Ưº°È÷ °í¾ÈµÈ string::size_type ŸÀÔÀ̶ó´Âµ¥ ÁÖÀÇÇ϶ó.

find_first_of() ÇÔ¼ö´Â ½ÇÁ¦ÀûÀÎ ¿¹°¡ ÇÊ¿äÇÒ °ÍÀÌ´Ù. ¾Æ·¡¿Í °°Àº »óȲÀ» º¸ÀÚ.

string s = "C++ is an impressive language.";
string::size_type pos = s.find_first_of(" .");

while (pos != string::npos) {
    cout << "Found space or dot at: " << pos << endl;
    pos = s.find_first_of(" .", pos + 1);
}

find_first_of()ÇÔ¼ö¸¦ ¾²¸é, ¿ì¸®´Â ù¹øÂ° ÀÎÀÚÀÇ ¸ðµç ¹®ÀÚ¸¦ ã°Ô µÇ°í, µû¶ó¼­ ¿©±â¼­´Â ½ºÆäÀ̽º(' ') ȤÀº Á¡('.')À» ã°Ô µÈ´Ù.

ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇØ¼­ ¾î¶»°Ô Ãâ·ÂµÇ´ÂÁö º¸¾Æ¶ó.


7.3. string tokenizer

¹®ÀÚ¿­À» °¡Áö°í ÀÚÁÖ ÇϰԵǴ ÀÛ¾÷ Áß Çϳª´Â, ¾î¶² ±¸ºÐÀÚ¸¦ °¡Áö°í ÅäÅ«µé·Î ³ª´©´Â °ÍÀÌ´Ù (tokenize). tokenizer´Â ¹®ÀÚ¿­À» find()¸¦ °è¼Ó ºÎ¸£´Â ÀÏ ¾øÀÌ ½±°Ô Á¶±×¸¸ Á¶°¢µé·Î Âɰ¶ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. C¿¡¼­´Â, ¾Æ¸¶µµ ¹®ÀÚ ¹è¿­¿¡ ´ëÇØ strtok() ¶õ ÇÔ¼ö¸¦ ½èÀ» °ÍÀÌÁö¸¸, ¹®ÀÚ¿­¿¡ ´ëÇØ¼­´Â ÀÌ·¯ÇÑ ÇÔ¼ö°¡ ¾ø´Ù. µû¶ó¼­ Á÷Á¢ ÀÌ·± ÇÔ¼ö¸¦ ¸¸µé¾î¾ß °ÚÁö¸¸, ¸î°¡Áö ÇØ°áÃ¥ÀÌ ÀÖ´Ù.

The advanced tokenizer:

void Tokenize(const string& str,
                      vector<string>& tokens,
                      const string& delimiters = " ")
{
    // ¸Ç ù ±ÛÀÚ°¡ ±¸ºÐÀÚÀÎ °æ¿ì ¹«½Ã
    string::size_type lastPos = str.find_first_not_of(delimiters, 0);
    // ±¸ºÐÀÚ°¡ ¾Æ´Ñ ù ±ÛÀÚ¸¦ ã´Â´Ù
    string::size_type pos     = str.find_first_of(delimiters, lastPos);

    while (string::npos != pos || string::npos != lastPos)
    {
        // tokenÀ» ã¾ÒÀ¸´Ï vector¿¡ Ãß°¡ÇÑ´Ù
        tokens.push_back(str.substr(lastPos, pos - lastPos));
        // ±¸ºÐÀÚ¸¦ ¶Ù¾î³Ñ´Â´Ù.  "not_of"¿¡ ÁÖÀÇÇ϶ó
        lastPos = str.find_first_not_of(delimiters, pos);
        // ´ÙÀ½ ±¸ºÐÀÚ°¡ ¾Æ´Ñ ±ÛÀÚ¸¦ ã´Â´Ù
        pos = str.find_first_of(delimiters, lastPos);
    }
}

tokenizer´Â ´ÙÀ½°ú °°ÀÌ ¾²ÀÏ ¼ö ÀÖ´Ù.

#include <string>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    vector<string> tokens;

    string str("Split me up! Word1 Word2 Word3.");

    Tokenize(str, tokens);

    copy(tokens.begin(), tokens.end(), ostream_iterator<string>(cout, ", "));
}

À§ÀÇ ÄÚµå´Â Tokenize ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ¿¹·Î¼­, ù¹øÂ° ÀÎÀÚÀÎ str¸¦ Âɰµ´Ù. ±×¸®°í ¿ì¸®°¡ ¼¼ ¹øÂ° ÀÎÀÚ¸¦ ÁÖÁö ¾Ê¾Ò±â ¶§¹®¿¡ µðÆúÆ®·Î ¼³Á¤µÈ " "(spacebar)¸¦ ±¸ºÐÀÚ·Î »ç¿ëÇÑ´Ù. ±×¸®°í ¸ðµç element´Â tokens º¤ÅÍ¿¡ µé¾î°¡°Ô µÉ °ÍÀÌ´Ù.

¸¶Áö¸·À¸·Î Ç¥ÁØ Ãâ·Â¿¡ º¤ÅÍ Àüü¸¦ copy()ÇÔÀ¸·Î½á º¤ÅÍÀÇ ³»¿ëÀ» È­¸éÀ¸·Î º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¶Ç´Ù¸¥ Á¢±Ù ¹æ¹ýÀº stringstreamÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. C++¿¡¼­ streamÀº Ư¼öÇÑ ±â´ÉÀÌ Çϳª Àִµ¥, ÀÌ´Â °ø¹é(whitespace)¸¦ ¸¸³¯ ¶§±îÁö Àб⸦ °è¼ÓÇÑ´Ù´Â °ÍÀÌ´Ù. µû¶ó¼­ ¾Æ·¡ÀÇ ÄÚµå´Â °ø¹éÀ» ±âÁØÀ¸·Î ¹®ÀÚ¿­À» ³ª´©°íÀÚ ÇÒ ¶§ Àß µ¿ÀÛÇÒ °ÍÀÌ´Ù.

#include <vector>
#include <string>
#include <sstream>

using namespace std;

int main()
{
    string str("Split me by whitespaces");
    string buf; // ¹öÆÛ string
    stringstream ss(str); // stringÀ» stream¿¡ ³Ö´Â´Ù

    vector<string> tokens; // wordµéÀ» ³ÖÀ» vector

    while (ss >> buf)
        tokens.push_back(buf);
}

ÀÌÁ¦ stringstreamÀº Ãâ·Â ¿¬»êÀÚ(>>)¸¦ »ç¿ë ÇÏ¿© ¹®ÀÚ¿­À» buf ¿¡ °ø¹éÀ» ¸¸³¯ ¶§¸¶´Ù ³Ö´Â´Ù. buf´Â À̸¦ Â÷·Ê´ë·Î º¤ÅÍ¿¡ push_back() ÇÑ´Ù. ±×¸®°í ÀÌÁ¦ tokens º¤ÅÍ´Â str ¿¡ µé¾îÀÖ´Â ¸ðµç ´Ü¾î¸¦ °®°Ô µÈ´Ù.


8. File class

C++ °ú Java´Â ¸¹Àº ¼ÒÇÁÆ®¿þ¾î ÇÁ·ÎÁ§Æ®¿¡¼­ µ¿½Ã¿¡ ¾²ÀδÙ. C++°ú Java¸¦ ¿Ô´Ù°¬´ÙÇÏ´Â ÇÁ·Î±×·¡¸Ó¿¡°Ô ÀÌ File class´Â ¸Å¿ì À¯¿ëÇÒ °ÍÀÌ´Ù.

¿î¿µÃ¼Á¦ÀÇ ÆÄÀÏÀ» °ü¸®ÇÒ ¶§, File class°¡ ÇÊ¿äÇÒ °ÍÀÌ´Ù. ÀÌ class´Â JavaÀÇ File class¸¦ ¸ð¹æÇÑ °ÍÀ¸·Î, C++ ÇÁ·Î±×·¡¹Ö¿¡¼­ ¸Å¿ì À¯¿ëÇÒ °ÍÀÌ´Ù. C++¿¡¼­ ÀÌ class¸¦ »ç¿ëÇϸé, ÆÄÀÏÀÌ Á¸ÀçÇÏ´ÂÁö(exists()), µð·ºÅ丮°¡ Á¸ÀçÇÏ´ÂÁö(exists()), ÆÄÀÏÀÇ ±æÀÌ´Â ¾î¶²Áö(length()) µîÀ» ¾Ë ¼ö ÀÖ´Ù.

ÀÌ class°¡ Ç¥ÁØ C++ ¶óÀ̺귯¸®¿¡´Â ¾ø´Â ÁÁÀº ±â´ÉµéÀ» °®°í ÀÖ´Ù´Â µ¥ ÁÖ¸ñÇØ¶ó. ±×·¯³ª ¿©·¯°¡Áö ´Ù¸¥ µ¿ÀÛÀ» ÇØÁÖ¾î¾ß ÇÏ´Â fstreams(iostreams)°ú Çò°¥¸®Áö´Â ¸»¾Æ¶ó.


9. C++ ¿¡¼­ÀÇ ¸Þ¸ð¸® ÇÒ´ç

C¿¡¼­´Â, ¸Þ¸ð¸®ÀÇ ÇÒ´ç°ú ÇØÁ¦¸¦ À§ÇØ malloc()°ú free()¸¦ ºñ·ÔÇÑ malloc()°è¿­ÀÇ ÇÔ¼ö¸¦ ¾²Áö¸¸, ´Ùµé ´ÜÁ¡À» °®°í ÀÖ´Ù. ±×·¡¼­ C++ Àº ¸Þ¸ð¸®¸¦ ´Ù·ç±â À§ÇÑ ¿¬»êÀÚµéÀ» µµÀÔÇß°í, À̵éÀº new ¿Í deleteÀÌ´Ù. ÀÌ ¿¬»êÀÚµéÀº ½ÇÇà½Ã¿¡ Èü(heap - ȤÀº ÀÚÀ¯ °ø°£)À¸·ÎºÎÅÍ ¸Þ¸ð¸®¸¦ ÇÒ´ç, ÇØÁ¦ÇÑ´Ù.

C++¿¡¼­´Â Á¤¸»·Î ²À malloc()À̳ª free()¸¸À» ½á¾ßÇÏ´Â »óȲÀÌ ¾Æ´Ï¶ó¸é ¾ðÁ¦³ª new ¿Í delete¸¦ ½á¾ßÇÑ´Ù. ±×·¯³ª ÁÖÀÇÇÒ Á¡Àº, ÀÌ µÎ °¡Áö¸¦ ¼¯¾î¼­ ¾²¸é ¾ÈµÈ´Ù´Â °ÍÀÌ´Ù. malloc()À¸·Î ¾òÀº ¸Þ¸ð¸®¸¦ delete·Î ÇØÁ¦ÇÒ ¼ö´Â ¾ø°í, ¹Ý´ë·Î new·Î ¾òÀº ¸Þ¸ð¸®¸¦ free()½Ãų ¼öµµ ¾ø´Ù.


9.1. C++ Zap (Delete) ÇÔ¼ö

C++¿¡¼­ÀÇ delete ¿Í new ¿¬»êÀÚ´Â CÀÇ malloc, freeº¸´Ù ³´´Ù. µû¶ó¼­ malloc°ú free ´ë½Å new¿Í zap(delete)¸¦ ¾²µµ·Ï ÇÏ´Â °ÍÀÌ ÁÁ´Ù.

delete ¿¬»êÀÚ°¡ Á» ´õ ±ò²ûÇÏ°Ô »ç¿ëµÇ°Ô ÇϱâÀ§ÇØ ´ÙÀ½°ú °°Àº Zap() inline ÇÔ¼ö¸¦ ¸¸µéÀÚ. ´ÙÀ½°ú °°ÀÌ zap()À» Á¤ÀÇÇÏÀÚ.

// x°¡ NULLÀÎÁö üũÇϱâ À§ÇØ assert¸¦ »ç¿ëÇÏ¿´´Ù.
// ÀÌ´Â ÇÁ·Î±×·¥ÀÇ "³í¸®Àû" ¿¡·¯¸¦ ¹Ì¸® Àâ¾Æ³»±â À§ÇÑ °ÍÀÌ´Ù.
// delete°¡ NULLÀÎ °æ¿ì¿¡µµ Àß µ¿ÀÛÇϱä ÇÏÁö¸¸, assert¸¦
// »ç¿ëÇÔÀ¸·Î½á Á» ´õ ÀÏÂï ¿¡·¯¸¦ Àâ¾Æ³¾ ¼ö ÀÖ´Ù.

// ZapÀ» templateÀ» »ç¿ëÇÏ¿© Á¤ÀÇÇÏÀÚ.
// delete´ë½Å zapÀ» »ç¿ëÇÏ¸é ´õ ±ò²ûÇÒ °ÍÀÌ´Ù.
template <class T>
inline void zap(T & x)
{
	{assert(x != NULL);}
	delete x;
	x = NULL;
}

// C++¿¡ µÎ °¡Áö delete ¿¬»êÀÚÀÇ ¿ë¹ýÀÌ ÀÖ´Â ÀÌÀ¯´Â C++ ¿¡°Ô
// ÇÑ °´Ã¼¿¡ ´ëÇÑ Æ÷ÀÎÅÍ¿Í °´Ã¼ÀÇ ¹è¿­¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ±¸º°Çϵµ·Ï
// ¸»ÇØÁÖ´Â ¹æ¹ýÀÌ ÇÊ¿äÇϱ⠶§¹®ÀÌ´Ù.
// delete¿¬»êÀÚ´Â ÇÁ·Î±×·¡¸Ó¿¡°Ô "[]"¸¦ ¾²°ÔÇÔÀ¸·Î½á À̸¦ ±¸º°ÇÑ´Ù.
// µû¶ó¼­ ¿ì¸®´Â Æ÷ÀÎÅÍÀÇ ¹è¿­À» Áö¿ì±â À§ÇÑ zaparr ÇÔ¼ö¸¦ ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù
template <class T>
inline void zaparr(T & x)
{
	 {assert(x != NULL);}
     delete [] x;
     x = NULL;
}

zap()ÇÔ¼ö´Â Æ÷ÀÎÅ͸¦ delete½Ã۰í NULL·Î ¼¼ÆÃÇÑ´Ù. ÀÌ´Â ¶È°°Àº delete Æ÷ÀÎÅÍ¿¡ ´ëÇØ ¿©·¯¹øÀÇ zap()ÀÌ ºÒ·Á¼­ ÇÁ·Î±×·¥ÀÌ ¸Á°¡Áö´Â °ÍÀ» ¹æÁöÇÑ´Ù. ´ÙÀ½ÀÇ zap_example()ÇÔ¼ö¸¦ º¸¾Æ¶ó. example_String.cpp 'Source code of C++'À» Ŭ¸¯Çضó.

	//  example_String.cpp¿¡¼­ zap_example()¸¦ º¸¶ó.
	zap(pFirstname);
	//zap(pFirstname); // pFirstnameÀÌ NULLÀ̹ǷΠÄÚ¾î ´ýÇÁ°¡ ÀϾÁö ¾Ê´Â´Ù.
	//zap(pFirstname); // pFirstnameÀÌ NULLÀ̹ǷΠÄÚ¾î ´ýÇÁ°¡ ÀϾÁö ¾Ê´Â´Ù.

	zap(pLastname);
	zap(pJobDescription);

	int *iiarray = new int[10];
	zaparr(iiarray);

¹¹ Ưº°ÇÑ °ÍÀÌ ÀÖ´Â °ÍÀº ¾Æ´Ï°í, À̰ÍÀº ´ÜÁö ¹Ýº¹ÀûÀÎ Äڵ带 ÁÙÀ̰í ŸÀÌÇÎÇÏ´Â ½Ã°£À» ¾Æ²¸ÁÖ¸ç ÇÁ·Î±×·¥À» Á» ´õ Àбâ ÁÁ°Ô ¸¸µé¾îÁÖ´Â °Í »ÓÀÌ´Ù. C++ ÇÁ·Î±×·¡¸ÓµéÀº ÀÚÁÖ deleteÇÑ pointer¸¦ NULL·Î ¼¼ÆÃÇÏ´Â °ÍÀ» Àش´Ù. ±×¸®°í ÀÌ´Â ÄÚ¾î´ýÇÁ¿Í ¿ÀÀÛµ¿À¸·Î À̾îÁú ¼ö ÀÖ´Ù. zap()Àº ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÀÚµ¿À¸·Î ó¸®ÇØÁØ´Ù. zap()¿¡ ŸÀÔ Ä³½ºÆÃÀ» ÇÒ ÇÊ¿ä´Â ¾ø´Ù. ¸¸¾à À§ zap()ÇÔ¼ö¿¡¼­ ¿¡·¯°¡ ³­´Ù¸é, ´Ù¸¥ µ¥¼­ ½ÃÀÛµÈ ¿¡·¯ÀÏ °ÍÀÌ´Ù.

¶ÇÇÑ 9.2절 , my_realloc() °ú my_free() ÀÌ malloc(), realloc() ±×¸®°í free() ´ë½Å ¾²¿©¾ß ÇÑ´Ù. À̵éÀº ÈξÀ ±ò²ûÇϰí, ¿©·¯°¡Áö üũµµ ÇØÁØ´Ù. ¿¹¸¦µé¾î, 9.2절 °ú my_free() ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â "String.h" ÆÄÀÏÀ» º¸¶ó.

ÁÖÀÇ : 'new'·Î ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦Çϱâ À§ÇØ free()¸¦ ¾²°Å³ª, malloc()À¸·Î ÇÒ´çµÈ ¸Þ¸ð¸®¸¦ ÇØÁ¦Çϱâ À§ÇØ 'delete'¸¦ ¾²Áö ¸»¾Æ¶ó. ±×·¸Áö ¾ÊÀ¸¸é °á°ú¸¦ ¿¹ÃøÇÒ ¼ö ¾ø´Â ¿¡·¯¿¡ ºüÁú °ÍÀÌ´Ù.

example_String.cpp ¿¡¼­ 'Source code of C++' ¸¦ Ŭ¸¯ÇÑ´ÙÀ½, zapÇÔ¼öÀÇ ¿¹¸¦ º¸¾Æ¶ó.


9.2. my_malloc °ú my_free ÀÇ »ç¿ë

malloc°ú realloc À» ÃÖ´ëÇÑ »ç¿ëÇÏÁö ¸»°í, new ¿Í 9.1절(delete)À» »ç¿ëÇØ¶ó. ±×·¯³ª ¶§·Î´Â C++¿¡¼­ C ½ºÅ¸ÀÏÀÇ ¸Þ¸ð¸® ÇÒ´çÀ» »ç¿ëÇØ¾ß ÇÒ Çʿ䵵 ÀÖ´Ù. ÀÌ ¶§´Â my_malloc() , my_realloc() , my_free() À» »ç¿ëÇØ¶ó. ÀÌ ÇÔ¼öµéÀº ÀûÀýÇÑ ÇÒ´ç°ú ÃʱâÈ­¸¦ ÇØÁÖ°í, ¸Þ¸ð¸® ¹®Á¦¸¦ ¿¹¹æÇØÁØ´Ù. ¶ÇÇÑ ÀÌ ÇÔ¼öµéÀº DEBUG¸ðµå¿¡¼­ ¸Þ¸ð¸® ÇÒ´çÀ» ÃßÀûÇØÁÖ°í, ÇÁ·Î±×·¥ ½ÇÇà ÀüÈÄ¿¡ ÃÑ ¸Þ¸ð¸® »ç¿ë·®À» Ç¥½ÃÇØÁØ´Ù. ÀÌ´Â ¸Þ¸ð¸® ¸¯ÀÌ ÀÖ´ÂÁö¸¦ ¾Ë·ÁÁÙ °ÍÀÌ´Ù.

my_malloc °ú my_reallocÀº ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾú´Ù. ÀÌ´Â ¾à°£ÀÇ ¸Þ¸ð¸®¸¦ ´õ ÇÒ´çÇØ¼­ (SAFE_MEM = 5) ÃʱâÈ­½Ã۰í, ¸Þ¸ð¸®¸¦ ÇÒ´çÇÒ ¼ö ¾øÀ¸¸é ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù. 'call_check(), remove_ptr()' ÇÔ¼ö´Â DEBUG_MEM °¡ makefile¿¡¼­ ((void)0) (ÀÌ´Â NULLÀ» ÀǹÌÇÑ´Ù)À¸·Î ÁöÁ¤µÇ¾îÀÖÀ» ¶§¿¡¸¸ ÀÛµ¿ÇÑ´Ù. ÀÌ´Â ÃÑ ¸Þ¸ð¸® »ç¿ë·®À» ÃßÀûÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù.

void *local_my_malloc(size_t size, char fname[], int lineno) 
{
	size_t  tmpii = size + SAFE_MEM;
	void *aa = NULL;
	aa = (void *) malloc(tmpii);
	if (aa == NULL)
		raise_error_exit(MALLOC, VOID_TYPE, fname, lineno);
	memset(aa, 0, tmpii);
	call_check(aa, tmpii, fname, lineno);
	return aa;
}

char *local_my_realloc(char *aa, size_t size, char fname[], int lineno)
{
	remove_ptr(aa, fname, lineno);
	unsigned long tmpjj = 0;
	if (aa) // aa !=  NULL
		tmpjj = strlen(aa);
	unsigned long tmpqq = size + SAFE_MEM;
	size_t  tmpii = sizeof (char) * (tmpqq);
	aa = (char *) realloc(aa, tmpii);
	if (aa == NULL)
		raise_error_exit(REALLOC, CHAR_TYPE, fname, lineno);

	// do not memset memset(aa, 0, tmpii);
	aa[tmpqq-1] = 0;
	unsigned long kk = tmpjj;
	if (tmpjj > tmpqq)
		kk = tmpqq;
	for ( ; kk < tmpqq; kk++)
		aa[kk] = 0;
	call_check(aa, tmpii, fname, lineno);
	return aa;
}
my_malloc ÀÇ ¸ðµç ±¸ÇöÀ» º¸·Á¸é 23절 ¿¡¼­ 23절 ÀÇ Çì´õÆÄÀÏÀ» º¸¸é µÈ´Ù.

my_malloc °ú my_free ¸¦ ¾²´Â ¿¹´Â ´ÙÀ½°ú °°´Ù.

	char 	*aa;
	int 	*bb;
	float	*cc;
	aa = (char *) my_malloc(sizeof(char)* 214);
	bb = (int *) my_malloc(sizeof(int) * 10);
	cc = (float *) my_malloc(sizeof(int) * 20);

	aa = my_realloc(aa, sizeof(char) * 34);
	bb = my_realloc(bb, sizeof(int) * 14);
	cc = my_realloc(cc, sizeof(float) * 10);
my_realloc ¿¡¼­ data typeÀ» cast ÇÒ Çʿ䰡 ¾ø´Â °Í¿¡ ÁÖÀÇÇØ¶ó. ÀÌ´Â ÀÎÀÚ·Î ¹ÞÀº º¯¼öÀÇ Å¸ÀÔ¿¡ ¸ÂÃç¼­ ¸®ÅϰªÀ» º¸³»±â ¶§¹®ÀÌ´Ù. The my_realloc ÇÔ¼ö´Â char *, int *, float * ŸÀÔÀ¸·Î ¿À¹ö·Îµù µÇ¾îÀÖ´Ù.


9.3. C++ ¿¡¼­ÀÇ °¡¹ÙÁö ÄÝ·ºÅÍ

C/C++¿¡¼­ °¡ºñÁö ÄÝ·º¼ÇÀº Ç¥ÁØ¿¡¼­ Áö¿øµÇÁö ¾Ê°í, µû¶ó¼­ ¸Þ¸ð¸®¸¦ Á÷Á¢ ÇÒ´ç, ÇØÁ¦ÇÏ´Â °ÍÀÌ ¾î·Æ°í º¹ÀâÇÏ¸ç ¿¡·¯¸¦ ³»±â ½±´Ù. °¡ºñÁö ÄÝ·º¼Ç(GC:Garbage Collection) Àº ±¸ÇöÇÏ´Â ¹æ¹ýÀÌ ¿©·¯°¡Áö°¡ ÀÖ°í, °¢ ÇÁ·Î±×·¥¸¶´Ù Àû¿ëµÉ ¼ö ÀÖ´Â ¹æ¹ýÀÌ ´Ù¸£±â ¶§¹®¿¡ C++ Ç¥ÁØÀÇ ÀϺΰ¡ µÉ ¼ö ¾ø¾ú´Ù. Àü»êÇÐÀÚµéÀº ¸¹Àº GC ¾Ë°í¸®ÁòÀ» °³¹ßÇß°í, À̵éÀº °¢ ¹®Á¦ºÐ¾ß¿¡¼­¸¸ Àû¿ëµÉ ¼ö ÀÖ´Â °ÍµéÀ̾ú´Ù. Áï, ¸ðµç ÀϹÝÀûÀÎ ¹®Á¦¿¡ Àû¿ëµÉ ¼ö ÀÖ´Â ÇϳªÀÇ ¹ü¿ë GC¾Ë°í¸®ÁòÀº ¾ø´Ù. µû¶ó¼­ GC´Â C++ Ç¥ÁØ¿¡ µé¾î°¡Áö ¸øÇß´Ù. µû¶ó¼­ ¾ðÁ¦³ª ÇÏ´Â ÀÏ¿¡ ¸Â´Â C++ ¶óÀ̺귯¸®¸¦ ¸¹Àº ¶óÀ̺귯¸®µé Áß¿¡¼­ °í¸¦ ¼ö ÀÖ´Ù.

´ÙÀ½ C++ °¡ºñÁö ÄÝ·º¼Ç(Garbage Collection) »çÀÌÆ®¿Í ¸Þ¸ð¸® °ü¸® »çÀÌÆ®¸¦ °¡º¸¾Æ¶ó.


10. Æ÷ÀÎÅͰ¡ ¹®Á¦ÀÌ´Ù

Æ÷ÀÎÅÍ´Â ÀϹÝÀûÀÎ ÇÁ·Î±×·¥¿¡¼­ ²À ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï´Ù. Java¿Í °°Àº Çö´ë ¾ð¾î¿¡¼­´Â Æ÷ÀÎÅͰ¡ ¾ø´Ù (Java´Â ³»ºÎÀûÀ¸·Î¸¸ Æ÷ÀÎÅ͸¦ »ç¿ëÇÑ´Ù). Æ÷ÀÎÅÍ´Â ÇÁ·Î±×·¥À» ¾îÁö·´°í Àбâ Èûµé°Ô ¸¸µç´Ù.

ÃÖ´ëÇÑ Æ÷ÀÎÅÍÀÇ »ç¿ëÀ» ÇÇÇϰí, ´ë½Å ·¹ÆÛ·±½º¸¦ »ç¿ëÇØ¶ó. Æ÷ÀÎÅÍ´Â Á¤¸» ¹®Á¦°¡ ¸¹°í, Æ÷ÀÎÅÍ ¾øÀÌ ÇÁ·Î±×·¥À» ¾²´Â °Ô °¡´ÉÇÏ´Ù. Æ÷ÀÎÅÍ´Â ·¹ÆÛ·±½º¸¦ ¾µ ¼ö ¾ø´Â °÷¿¡¼­¸¸ ½á¾ßÇÑ´Ù.

·¹ÆÛ·±½º ´Â º°Äª(alias)ÀÌ´Ù. ·¹ÆÛ·±½º¸¦ ¸¸µé¸é, ÀÌ´Â ´Ù¸¥ °´Ã¼(ȤÀº ´ë»ó)¿¡ ´Ù¸¥ À̸§À» ÁÖ´Â °ÍÀÌ´Ù. ±× ¼ø°£ºÎÅÍ ·¹ÆÛ·±½º´Â ´ë»óÀÇ ´Ù¸¥ À̸§À¸·Î¼­ µ¹¾Æ°¡°í, ·¹ÆÛ·±½º¿¡ ÇàÇÏ´Â ¸ðµç ¿¬»êÀÌ ±× ´ë»ó¿¡ ½ÇÁ¦·Î Àû¿ëµÈ´Ù.

·¹ÆÛ·±½ºÀÇ ¹®¹ý : ŸÀÔÀ» ¼±¾ðÇÒ ¶§, µÚ¿¡ ·¹ÆÛ·±½º ¿¬»êÀÚ (&) ¸¦ ºÙÀÓÀ¸·Î½á ·¹ÆÛ·±½º¸¦ ¼±¾ðÇÒ ¼ö ÀÖ´Ù. ·¹ÆÛ·±½º´Â ¹Ýµå½Ã ¸¸µé¾î Áú ¶§ ÃʱâÈ­ µÇ¾î¾ß ÇÑ´Ù. ´ÙÀ½ÀÇ ¿¹¸¦ º¸ÀÚ -

	int	weight;
	int	& rweight = weight;

	DOG	aa;
	DOG	& rDogRef = aa;

·¹ÆÛ·±½º¸¦ »ç¿ëÇÒ ¶§ Áöų °Í -

  • °´Ã¼¿¡ ´ëÇÑ ´Ù¸¥ À̸§À» ÁÖ°íÀÚ ÇÒ ¶§ ·¹ÆÛ·±½º¸¦ »ç¿ëÇØ¶ó.

  • ¸ðµç ·¹ÆÛ·±½º´Â ÃʱâÈ­µÇ¾î¾ß ÇÑ´Ù.

  • ÇÁ·Î±×·¥ÀÇ ³ôÀº È¿À²°ú ÆÛÆ÷¸Õ½º¸¦ À§ÇØ ·¹ÆÛ·±½º¸¦ »ç¿ëÇØ¶ó

  • ·¹ÆÛ·±½º¿Í Æ÷ÀÎÅ͸¦ º¸È£Çϱâ À§ÇØ °¡´ÉÇѰæ¿ì¸é ¾ðÁ¦³ª const¸¦ »ç¿ëÇØ¶ó.

·¹ÆÛ·±½º¸¦ »ç¿ëÇÒ ¶§ ÇÏÁö ¸»¾Æ¾ß ÇÒ °Í -

  • Áß¿ä : NULLÀÎ °´Ã¼¿¡ ´ëÇØ ·¹ÆÛ·±½º¸¦ ¾²Áö ¸»¾Æ¶ó.

  • Æ÷ÀÎÅÍÀÇ ÁÖ¼Ò¸¦ ³ªÅ¸³»´Â &¿Í ·¹ÆÛ·±½º ¿¬»êÀÚ¸¦ Çò°¥¸®Áö ¸¶¶ó. ·¹ÆÛ·±½º ¿¬»êÀÚ´Â ¿ÀÁ÷ ¼±¾ðºÎ (À§¿¡ ³ª¿ÍÀÖ´Â ·¹ÆÛ·±½º »ç¿ë¹ý ÂüÁ¶) ¿¡¼­¸¸ ¾²ÀδÙ.

  • ·¹ÆÛ·±½º¿¡ »õ·Î °ªÀ» ÁöÁ¤ÇÏ·Á(Áï, º¯°æÇÏ·Á) ÇÏÁö ¸¶¶ó.

  • ·¹ÆÛ·±½º¸¦ ¾µ ¼ö ÀÖ´Ù¸é Æ÷ÀÎÅ͸¦ ¾²Áö ¸¶¶ó.

  • Áö¿ªº¯¼ö¿¡ ´ëÇÑ ·¹ÆÛ·±½º¸¦ ¸®ÅÏÇÏÁö ¸¶¶ó.

  • ·¹ÆÛ·±½º°¡ ½ºÄÚÇÁ°¡ ¹þ¾î³­ º¯¼ö¸¦ °¡¸®Å°µµ·Ï ÇÏÁö ¸¶¶ó.


11. µð¹ö±ë

Á¤È®ÇÑ ¹ö±×ÀÇ ¿øÀÎÀ» ¾Ë¾Æ³»´Â °ÍÀº ²Ï³ª ¼º°¡½Å ÀÏÀÌÁö¸¸, ¿©±â¿¡µµ ¸î°¡Áö Å×Å©´ÐÀÌ ÀÖ´Ù.

  • Ç¥ÁØÃâ·ÂÀ¸·Î ÇÁ¸°Æ®ÇÏ¿© - ÇÁ·Î±×·¥ÀÌ °£´ÜÇÑ °æ¿ì, ¸î¸î º¯¼öµéÀÇ °ªÀ» ÇÁ¸°Æ®Çغ¸°í, ¾î¶² °ªÀÎÁö º»´Ù - ¹«¾ùÀÌ À߸øµÇ¾ú´ÂÁö ã±â

  • µð¹ö°Å¸¦ ÀÌ¿ëÇϱâ. µð¹ö°Å´Â breakpoint¸¦ ¼³Á¤Çϰí, ½ÇÇ൵Áß¿¡ Äڵ带 ÃßÀûÇØº¼ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. ´ëºÎºÐÀÇ IDE´Â µð¹ö°Å°¡ °°ÀÌ ÀÖ´Ù. GNU ½Ã½ºÅÛÀÇ °æ¿ì, gdb°¡ ÀÖ´Ù.

  • ÄÄÆÄÀÏ·¯¿¡¼­ Áö¿øÇÏ´Â ¿É¼ÇµéÀ» »ç¿ëÇÏ¿© º¸´Ù ¸¹Àº °æ°í(warning)À» º¼ ¼ö ÀÖµµ·Ï ÇØ¶ó. ¿¹¸¦µé¾î g++ÀÇ °æ¿ì, -Wall ¿É¼ÇÀ» »ç¿ëÇØ¶ó.

µð¹ö±ë¿¡ µµ¿òÀÌ µÇ´Â »çÀÌÆ® :


11.1. µð¹ö±ë ÆÄÀÏ

C++À̳ª C ÇÁ·Î±×·¥À» µð¹ö±ëÇÏ·Á¸é 23절 ÀÇ ÆÄÀÏÀ» ÀÎŬ·çµåÇϰí, 'Makefile'¿¡ DEBUG_STR, DEBUG_PRT , DEBUG&_MEMÀ» µðÆÄÀÎ ÇØ¼­ debug.h ÀÇ ÇÔ¼öµé·Î ÃßÀûÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. '-DDEBUG_STR' µîÀ» ¾ø¾Ù ¶§, µð¹ö±ë ÇÔ¼öµéÀº ((void)0) (NULLÀ» ÀǹÌ)À¸·Î ¼¼ÆÃµÉ °ÍÀÌ´Ù. µû¶ó¼­ ÃÖÁ¾ °á°ú¹°¿¡´Â ¾Æ¹«·± ¿µÇâÀ» ÁÖÁö ¾Ê´Â´Ù. ÀÌ µð¹ö±ë ÇÔ¼öµéÀº ÇÁ·Î±×·¥¿¡ ´Ù¾çÇÏ°Ô Àû¿ëµÉ ¼ö ÀÖÀ» °ÍÀ̰í, °á°ú¹°ÀÇ Å©±â¸¦ Áõ°¡½ÃŰÁö´Â ¾ÊÀ» °ÍÀÌ´Ù.

debug ·çƾÀÇ ±¸ÇöÀ» À§Çؼ­´Â 23절 ¸¦ ÂüÁ¶Çضó.

¶ÇÇÑ, 23절 ¿¡¼­ debug.h ¿Í µð¹ö±ë ÇÔ¼öµéÀ» ÀÌ¿ëÇÑ ¿¹Á¦ ÇÁ·Î±×·¥À» º¸¾Æ¶ó.

23절 ÀÇ ¿¹¸¦ º¸¶ó.


12. C++À» À§ÇÑ IDE(Integrated Development Enviroment)¿Í ¿¡µðÅÍ

C++·Î ÇÁ·Î±×·¡¹ÖÀ» ÇÒ ¶§, ¿¡µðÅͳª IDE¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. ´ëºÎºÐÀÇ ÇÁ·Î±×·¡¸Ó´Â ÀÚ½ÅÀÌ ÁÁ¾ÆÇÏ´Â °ÍµéÀ» °®°Ô ¸¶·ÃÀ̰í, ¾î¶² °ÍÀÌ ÁÁÀºÁö¿¡ ´ëÇØ °ÅÀÇ Á¾±³ÀûÀÎ ¹ÏÀ½À» °®´Â´Ù.

³Ê´Â ³»Àå ¿¡µðÅÍ¿Í ÄÄÆÄÀÏ·¯, ¹®¼­µé°ú ±âŸ µîµîÀ¸·Î ¸ðµÎ Æ÷ÇÔÇÏ´Â IDE (Intergrated Development Environment : ÅëÇÕ °³¹ßȯ°æ)¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ¶Ç´Â ¸î¸î »ç¶÷µéÀÌ ±×·¯´Â °Í ó·³, ´Ü¼øÇÑ ¿¡µðÅ͸¸À» »ç¿ëÇÒ ¼öµµ ÀÖ´Ù.


12.1. IDE µé

C++ °³¹ßÀ» À§ÇÑ ´ÙÀ½°ú °°Àº IDE (Integrated Development Environment) toolÀÌ ÀÖ´Ù.


12.2. ¿¡µðÅÍ

IDEÀÇ ¹®Á¦Á¡Àº ÀÌ¿¡ °°ÀÌ µé¾îÀÖ´Â ¿¡µðÅÍÀÇ ±â´ÉÀÌ ¸Å¿ì ¶³¾îÁø´Ù´Â °ÍÀÌ´Ù. µû¶ó¼­ ¸¹Àº »ç¶÷µéÀº ÆÄ¿öÇ®ÇÑ ¿¡µðÅ͸¦ ¿øÇß°í, ÄÄÆÄÀÏ·¯¿Í ÇÔ²² »ç¿ëÇÑ´Ù.

ÆÄ¿öÇ®ÇÑ ¿¡µðÅͷδ vim°ú emacs¸¦ µé ¼ö ÀÖ´Ù. µÑ ´Ù ¸ðµÎ ¸¹Àº Ç÷§Æû¿¡¼­ µ¿ÀÛÇϰí, È¿À²¼ºÀ» ³ô¿©ÁÙ ½ÅÅýº ÇÏÀ̶óÀÌÆÃÀ» ºñ·ÔÇÑ ¿©·¯°¡Áö ±â´ÉµéÀ» °®°í ÀÖ´Ù.

´Ù¸¥ °ÍÀ¸·Î´Â UltraEdit(win32 only) ¿Í EditPlus(win32 only)°¡ ÀÖ´Ù.


13. C++ Online ÅØ½ºÆ®¿Í ¹®¼­µé

C++¿¡ ´ëÇÑ ¼ö¹é¸¸ÀÇ ¿Â¶óÀÎ ¹®¼­/ÅØ½ºÆ®/Âü°íÀÚ·á °¡ÀÌµå µîÀÌ Á¸ÀçÇÑ´Ù. ÀÌ´Â C++ÀÌ ¸Å¿ì ¿À·§µ¿¾È ¾²À̰í Àֱ⠶§¹®ÀÌ´Ù. ¾Æ¸¶ Google, Yahoo, Lycos, Excite µîÀÇ ÀÎÅÍ³Ý °Ë»ö¿£ÁøÀ» »ç¿ëÇÏ¸é µµ¿òÀÌ µÉ °ÍÀÌ´Ù.

C++ ÇÁ·Î±×·¡¸Ó¸¦ À§ÇØ À¯¿ëÇÒ Java Ã¥µé :


13.1. C++ »çÀÌÆ®µé

´ÙÀ½ÀÇ C++ »çÀÌÆ®µéÀ» ¹æ¹®Çغ¸¶ó :-

ÀÎÅͳݿ¡´Â ¾î¸¶¾î¸¶ÇÏ°Ô ¸¹Àº C++ ¹®¼­µéÀÌ ÀÖ´Ù. Google, Yahoo, Lycos, Infoseek, Excite °°Àº °Ë»ö¿£Áø¿¡ °¡¼­ ´ÙÀ½ÀÇ Å°¿öµå¸¦ ³Ö¾îº¸¾Æ¶ó. 'C++ tutorials' 'C++ references' 'C++ books' Advanced ¸¦ Ŭ¸¯Çؼ­ search by exact phrase¸¦ ¼±ÅÃÇÔÀ¸·Î½á ´õ Á¤È®ÇÑ °á°ú¸¦ ¾òÀ» ¼ö ÀÖÀ» °ÍÀÌ´Ù.


13.2. C++ Tutorials

ÀÎÅͳݿ¡´Â ¸¹Àº ¼öÀÇ ¿Â¶óÀÎ Æ©Å丮¾óÀÌ ÀÖ´Ù. °Ë»ö¿£Áø¿¡¼­ 'C++ tutorials'·Î °Ë»öÀ» ÇØºÁ¶ó.


13.3. À¯¿ëÇÑ ¸µÅ©µé

  • Bird's eye view of C++ URLs ( 153°³ÀÇ URL link°¡ ÀÖ´Ù ) http://www.enteract.com/~bradapp/links/cplusplus-links.html

  • This URL: http://www.snippets.org 360°³ÀÇ ÆÄÀÏ¿¡ ÇØ´çÇÏ´Â C codeµéÀÌ ÀÖ´Ù.

  • Mathtools http://www.mathtools.net ´Â ¸ðµç °úÇÐ, °øÇÐÀû Çʿ信 ÀÇÇÑ ±â¼úÀûÀÎ ÄÄÇ»ÆÃ Æ÷Å»ÀÌ´Ù. ÀÌ Æ÷Å»»çÀÌÆ®´Â ¹«·áÀ̰í, 2¸¸¿©°³ÀÇ À¯¿ëÇÑ ±â¼úÀûÀÎ ÄÄÇ»ÅÍ ÇÁ·Î±×·¡¸ÓµéÀÇ ¸µÅ©¸¦ °¡Áö°í ÀÖ°í, C/C++, Java, Excel, MATLAB, Fortran µîÀ» ´Ù·ç°í ÀÖ´Ù.


13.4. C++ Quick-Reference

°Ë»ö¿£Áø¿¡¼­ 'C++ Reference' ·Î °Ë»öÀ» ÇØº¸¾Æ¶ó.


13.6. Java ÇüÅÂÀÇ API

C++¿¡¼­ Java ÇüÅÂÀÇ API¸¦ Á¦°øÇÏ´Â ´ÙÀ½ »çÀÌÆ®µéÀ» °¡º¸¾Æ¶ó.


14. C++ ÄÚµù °ü½À

ÄÚµù °ü½ÀÀº ÇÁ·Î±×·¥ÀÇ °¡µ¶¼º°ú À¯Áöº¸¼ö¸¦ À§ÇØ ¸Å¿ì Áß¿äÇÑ ¿ä¼ÒÀÌ´Ù. ¶ÇÇÑ ÇÁ·Î±×·¡¸ÓÀÇ »ý»ê¼ºÀ» Å©°Ô Çâ»ó½ÃŲ´Ù. ÀÌ´Â ÁÁÀº ÄÚµù ÈÆ·ÃÀ» À§ÇØ ÇÊ¿äÇÏ´Ù. ¾Æ·¡ÀÇ ³»¿ëÀº class Á¤ÀÇ¿¡ ÀÖ¾î Á¦¾ÈµÈ °ÍÀÌ´Ù.

  • ¸ðµç public º¯¼öµéÀº mFooVar°ú °°ÀÌ m À¸·Î ½ÃÀÛÇØ¾ß ÇÑ´Ù. m Àº member¸¦ ÀǹÌÇÑ´Ù.

  • ¸ðµç protected º¯¼öµéÀº mtFooVar ¿Í °°ÀÌ mt ·Î ½ÃÀÛÇØ¾ßÇϰí, ¸Þ½îµå´Â tFooNum() ¿Í °°ÀÌ t·Î ½ÃÀÛÇØ¾ß ÇÑ´Ù. t ´Â protected¸¦ ÀǹÌÇÑ´Ù.

  • ¸ðµç private º¯¼öµéÀº mvFooVar¿Í °°ÀÌ mv ·Î ½ÃÀÛÇØ¾ßÇϰí, ¸Þ½îµåµéÀº vFooLone() ¿Í °°ÀÌ v·Î ½ÃÀÛÇØ¾ß ÇÑ´Ù. v ´Â private À» ÀǹÌÇÑ´Ù.

  • ¸ðµç public, protected, private º¯¼öÀ̸§µéÀº m ´ÙÀ½¿¡´Â mFooVar ÀÇ F°°ÀÌ ´ë¹®ÀÚ·Î ½ÃÀÛÇØ¾ßÇÑ´Ù.

  • ¸ðµç Æ÷ÀÎÅÍ º¯¼öµéÀº ´ÙÀ½°ú °°ÀÌ p·Î ½ÃÀÛÇØ¾ß ÇÑ´Ù.

    • Public º¯¼ö mpFooVar °ú ¸Þ½îµå FooNum()

    • Protected º¯¼ö mtpFooVar ¿Í ¸Þ½îµå tFooNum()

    • Private º¯¼ö mvpFooVar ¿Í ¸Þ½îµå vFooNum()

¼¼°èÀûÀ¸·Î ÀϰüµÈ C++ ÄÚµù °ü½ÀÀº º¸´Ù ÇÁ·Î±×·¡¹ÖÀ» Àß ÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁÙ °ÍÀÌ´Ù.

¾Æ·¡¿¡ ÁÖ¾îÁø ¿¹Á¦ Äڵ忡¼­ t ´Â protected¸¦, v ´Â private¸¦, m ´Â member-variable ¸¦, p ´Â pointer¸¦ ÀǹÌÇÑ´Ù.

class SomeFunMuncho
{
	public:
		int	mTempZimboniMacho; // OOP¿¡¼­´Â ¿ÀÁ÷ Àӽà º¯¼öµé¸¸ publicÀ̾î¾ß ÇÑ´Ù.
		float	*mpTempArrayNumbers;
		int	HandleError();
		float	getBonyBox();  // º¯¼ö¿¡ Á¢±ÙÇϱâ À§ÇÑ ÇÔ¼ö
		float	setBonyBox();  // º¯¼ö¿¡ Á¢±ÙÇϱâ À§ÇÑ ÇÔ¼ö

	protected:
		float	mtBonyBox;
		int	*mtpBonyHands;
		char	*tHandsFull();
		int	tGetNumbers();
	private:
		float	mvJustDoIt;
		char	mvFirstName[30];
		int	*mvpTotalValue;
		char	*vSubmitBars();
		int	vGetNumbers();
};
ÇÁ·Î±×·¥ÀÌ ¼ö¹é¸¸ ¶óÀÎÀ¸·Î Ä¿Áö°Ô µÇ¸é, À§¿Í °°Àº °ü½ÀÀ» ¸Å¿ì ÁÁ¾ÆÇÏ°Ô µÉ °ÍÀÌ´Ù. ´Ü¼øÈ÷ mvFirstName ¶ó´Â º¯¼öÀ̸§À» º» °Í¸¸À¸·Îµµ, À̰ÍÀÌ Å¬·¡½ºÀÇ ¸â¹öÀ̰í, private º¯¼ö¶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖÀ¸¹Ç·Î ÄÚµåÀÇ °¡µ¶¼ºÀº ¿Ã¶ó°¡°Ô µÈ´Ù.

´ÙÀ½ÀÇ C++ ÄÚµù Ç¥ÁØ URLµéÀ» ¹æ¹®Çغ¸¾Æ¶ó.


15. C++ ½ºÅ©¸³Æ® ¾ð¾î

C++ÀÇ Å« ´ÜÁ¡Àº Á¶±×¸¸ º¯°æÀ» ÇÒ ¶§¸¶´Ù Ç×»ó ÄÄÆÄÀϰú ¸µÅ©¸¦ ´Ù½Ã ÇØÁÖ¾î¾ß ½ÇÇàÆÄÀÏÀ» ¸¸µé ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ÄÄÆÄÀÏ/¸µÅ©/µð¹ö±ë »çÀÌŬÀº ¸¹Àº ½Ã°£ÀÌ °É¸®°í »ý»êÀûÀÌÁö ¸øÇÏ´Ù. Çö´ëÀÇ CPU¿Í RAMÀº ¸Å¿ì ºü¸£°í ½ÎÁö°í ÀÖÀ¸¹Ç·Î, ¾î¶² ¶§´Â Çϵå¿þ¾î¿¡ ¸¹Àº µ·À» ÅõÀÚÇϰí, °³¹ßÀ» À§Çؼ­´Â script ¾ð¾î¸¦ ¾²´Â °ÍÀÌ ÁÁÀ» ¼öµµ ÀÖ´Ù.


15.1. PIKE & PHP (C/C++ Scripting Languages)

PHP³ª PIKE °°Àº ½ºÅ©¸³Æ® ¾ð¾î´Â ¸µÅ·°ú ÀçÄÄÆÄÀÏ °úÁ¤À» ¾ø¾Ý°í, µû¶ó¼­ °³¹ß °úÁ¤À» ´ÜÃà½Ãų ¼ö ÀÖ´Ù.

¸Þ¸ð¸®(RAM) °¡°ÝÀÌ ¶³¾îÁö°í, CPU ¼Óµµ°¡ ¿Ã¶ó°¨¿¡ µû¶ó PHP³ª PIKE°°Àº ½ºÅ©¸³Æ® ¾ð¾îÀÇ Àαâ´Â Æø¹ßÇÒ °ÍÀÌ´Ù. PHP³ª PIKE´Â °´Ã¼ÁöÇâ°ú C/C++À» ´àÀº ¹®¹ýÀ¸·Î ÀÎÇØ °¡Àå ³Î¸® ¾²ÀÌ´Â ½ºÅ©¸³Æ® ¾ð¾î°¡ µÉ °ÍÀÌ´Ù.

PHP³ª Pike C++ ½ºÅ©¸³Æ® ¾ð¾î¸¦ ¾¸À¸·Î½á ÇÁ·Î±×·¡¹ÖÀÇ »ý»ê¼ºÀº ´Ù¼¸ ¹è ³ª Áõ°¡ÇÒ °ÍÀÌ´Ù. ±×¸®°í PHP³ª PIKE´Â '°³³äÀÇ Áõ¸í'À» À§ÇØ À¯¿ëÇϰí, ÇÁ·ÎÅäŸÀÔÀ» ºü¸£°Ô ¸¸µé¾î³¾ ¼ö ÀÖ´Ù.

PHP´Â ÀϹÝÀûÀÎ ÇÁ·Î±×·¡¹ÖÀ̳ª À¥ ÇÁ·Î±×·¡¹Ö¿¡¼­ ¸Å¿ì Àα⸦ ¾ò°í ÀÖ´Ù. PHP´Â °¡±î¿î ¹Ì·¡¿¡ °¡Àå ³Î¸® ¾²ÀÌ´Â ½ºÅ©¸³Æ® ¾ð¾î°¡ µÉ °ÍÀÌ´Ù. PHP ´Â http://www.linuxdoc.org/HOWTO/PHP-HOWTO.html ( Çѱ۹ø¿ª ) ¿¡ ÀÖ´Ù.

The Pike ´Â http://pike.roxen.com ¿Í http://www.roxen.com ¿¡ ÀÖ´Ù.

Roxen À¥¼­¹ö´Â ¼ø¼öÇÏ°Ô Pike·Î ¾²¿©Á®¼­, ¾ó¸¶³ª Pike°¡ °­·ÂÇÑÁö º¸¿©ÁÖ°í ÀÖ´Ù. Pike´Â ¸î¸î ÀÛ¾÷¿¡ ´ëÇØ¼­´Â Javaº¸´Ù ºü¸£°Ô µ¹¾Æ°¡°í, ¸Þ¸ð¸®µµ »ó´çÈ÷ È¿À²ÀûÀ¸·Î »ç¿ëÇÑ´Ù.


15.2. SoftIntegration Ch (C/C++ ½ºÅ©¸³Æ® ¾ð¾î)

¸¸¾à »ó¿ë ½ºÅ©¸³Æ® ¾ð¾î¸¦ ¿øÇÑ´Ù¸é, SoftIntegration corporation ( http://www.softintegration.com ) ¿¡¼­ 'Ch scripting'À» º¸¾Æ¶ó.

Ch¶ó ºÒ¸®´Â ½ºÅ©¸³Æ® ¾ð¾î ȯ°æÀº C¸¦ Æ÷ÇÔÇϰí, ³ôÀº ¼öÁØÀÇ È®Àåµé°ú C++À» ºñ·ÔÇÑ ´Ù¸¥ ¾ð¾îµéÀÇ Æ¯Â¡µéÀ» Æ÷ÇÔÇÑ´Ù. µû¶ó¼­ Çѹø ¹è¿ì±â¸¸ ÇÏ¸é °ÅÀÇ ¸ðµç Á¾·ùÀÇ ÇÁ·Î±×·¡¹Ö¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ Cȣȯ ½ºÅ©¸³Æ® ¾ð¾î ȯ°æÀº ¿©·¯ Ç÷§Æû¿¡¼­ ÇÑ ÇÁ·Î±×·¥À» À̽İ¡´ÉÇÏ°Ô ÇÏ´Â Áß°£ ¿ªÇÒÀ» ÇÑ´Ù. À̽İ¡´ÉÇÑ Ch ÄÚµå´Â ÀÎÅͳݰú ÀÎÆ®¶ó³ÝÀ» ÅëÇØ ½´ÆÛÄÄÇ»ÅͺÎÅÍ ¿÷½ºÅ×À̼Ç, PC, ÆÊ(Palm), PDA ¸¦ ºñ·Ô ÄÄÇ»ÅÍÀÇ ¹üÁÖ¿¡ ¼ÓÇÏÁö ¾Ê´Â CNC ¸Ó½Å, ·Îº¿, TV, ³ÃÀå°í µî À¸·Î ÆÛÁ® ¾îµð¼­³ª ¾ÈÀüÇÏ°Ô µ¹¾Æ°¥ ¼ö ÀÖ´Ù.


15.3. PHP (C++ Scripting Language)

PHP´Â À¥¹®¼­¸¦ ó¸®ÇÏ´Â ½ºÅ©¸³Æ® ¾ð¾î·Î ¸Å¿ì ºü¸£°Ô ÁøÈ­Çß°í, °´Ã¼ÁöÇâÀ» Áö¿øÇÑ´Ù. PHP´Â 'class'¶ó´Â Ű¿öµå¸¦ °¡Áö°í °´Ã¼ÁöÇâ ½ºÅ©¸³ÆÃÀ» ±¸ÇöÇϰíÀÚ Çß´Ù. ¾Æ¸¶µµ °¡±î¿î ½ÃÀϳ»¿¡ PHP´Â °´Ã¼ ÁöÇâ ÇÁ·ÎÁ§Æ®¸¦ À§ÇÑ °­·ÂÇÑ ½ºÅ©¸³Æ® ¾ð¾î·Î ºü¸£°Ô ÁøÈ­ÇÒ °ÍÀÌ´Ù. °¡±î¿î ¹Ì·¡¿¡ PHP´Â À¥ÇÁ·Î±×·¡¹Ö »Ó ¾Æ´Ï¶ó ÀϹÝÀûÀÎ ¾îÇø®ÄÉÀÌ¼Ç ÇÁ·Î±×·¡¹Ö¿¡µµ ¾²ÀÌ°Ô µÉ °ÍÀÌ´Ù. À¥°ú ÀÏ¹Ý ¾îÇø®ÄÉÀ̼ǿ¡ ´Ù¸¥ ¾ð¾î¸¦ ¾²±â º¸´Ù´Â ±×³É PHP¸¸ ¾²¸é µÉ °ÍÀ̱⠶§¹®ÀÌ´Ù. PHP HOWTO : http://www.linuxdoc.org/HOWTO/PHP-HOWTO.html ( Çѱ۹ø¿ª .


16. Templates

Template ´Â ÄÚµå Àç»ç¿ëÀ» ½±°Ô ¸¸µé¾î generic ÇÁ·Î±×·¡¹ÖÀ» °¡´ÉÇÏ°Ô ÇÏ´Â C++ÀÇ Æ¯Â¡ÀÌ´Ù.

¾Æ·¡¿Í °°Àº °£´ÜÇÑ ¿¹¸¦ º¸ÀÚ :

#include <string>
#include <iostream>

void printstring(const std::string& str) {
    std::cout << str << std::endl;
}

int main()
{
    std::string str("Hello World");
    printstring(str);
}

printstring() ´Â std::string ¸¦ ù¹øÂ° ÀÎÀÚ·Î ¹Þ´Â´Ù. µû¶ó¼­ ÀÌ´Â ¿ÀÁ÷ string¸¸ ÇÁ¸°Æ® ÇÒ ¼ö ÀÖ°í, ¹®Àڹ迭(char array)À» ÇÁ¸°Æ® Çϱâ À§Çؼ­´Â ÇÔ¼ö¸¦ ¿À¹ö·Îµù½ÃŰµç°¡ »õ·Î¿î À̸§ÀÇ ÇÔ¼ö¸¦ ¸¸µé¾î¾ß ÇÑ´Ù.

ÀÌ´Â ÇÔ¼öÀÇ ±¸ÇöÀÌ Áߺ¹µÇ¹Ç·Î ÁÁÁö ¾ÊÀº °ÍÀ̰í, À¯Áöº¸¼öÇϱⰡ Èûµé¾îÁö°Ô µÈ´Ù.

templateÀ» ¾²¸é ¿ì¸®´Â Äڵ带 Àç»ç¿ë°¡´ÉÇÏ°Ô ¸¸µé ¼ö ÀÖ´Ù. ¾Æ·¡¿Í °°Àº ÇÔ¼ö¸¦ º¸¶ó :

template<typename T> 
void print(const T& var) {
    std::cout << var << std::endl;
}

ÄÄÆÄÀÏ·¯´Â ¿ì¸®°¡ ¹«½¼ ŸÀÔÀ» ³Ñ°ÜÁÖµçÁö ¾Ë¾Æ¼­ print ÇÔ¼öÀÇ Äڵ带 ÀÚµ¿À¸·Î ¸¸µé¾î ÁÙ °ÍÀÌ´Ù. À̰ÍÀÌ templateÀÇ Áß¿äÇÑ ÀåÁ¡ÀÌ´Ù. Java´Â templateÀÌ ¾ø°í, µû¶ó¼­ Java¿¡¼­ÀÇ generic ÇÁ·Î±×·¡¹Ö°ú ÄÚµå Àç »ç¿ëÀº ´õ Èûµé´Ù.

·¹ÆÛ·±½º :


17. STL References

STL¿¡ °üÇÑ ´ÙÀ½ »çÀÌÆ®µéÀ» ¹æ¹®Çغ¸¶ó :

STL tutorials:

Main STL sites:


17.1. STL °³¿ä

STLÀº ÇÁ·Î±×·¡¸Ó¿¡°Ô ¸î°¡Áö À¯¿ëÇÑ µ¥ÀÌÅͱ¸Á¶¿Í ¾Ë°í¸®ÁòÀ» Á¦°øÇÑ´Ù. ÀÌ´Â ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÀÖ´Ù.

  • ÄÁÅ×À̳Ê. µÎ °¡Áö ŸÀÔÀÌ ÀÖ´Ù :

    • ¼øÂ÷Àû(Sequential). ¿©±â¿¡´Â vector, list, deque µîÀÌ ÀÖ´Ù.

    • Á¤·ÄµÈ Á¶ÇÕ(Associative). ¿©±â¿¡´Â set, map, multiset, multimap ÀÌ ÀÖ´Ù.

  • Iterator. ÄÁÅ×À̳ÊÀÇ ³»¿ëÀ» »ìÆìº¼ ¼ö ÀÖ°Ô ÇØÁÖ´Â Æ÷ÀÎÅÍ °°Àº °ÍµéÀÌ´Ù.

  • ÀϹÝÀûÀÎ(generic) ¾Ë°í¸®Áòµé. STLÀº ÄÁÅ×ÀÌ³Ê Å¸ÀÔ¿¡ ´ëÇØ µ¿ÀÛÇÏ´Â ¿©·¯°¡Áö È¿°úÀûÀ¸·Î ±¸ÇöµÈ Ç¥ÁØ ¾Ë°í¸®Áòµé (¿¹¸¦µé¾î find, sort, merge µî)ÀÌ ÀÖ´Ù. (¸î¸î containerµéÀº ÀÌ Áß ÀϺθ¦ Ưº°ÇÑ ¸ñÀûÀ¸·Î ¸â¹öÇÔ¼ö·Î °®°í ÀÖ´Ù)

  • Function obejct. function object´Â operator()ÀÇ Á¤ÀǸ¦ Á¦°øÇÏ´Â classÀÇ instanceÀÌ´Ù. ÀÌ´Â ÀÌ objectµéÀ» ÇÔ¼ö °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù.

  • Adaptors. STLÀº ´ÙÀ½°ú °°Àº °ÍµéÀ» Á¦°øÇÑ´Ù.

    • Container adaptor´Â vector¸¦ stackÀ» ¸¸µé±â À§ÇÑ ±âÃÊ·Î »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù.

    • function adaptor ´Â ÀÌ¹Ì Á¸ÀçÇÏ´Â function object·ÎºÎÅÍ »õ·Î¿î function object¸¦ ¸¸µé ¼ö ÀÖ°Ô ÇØÁØ´Ù.

  • Allocators. ¸ðµç STL ÄÁÅ×ÀÌ³Ê class´Â ÇÁ·Î±×·¥ÀÌ »ç¿ëÇÏ´Â ¸Þ¸ð¸® Á¤º¸¸¦ °®°í ÀÖ±â À§ÇÑ allocator class¸¦ »ç¿ëÇÑ´Ù. ÇÏÁö¸¸ ³ª´Â ÀÌ ºÎºÐÀº »ý·«ÇÒ °ÍÀÌ´Ù.

¾ÕÀ¸·Î vector, list, set ±×¸®°í map ÄÁÅ×À̳ÊÀÇ »ç¿ë¹ýÀ» »ìÆìº¼ °ÍÀÌ´Ù. À̵éÀ» »ç¿ëÇϱâ À§Çؼ­´Â ³»°¡ STL iterator¿¡ ´ëÇØ ¸»ÇÒ ¼ö ÀÖµµ·Ï iterator¸¦ ¾µ ÁÙ ¾Ë¾Æ¾ß ÇÒ °ÍÀÌ´Ù. ¶Ç set°ú map ÄÁÅ×À̳ʸ¦ »ç¿ëÇÑ´Ù´Â °ÍÀº ³»°¡ function object¿¡ ´ëÇØ ¹º°¡ ¼³¸íÇÒ ¼ö ÀÖµµ·Ï °£´ÜÇÑ function object°¡ ÀÖ¾î¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. STLÀÌ Áö¿øÇÏ´Â ¾Ë°í¸®Áò¿¡ ´ëÇØ¼­´Â °£´ÜÈ÷ ¼³¸íÇÒ °ÍÀ̰í, adoptor´Â ¾ð±ÞÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù.

¸î¸î ÇÔ¼ö ÀÎÀÚÀÇ Å¸ÀÔ¿¡ ´ëÇØ¼­ À̸§ÀÌ ¹Ù²ð ¼ö ÀÖ´Ù. ¿¹¸¦µé¾î ´ëºÎºÐÀÇ int ŸÀÔ ÀÎÀÚµéÀº ½ÇÁ¦·Î´Â size_typeÀ̶ó´Â typeÀ» °®°í À̰ÍÀÌ ÀûÀýÇÑ ±âº» ŸÀÔÀ¸·Î tyepdefµÇ´Â ÇüÅ¿¡ ÀÇÇØ ¾²ÀδÙ. ¸¸¾à ¿©·¯ ÇÔ¼öµéÀÇ ½ÇÁ¦ ÀÎÀÚ Å¸ÀÔÀ» ¾Ë°í½Í´Ù¸é ÀÛ¾÷ÇÏ´Â °Í¿¡ ´ëÇÑ ¹®¼­³ª Çì´õÆÄÀÏÀ» Âü°íÇØ¶ó.

STL¿¡¼­ Á¦°øµÇ´Â ¸î°¡Áö À¯Æ¿¸®Æ¼ classµéÀÌ Àִµ¥, ÀÌ Áß Á¦ÀÏ Áß¿äÇÑ °ÍÀº pair classÀÌ´Ù. ÀÌ´Â ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾîÀÖ´Ù.

template<class T1, class T2>
class pair {
public:
    T1 first;
    T2 second;
    pair(const T1& a, const T2& b) : first(a), second(b) {}

};

±×¸®°í ½±°Ô pair¸¦ ¸¸µéµµ·Ï ´ÙÀ½°ú °°Àº make_pair ÇÔ¼ö°¡ Á¦°øµÈ´Ù :

pair<T1,T2> make_pair(const T1& f, const T2&,s)

¶ÇÇÑ ==¿Í < ¿¬»êÀÚµµ ÀÖ´Ù. ÀÌ template class¿¡´Â º¹ÀâÇÑ °ÍÀÌ ¾ø°í ±×³É »ç¿ëÇÏ¸é µÈ´Ù. À̸¦ ÀÌ¿ëÇϱâ À§Çؼ­´Â #include ·Î <utility>¸¦ includeÇÏ¸é µÈ´Ù. pair´Â ¿©·¯°÷¿¡¼­ ¾²ÀÏ ¼ö Àִµ¥, ƯÈ÷ set°ú map class¿¡¼­ ¸¹ÀÌ ³ªÅ¸³­´Ù.


17.2. Çì´õ ÆÄÀÏ

STLÀ» »ç¿ëÇϱâ À§Çؼ­´Â ÀûÀýÇÏ°Ô Çì´õÆÄÀÏÀ» #include ÇØÁÖ¾î¾ß ÇÑ´Ù. ¸¸¾à ÄÄÆÄÀÏ·¯°¡ Ç¥ÁØ¿¡ ¸ÂÁö ¾Ê´Â´Ù¸é ¾à°£ ´Ù¸¦ ¼öµµ ÀÖÁö¸¸, Ç¥ÁØ¿¡ ¸Â´Â ÄÄÆÄÀÏ·¯ (g++ °°Àº)´Â ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù :

  • <vector> : º¤ÅÍ Å¸ÀÔ

  • <list> : ¸®½ºÆ® ŸÀÔ

  • <set> : ÁýÇÕ(set) ŸÀÔ

  • <map> : ¸Ê ŸÀÔ

  • <algorithm> : ÀϹÝÀûÀÎ ¾Ë°í¸®Áò µé

Ç¥ÁØ C++ ¶óÀ̺귯¸®´Â .h ¸¦ µÚ¿¡ ºÙÀÌÁö ¾Ê´Â ´Ù´Â °Í¿¡ ÁÖÀÇÇØ¶ó. ¸¸¾à ¿¾¹öÀüÀÇ È¤Àº ÁÁÁö ¾ÊÀº ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇϴµ¥, À§¿Í °°ÀÌ ÇØ¼­ include°¡ µÇÁö ¾Ê´Â´Ù¸é .h¸¦ ºÙ¿©¼­ ½ÃµµÇغ¸¾Æ¶ó. ÇÏÁö¸¸ ±×º¸´Ù´Â »õ·Î¿î ÄÄÆÄÀÏ·¯¸¦ ±¸ÇÏ´Â °Ô ´õ ³ªÀ» °ÍÀÌ´Ù.


17.3. ÄÁÅ×ÀÌ³Ê class ÀÎÅÍÆäÀ̽º

ÄÁÅ×ÀÌ³Ê classµéÀº ¼­·Î °°Àº À̸§À» °®´Â ¸â¹öÇÔ¼ö¸¦ ¸¹ÀÌ °®´Â´Ù. ÀÌ ÇÔ¼öµéÀº ¸ðµç class¿¡ ´ëÇØ ¶È°°Àº (ȤÀº ¸Å¿ì ºñ½ÁÇÑ) ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù (±×·¯³ª ¹°·Ð ±× ³»ºÎ ±¸ÇöÀº ´Ù¸¦ °ÍÀÌ´Ù). ¾Æ·¡ÀÇ Ç¥´Â ¿ì¸®°¡ »ìÆìº¼ ÇÔ¼öµéÀ» ³ª¿­ÇÑ °ÍÀÌ´Ù. º°Ç¥´Â ±× ÄÁÅ×ÀÌ³Ê Å¸ÀÔÀÌ ±× À̸§ÀÇ ¸â¹ö ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù´Â °ÍÀÌ´Ù.

표 2. ÄÁÅ×ÀÌ³Ê Class ÀÎÅÍÆäÀ̽º

¿¬»êÀÚ/ÇÔ¼ö¸í¸ñÀû vector list set map
== ºñ±³ * ***
< ºñ±³ * * * *
begin iterator * * * * 
end iterator * * * *
size ¿ø¼ÒÀÇ ¼ö * * * *
empty ºñ¾ú´ÂÁö * * * *
front ù¹øÂ° ¿ø¼Ò * *   
back ¸¶Áö¸· ¿ø¼Ò * *   
[ ] ¿ø¼Ò Á¢±Ù ¹× º¯°æ *    * 
insert ¿ø¼Ò(µé) Ãß°¡ * * * *
push_back ¸Ç µÚ¿¡ ¿ø¼Ò Ãß°¡ * *   
push_front ¸Ç ¾Õ¿¡ ¿ø¼Ò Ãß°¡  *   
erase ¿ø¼Ò(µé) »èÁ¦ * * * *
pop_back ¸Ç µÚ ¿ø¼Ò »èÁ¦ * *   
pop_front ¸Ç ¾Õ ¿ø¼Ò »èÁ¦  *  
   

¸¸¾à ¾Æ·¡ÀÇ ³»¿ëÁß Àǹ®°¡´Â ºÎºÐÀÌ ÀÖÀ¸¸é (¾Æ¸¶µµ ÀÕÀ» °ÍÀÌ´Ù), Á¶±×¸¸ Å×½ºÆ® ÇÁ·Î±×·¥À» Çϳª Â¥¼­ ¾î¶»°Ô µ¹¾Æ°¡´Â Áö ¾Ë¾Æº¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.


17.4. º¤ÅÍ : Vectors

º¤ÅÍ´Â C++ÀÇ ¹è¿­°ú ºñ½ÁÇÑ, ÇÏÁö¸¸ À̸¦ ¹ßÀü½ÃŲ ÄÁÅ×À̳ÊÀÌ´Ù. ƯÈ÷, º¤ÅÍ´Â ¼±¾ð½Ã¿¡ ¾ó¸¶³ª º¤ÅͰ¡ Ä¿¾ßÇÒÁö¸¦ ¾Ë Çʿ䰡 ¾ø°í, push_back ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ¾ðÁ¦³ª »õ·Î¿î ¿ø¼Ò¸¦ Ãß°¡ÇÒ ¼ö ÀÖ´Ù. ( »ç½Ç insert ÇÔ¼ö°¡ ¾îµð¿¡µç »õ ¿ø¼ÒµéÀ» ³ÖÀ» ¼ö ÀÖ°Ô ÇØÁÖÁö¸¸, ÀÌ´Â ¸Å¿ì ºñÈ¿À²ÀûÀÌ´Ù. ¸¸¾à À̸¦ ÀÚÁÖ ÇØ¾ßÇÑ´Ù¸é list¸¦ ´ë½Å »ç¿ëÇÏ´Â °ÍÀ» °í·ÁÇØº¸¾Æ¶ó. )


17.4.1. º¤ÅÍ ¸¸µé±â

º¤ÅÍ´Â class templateÀ̹ǷÎ, ¼±¾ð½Ã¿¡ º¤ÅͰ¡ °®°Ô µÉ °´Ã¼ÀÇ Å¸ÀÔÀ» ¼±¾ðÇØÁÖ¾î¾ß ÇÑ´Ù. ¿¹¸¦µé¾î ´ÙÀ½°ú °°´Ù.

vector<int> v1;
vector<string> v2;
vector<FiniteAutomaton> v3;

À§ ³»¿ëÀº v1À» int °ªÀ» °®´Â º¤ÅÍ·Î, v2¸¦ stringÀ» °®´Â º¤ÅÍ·Î, v3¸¦ FiniteAutomaton (¾Æ¸¶µµ ¹Ì¸® ÀÌ·± ŸÀÔÀÌ ¼±¾ðµÇ¾úÀ» °ÍÀÌ´Ù) ¸¦ °®°í ÀÖ´Â º¤ÅÍ·Î ¼±¾ðÇÑ´Ù. ÀÌ ¼±¾ðµéÀº º¤ÅÍÀÇ Å©±â¿¡ ´ëÇØ ÀüÇô ¾Ë·ÁÁÖÁö ¾Ê°í ( ±¸Çö¿¡ µû¶ó ±âº» º¤ÅÍ »çÀÌÁî°¡ ÀÖÀ» °ÍÀÌ´Ù. ) , Çʿ信 µû¶ó ¾ó¸¶µçÁö ´Ã·Á¼­ ¾µ ¼ö ÀÖ´Ù.

±×·¯³ª ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇÔÀ¸·Î½á Ãʱâ Å©±â¸¦ Á¤ÇØÁÙ ¼öµµ ÀÖ´Ù.

vector<char> v4(26);

ÀÌ´Â v4°¡ ¹®ÀÚ(char)ÀÇ º¤ÅͰ¡ µÇ°í, óÀ½¿¡´Â 26°³ÀÇ ±ÛÀÚ¸¦ °¡Áú ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¶ÇÇÑ, º¤ÅÍ ¾È¿¡ µé¾î°¡´Â ¼öµéÀ» ÃʱâÈ­ ÇÏ´Â ¹æ¹ýµµ Àִµ¥, ÀÌ´Â ´ÙÀ½°ú °°´Ù.

vector<float> v5(100,1.0);

À§ ¼±¾ðÀº v5 °¡ 100°³ÀÇ 1.0À¸·Î ÃʱâÈ­ µÈ ½Ç¼ö°ªÀ» °®´Â º¤ÅÍÀÓÀ» ¼±¾ðÇÑ´Ù.


17.4.2. º¤Å͸¦ üũÇϱâ

Çѹø º¤Å͸¦ ¸¸µç ÈÄ¿¡´Â, size ÇÔ¼ö¸¦ ½á¼­ ÇöÀç º¤ÅÍÀÇ Å©±â¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. ÀÌ ÇÔ¼ö´Â ¾Æ¹« ÀÎÀÚ ¾øÀÌ º¤ÅÍ¿¡ µé¾îÀÖ´Â ¿ø¼Ò ¼ö¸¦ ³ªÅ¸³»´Â integer¸¦ ¸®ÅÏÇÑ´Ù. ( ¾ö¹ÐÇÏ°Ô ¸»ÇÏÀÚ¸é size_type ŸÀÔÀÌ ¸®ÅϵÇÁö¸¸, À̰ÍÀÌ ¹Ù·Î integer·Î ¹Ù²î¾îÁø´Ù ) ±×·¸´Ù¸é ´ÙÀ½ÀÇ ÀÛÀº ÇÁ·Î±×·¥À¸·Î ¹«¾ùÀÌ Ãâ·ÂµÉ±î?

<vector-size.cpp>=
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v1;
    vector<int> v2(10);
    vector<int> v3(10,7);

    cout << "v1.size() returns " << v1.size() << endl;
    cout << "v2.size() returns " << v2.size() << endl;
    cout << "v3.size() returns " << v3.size() << endl;
}

º¤ÅͰ¡ ºñ¾ú´ÂÁö¸¦ üũÇϱâ À§Çؼ­´Â, empty ÇÔ¼ö¸¦ ¾²¸é µÈ´Ù. À̰͵µ ¿ª½Ã ¾Æ¹« ÀÎÀÚ ¾øÀÌ boolean °ªÀ» ¸®ÅÏÇϴµ¥, ºñ¾îÀÖÀ¸¸é true¸¦, ºñ¾îÀÖÁö ¾ÊÀ¸¸é false¸¦ ¸®ÅÏÇÑ´Ù. ±×·¸´Ù¸é ´ÙÀ½ÀÇ ÇÁ·Î±×·¥Àº ¹«¾ùÀ» ÇÁ¸°Æ®ÇÒ±î (true´Â 1·Î, false´Â 0À¸·Î ÇÁ¸°Æ®µÈ´Ù)?

<vector-empty.cpp>=
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v1;
    vector<int> v2(10);
    vector<int> v3(10,7);

    cout << "v1.empty() has value " << v1.empty() << endl;
    cout << "v2.empty() has value " << v2.empty() << endl;
    cout << "v3.empty() has value " << v3.empty() << endl;
}


17.4.3. º¤ÅÍÀÇ ¿ø¼Ò¿¡ Á¢±ÙÇϱâ

º¤ÅÍÀÇ ¿ø¼Ò´Â []¿¬»êÀÚ¸¦ »ç¿ëÇØ¼­ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. µû¶ó¼­ ¸ðµç ¿ø¼Ò¸¦ ÇÁ¸°Æ®ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.

vector<int> v;
// ...
for (int i=0; i<v.size(); i++)
     cout << v[i];

(ÀÌ´Â ¿ø·¡ÀÇ ¹è¿­À» »ç¿ëÇÏ´Â °Í°ú ¸Å¿ì ºñ½ÁÇÏ´Ù).

¶ÇÇÑ, [] ¿¬»êÀÚ´Â º¤ÅÍ ¿ø¼ÒÀÇ °ªÀ» ¹Ù²Ù±â À§Çؼ­µµ ¾²ÀÏ ¼ö ÀÖ´Ù.

vector<int> v;
// ...
for (int i=0; i<v.size(); i++)
      v[i] = 2*i;

front ÇÔ¼ö´Â º¤ÅÍÀÇ Ã¹¹øÂ° ¿ø¼Ò¸¦ ¸®ÅÏÇÑ´Ù.

vector<char> v(10,'a');
// ...
char ch = v.front();

¶ÇÇÑ, front¸¦ ÀÌ¿ëÇØ¼­ ù¹øÂ° ¿ø¼ÒÀÇ °ªÀ» ¹Ù²Ü ¼öµµ ÀÖ´Ù.

vector<char> v(10,'a');
// ...
v.front() = 'b';

back ÇÔ¼ö´Â front¿Í °°Àº ¿ªÇÒÀ» ÇÏÁö¸¸, º¤ÅÍÀÇ ¸Ç ¸¶Áö¸· ¿ø¼Ò¸¦ ¸®ÅÏÇÏ´Â °ÍÀÌ ´Ù¸£´Ù.

vector<char> v(10,'z');
// ...
char last = v.back();
v.back() = 'a';

[]¸¦ »ç¿ëÇÏ´Â °£´ÜÇÑ ¿¹Á¦¸¦ º¸ÀÚ.

<vector-access.cpp>=
#include <vector>
#include <iostream>

using namespace std;

int main()
{
    vector<int> v1(5);
    int x;
    cout << "Enter 5 integers (seperated by spaces):" << endl;
    for (int i=0; i<5; i++)
          cin >> v1[i];
    cout << "You entered:" << endl;
    for (int i=0; i<5; i++)
          cout << v1[i] << ' ';
    cout << endl;
}


17.4.4. º¤ÅÍÀÇ ¿ø¼Ò¸¦ Ãß°¡ / »èÁ¦Çϱâ

À§¿¡ ¾ð±ÞµÈ [] ¿Ü¿¡µµ, º¤ÅÍÀÇ ¿ø¼Ò¿¡ Á¢±ÙÇϰųª ¹Ù²Ü ¼ö ÀÖ´Â ¹æ¹ýÀÌ ¸î°¡Áö ´õ ÀÖ´Ù.

  • push_backÀº »õ·Î¿î ¿ø¼Ò¸¦ º¤ÅÍÀÇ ³¡¿¡ ´õÇÒ °ÍÀÌ´Ù.

  • pop_backÀº º¤ÅÍÀÇ ³¡¿¡¼­ ¿ø¼Ò¸¦ Çϳª ¾ø¾Ù °ÍÀÌ´Ù.

  • insert ´Â Çϳª ¶Ç´Â ¿©·¯°³ÀÇ ¿ø¼Ò¸¦ º¤ÅÍÀÇ ¿øÇÏ´Â À§Ä¡¿¡ »ðÀÔÇÒ °ÍÀÌ´Ù.

  • erase´Â Çϳª ¶Ç´Â ¿©·¯°³ÀÇ ¿ø¼Ò¸¦ ¿øÇÏ´Â À§Ä¡¿¡¼­ ¾ø¾Ù °ÍÀÌ´Ù.

±×·±µ¥ insert³ª erase´Â º¤ÅÍ¿¡¼­ ¿À¹öÇìµå°¡ Å« ¿¬»êÀÓ¿¡ ÁÖÀÇÇ϶ó. ¸¸¾à insert³ª erase¸¦ ½á¾ßÇÑ´Ù¸é, º¤ÅÍ ´ë½Å list µ¥ÀÌÅͱ¸Á¶¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ´õ È¿À²ÀûÀÏ °ÍÀÌ´Ù.

<vector-mod.cpp>=
#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;

    for (int i=0; i<10; i++) v.push_back(i);
    cout << "Vector initialised to:" << endl;
    for (int i=0; i<10; i++) cout << v[i] << ' ' ;
    cout << endl;

    for (int i=0; i<3; i++) v.pop_back();
    cout << "Vector length now: " << v.size() << endl;
    cout << "It contains:" << endl;
    for (int i=0; i<v.size(); i++) cout << v[i] << ' ';
    cout << endl;

    int a1[5];
    for (int i=0; i<5; i++) a1[i] = 100;

    v.insert(& v[3], & a1[0],& a1[3]);
    cout << "Vector now contains:" << endl;
    for (int i=0; i<v.size(); i++) cout << v[i] << ' ';
    cout << endl;

    v.erase(& v[4],& v[7]);
    cout << "Vector now contains:" << endl;
    for (int i=0; i<v.size(); i++) cout << v[i] << ' ';
    cout << endl;
}

À§ÀÇ ¿¹¿¡¼­´Â º¤ÅÍ v°¡ ¼±¾ðµÈ ÈÄ, push_backÀ» »ç¿ëÇÏ¿© ÃʱâÈ­ µÇ¾ú´Ù. ±×¸®°í pop_backÀ¸·Î µÚÀÇ ¸î ¿ø¼Ò°¡ ¾ø¾îÁ³°í, ¹è¿­ÀÌ Çϳª ¸¸µé¾îÁ®¼­ ±× ³»¿ëÀÌ insert¸¦ »ç¿ëÇØ¼­ v¿¡ »ðÀԵǾú´Ù. ¸¶Áö¸·À¸·Î ¸î¸î ¿ø¼ÒµéÀ» Áö¿ì±â À§ÇØ erase°¡ »ç¿ëµÇ¾ú´Ù. À§¿¡ »ç¿ëµÈ ÇÔ¼öµéÀº ´ÙÀ½°ú °°Àº ÀÎÀÚµéÀ» ¹Þ´Â´Ù.

  • push_back : vector¿¡ µé¾î°¡´Â °Í°ú °°Àº ŸÀÔÀÇ ÀÎÀÚ¸¦ Çϳª ¹Þ´Â´Ù.

  • pop_back : ÀÎÀÚ¸¦ ¹ÞÁö ¾Ê´Â´Ù. ±×¸®°í ºó º¤ÅÍ¿¡ ´ëÇØ pop_backÀ» ÇÏ¸é ¾ÈµÈ´Ù.

  • insert ´Â ¼¼ °¡Áö ÇüÅ·Π¾²ÀδÙ.

    • insert(pos, T& x) : ¿ø¼Ò x Çϳª¸¦ pos°¡ °¡¸®Å°´Â À§Ä¡¿¡ »ðÀÔÇÑ´Ù.

    • insert(pos, start, end) : ´Ù¸¥ ÄÁÅ×ÀÌ³Ê ¾ÈÀÇ ³»¿ëÀ» pos°¡ °¡¸®Å°´Â À§Ä¡¿¡ »ðÀÔÇÑ´Ù.

    • »ðÀԵǴ ¿ø¼ÒµéÀº start¿¡¼­ ½ÃÀÛÇØ¼­, end¸¦ ¸¸³¯ ¶§±îÁö (end°¡ °¡¸®Å°´Â °ÍÀº µé¾î°¡Áö ¾Ê´Â´Ù) ÀÌ´Ù.

    • insert(pos, int rep, T& x) : rep °³ÀÇ x°ªÀ» pos À§Ä¡¿¡ »ðÀÔÇÑ´Ù. (°°Àº °ªÀ» ¿©·¯¹ø »ðÀÔ)

À§ÀÇ Äڵ忡 ³ª¿ÍÀÖµíÀÌ, pos°¡ °¡¸®Å°´Â Æ÷Áö¼Ç °ªÀº ¿ø¼Ò°¡ »ðÀ﵃ °÷ÀÇ ÁÖ¼Ò¿©¾ß ÇÑ´Ù. ¸¶Âù°¡Áö·Î start¿Í endµµ ÁÖ¼Ò°ªÀ̾î¾ß ÇÑ´Ù. (»ç½Ç À̰ÍÀº À̵éÀÌ iteratorÀ̱⠶§¹®ÀÌ´Ù. ÀÌ¿¡ ´ëÇØ¼­´Â ´ÙÀ½ Àå¿¡¼­ ´õ »ìÆìº¼ °ÍÀÌ´Ù.)

  • erase´Â µÎ °¡Áö ÇüÅ·Π¾²Àδ٠(pos, start¿Í end´Â insert¿Í °°Àº Çü½ÄÀ» °®´Â´Ù)

    • erase(pos) : pos°¡ °¡¸®Å°´Â À§Ä¡ÀÇ ¿ø¼Ò¸¦ ¾ø¾Ø´Ù.

    • erase(start,end) : start¿¡¼­ end±îÁö(end´Â Æ÷ÇÔÇÏÁö ¾ÊÀ½)¿¡ ÇØ´çÇÏ´Â ¿ø¼ÒµéÀ» ¾ø¾Ø´Ù.


17.4.5. Vector Iterator

º¤ÅÍ vÀÇ ¿ø¼ÒµéÀ» Â÷·Ê´ë·Î º¸´Â °¡Àå ½¬¿î ¹æ¹ýÀº À§¿¡ ÇÑ ¹æ¹ý°°ÀÌ ÇÏ´Â °ÍÀÌ´Ù.