· 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://www.faqs.org/docs/Linux-HOWTO/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ÀÇ ¿ø¼ÒµéÀ» Â÷·Ê´ë·Î º¸´Â °¡Àå ½¬¿î ¹æ¹ýÀº À§¿¡ ÇÑ ¹æ¹ý°°ÀÌ ÇÏ´Â °ÍÀÌ´Ù.

for (int i=0; i<v.size(); i++) { ... v[i] ... }

¶Ç´Ù¸¥ ¹æ¹ýÀº ¹Ù·Î iterator¸¦ ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù. iterator´Â ÄÁÅ×À̳ÊÀÇ Æ÷ÀÎÅͶó°í »ý°¢ÇÏ¸é µÈ´Ù. µû¶ó¼­ À̸¦ Áõ°¡½ÃÅ°¸é¼­ ¿ø¼Ò¸¦ Çϳª¾¿ Á¢±ÙÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù. º¤ÅÍ°¡ ¾Æ´Ñ ÄÁÅ×À̳ÊÀÇ °æ¿ì´Â iterator°¡ ¿ø¼Ò¸¦ Â÷·Ê´ë·Î Á¢±ÙÇÒ ¼ö ÀÖ´Â À¯ÀÏÇÑ ¹æ¹ýÀÌ´Ù.

type TÀÇ ¿ø¼Ò¸¦ °®°í ÀÖ´Â º¤ÅÍÀÇ °æ¿ì :

vector<T> v;

iterator´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÈ´Ù.

vector<T>::iterator i;

ÀÌ·¯ÇÑ iterator´Â begin()À̳ª end()°°Àº ÇÔ¼ö¿¡ ÀÇÇØ ¸®ÅϵǴ °ªÀ¸·Î ¸¸µé¾îÁø´Ù. °°Àº ŸÀÔÀÇ iteratorµéÀº == ³ª != ·Î ºñ±³°¡´ÉÇÏ°í, ++À» ÀÌ¿ëÇÑ Áõ°¡³ª *¸¦ ÀÌ¿ëÇÑ ÂüÁ¶ µîÀÌ °¡´ÉÇÏ´Ù. [ ÀÌ ¿Ü¿¡µµ º¤ÅÍ iterator´Â ´õ ¸¹Àº ¿¬»êÀÚ¸¦ °®°í ÀÖ´Ù. ÀÌ¿¡ ´ëÇؼ­´Â ´ÙÀ½ ÀåÀ» Âü°íÇضó ].

´ÙÀ½Àº iterator¸¦ ¾î¶»°Ô º¤ÅÍ¿Í »ç¿ëÇÏ´Â Áö¿¡ ´ëÇÑ ¿¹Á¦ÀÌ´Ù.

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

using namespace std;

int main()
{
    vector<int> v(10);

    int j = 1;

    vector<int>::iterator i;

    // v¸¦ 1¿¡¼­ 10±îÁöÀÇ Á¤¼ö·Î ä¿î´Ù.
    i = v.begin();
    while (i != v.end())
    {
        *i = j;
        j++;
        i++;
    }

    // vÀÇ °¢ ¿ø¼Ò¸¦ Á¦°öÇÑ´Ù.
    for (i=v.begin(); i!=v.end(); i++) *i = (*i) * (*i);

    // vÀÇ ³»¿ëÀ» Ãâ·ÂÇÑ´Ù.
    cout << "The vector v contains: ";
    for (i=v.begin(); i!=v.end(); i++) cout << *i << ' ';
    cout << endl;

}

*i °¡ µîÈ£ÀÇ ¿ÞÂÊ(LHS)¿¡¼­´Â °ªÀ» º¯°æÇϱâ À§ÇØ, ¿À¸¥ÂÊ(RHS)¿¡¼­´Â °ªÀ» ÂüÁ¶Çϱâ À§ÇØ ¾²ÀÎ °Í¿¡ ÁÖ¸ñÇضó.


17.4.6. º¤ÅÍÀÇ ºñ±³

µÎ °³ÀÇ º¤Å͸¦ ==¿Í <¸¦ ÀÌ¿ëÇؼ­ ºñ±³ÇÒ ¼ö ÀÖ´Ù. ==´Â ¾ç ÂÊÀÇ º¤ÅÍ°¡ °°Àº ¼öÀÇ ¿ø¼Ò¸¦ °®°í ´ëÀÀµÇ´Â °¢¿ø¼ÒµéÀÌ ¸ðµÎ °°À» ¶§ true¸¦ ¸®ÅÏÇÒ °ÍÀÌ´Ù. <Àº µÎ º¤ÅÍÀÇ ¿ø¼ÒµéÀ» Â÷·Ê´ë·Î »çÀü¼ø¼­(lexicographical order)´ë·Î ºñ±³ÇÑ´Ù. ¿¹¸¦µé¾î v1°ú v2¸¦ ºñ±³ÇÑ´Ù°í Çغ¸ÀÚ (v1 < v2). i=0À̶ó ÇÒ ¶§, v1[i] < v2[i] À̸é true¸¦ ¸®ÅÏÇÏ°í, v1[i] > v2[i] À̸é false¸¦ ¸®ÅÏÇÑ´Ù. ¸¸¾à µÑÀÌ °°À¸¸é i¸¦ Áõ°¡½ÃŲ´Ù (Áï, ´ÙÀ½ ¿ø¼Ò·Î ³Ñ¾î°£´Ù). ¸¸¾à v1ÀÇ ³¡ÀÌ v2°¡ ³¡³ª±â Àü¿¡ ³ªÅ¸³µ´Ù¸é (Áï, v1ÀÇ ¿ø¼ÒÀÇ °³¼ö°¡ ´õ ÀÛ°í, v1ÀÌ v2ÀÇ ¾ÕºÎºÐ°ú ³»¿ëÀÌ °°À» ¶§) true¸¦ ¸®ÅÏÇÏ°í, ±×·¸Áö ¾ÊÀ¸¸é false¸¦ ¸®ÅÏÇÑ´Ù. ´ÙÀ½ÀÇ ¿¹¸¦ º¸ÀÚ.

(1,2,3,4) < (5,6,7,8,9,10) ´Â false.
(1,2,3) < (1,2,3,4) ´Â true
(1,2,3,4) < (1,2,3) ´Â false
(0,1,2,3) < (1,2,3) ´Â true

¾Æ·¡ÀÇ ÄÚµå´Â À§¿¡¼­ ¼¼¹ø° ¿¹¸¦ º¸¿©ÁØ´Ù.

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

using namespace std;

int main()
{
    vector<int> v1;
    vector<int> v2;
    for (int i=0; i<4; i++) v1.push_back(i+1);
    for (int i=0; i<3; i++) v2.push_back(i+1);

    cout << "v1: ";
    for (int i=0; i<v1.size(); i++) cout << v1[i] << ' ';
    cout << endl;

    cout << "v2: ";
    for (int i=0; i<v2.size(); i++) cout << v2[i] << ' ';
    cout << endl;

    cout << "v1 < v2 is: " << (v1<v2 ? "true" : "false") << endl;
}
<= ¿Í >= ¿ª½Ã ¿¹»óÇÏ´Â ´ë·Î µ¿ÀÛÇÒ °ÍÀÌ´Ù.


17.6. ¸®½ºÆ®

17절ÀåÀ» ºÁ¶ó.


17.7. ÁýÇÕ(Set)

set ÄÁÅ×ÀÌ³Ê Å¸ÀÔÀº º¤ÅÍ°°ÀÌ À妽º¸¦ ÅëÇØ ¿ø¼Ò¿¡ Á¢±ÙÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, ¿ø¼Ò¸¦ Á÷Á¢ ÀúÀåÇÏ°í »¬ ¼ö ÀÖµµ·Ï ÇØÁØ´Ù. set ÄÁÅ×À̳ʴ ¼­·Î ´Ù¸¥ ¿ø¼Òµé¸¸À» °®´Â ¼öÇÐÀûÀÎ ÁýÇÕ°ú °°ÀÌ µ¿ÀÛÇÑ´Ù. ±×·¯³ª, ¼öÇÐÀûÀÎ ÁýÇÕ°ú´Â ´Ù¸£°Ô, ÁýÇÕ ¾ÈÀÇ ¿ø¼ÒµéÀº (»ç¿ëÀÚ°¡ ÁöÁ¤ÇÏ´Â) ¾î¶² ¼ø¼­ ´ë·Î ÀúÀåµÇ°Ô µÈ´Ù. ½ÇÁ¦·Î ÀÌ°ÍÀº set ÄÁÅ×À̳ʷΠ¼öÇÐÀûÀÎ ÁýÇÕÀ» ±¸ÇöÇÏ´Â µ¥ ÀÖ¾î ÀÛÀº Á¦ÇÑÀÏ »ÓÀÌ°í, ÀÌ·¸°Ô ÇÔÀ¸·Î½á ¼ø¼­°¡ ¾ø´Â °Íº¸´Ù ¸¹Àº ¿¬»ê¿¡¼­ ´õ È¿À²ÀûÀÌ µÉ ¼ö ÀÖ´Ù.


17.7.1. SetÀ» ¸¸µé±â

set ÄÁÅ×À̳ʸ¦ ¸¸µé±â À§Çؼ­´Â µÎ °¡Áö template ÀÎÀÚ°¡ ÇÊ¿äÇÏ´Ù - ÀÌ´Â setÀÌ °®°Ô µÉ ¿ø¼ÒµéÀÇ Å¸ÀÔ°ú µÎ ¿ø¼Ò¸¦ ºñ±³ÇÒ ¼ö ÀÖ´Â ºñ±³ÇÔ¼ö function objectÀÇ Å¸ÀÔÀÌ´Ù.

set<T, Compare> s;

(set < T > s¿Í °°Àº ¼±¾ðµµ °¡´ÉÇؾßÇÑ´Ù. ÀÌ´Â µÎ¹ø° ÀÎÀڷμ­ µðÆúÆ® template ÀÎÀÚÀÎ less < T >¸¦ »ç¿ëÇÑ´Ù. ÇÏÁö¸¸ ¸¹Àº C++ ÄÄÆÄÀÏ·¯ (g++Æ÷ÇÔ)°¡ ±âº» template ÀÎÀÚ¸¦ Áö¿øÇÏÁö ¸øÇÏ°í ÀÖ´Ù.)

°£´ÜÇÑ Å¸ÀÔ T ¿¡ ´ëÇؼ­´Â less < T > function object¸¦ ¾µ ¼öµµ ÀÖ´Ù. ( "function object"°¡ ¹«¾ùÀΰ¡ ÇÏ´Â °í¹ÎÀº ÇÒÇÊ¿ä ¾ø´Ù.) ¿¹¸¦µé¾î ¾Æ·¡¿Í °°ÀÌ ¼±¾ðÇÏ¸é µÈ´Ù.

set<int, less<int> > s1;
set<double, less<double> > s2;
set<char, less<char> > s3;
set<string, less<string> > s4;

( ¼±¾ðÇÒ ¶§ µÚÂÊÀÇ > µÎ °³°¡ space·Î ¶ç¾îÁ® ÀÖÀ½¿¡ ÁÖÀÇÇ϶ó. ÀÌ´Â compiler°¡ >¸¦ ½¬ÇÁÆ® ¿¬»êÀÚ(>>) ¿Í ±¸º°Çϱâ À§ÇØ ²À ÇÊ¿äÇÑ °ÍÀÌ´Ù.) °¢°¢ÀÇ °æ¿ì function objectµéÀº °¢°¢ÀÇ Å¸ÀÔ¿¡ ¸Â°Ô <¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. (ÀÌ´Â °¢°¢ int, double, char, string ŸÀÔÀÌ´Ù. )

¾Æ·¡ÀÇ ÄÚµå´Â Á¤¼ö(int)ÀÇ setÀ» ¼±¾ðÇÏ°í, insert ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© Á¤¼ö¸¦ ¸î°³ Ãß°¡ÇÑ´Ù. ±×¸®°í setÀ» Â÷·Ê´ë·Î º¸¸é¼­ ¿ø¼ÒµéÀ» Ãâ·ÂÇÑ´Ù. Àç¹ÌÀÖ´Â °ÍÀº Ãß°¡ÇÏ´Â ¼ø¼­°¡ ¾î¶² ¼ø¼­À̵çÁö setÀÇ ³»¿ëÀº Á¤·ÄµÈ »óÅ·ΠÃâ·ÂµÈ´Ù´Â °ÍÀÌ´Ù.

<set-construct1.cpp>=
#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int, less<int> > s;
    set<int, less<int> >::iterator i;

    s.insert(4);
    s.insert(0);
    s.insert(-9);
    s.insert(7);
    s.insert(-2);
    s.insert(4);
    s.insert(2);

    cout << "The set contains the elements: ";
    for (i=s.begin(); i!=s.end(); i++) cout << *i << ' ';
    cout << endl;
}

4°¡ µÎ¹ø Ãß°¡µÇ¾úÀ½¿¡µµ ºÒ±¸ÇÏ°í, Çѹø¹Û¿¡ ³ª¿ÀÁö ¾Ê´Â °Í¿¡ ÁÖÀÇÇضó. ÀÌ´Â ÁýÇÕÀ̱⠶§¹®¿¡ ´ç¿¬ÇÑ °ÍÀÌ´Ù.


17.7.2. Function Objects¶õ ¹«¾ùÀΰ¡?

C++ÀÇ ¸ÚÁø Ư¡ Áß Çϳª´Â ¿¬»êÀÚÀÇ ¿À¹ö·ÎµùÀÌ´Ù. µû¶ó¼­ »õ·Î ¸¸µé¾îÁø class¿¡ ´ëÇØ + °¡ ¾î¶² Àǹ̵çÁö °®µµ·Ï ÇÒ ¼ö ÀÖ´Ù. ±×·±µ¥, C++¿¡¼­ ¿À¹ö·Îµå ÇÒ ¼ö ÀÖ´Â ¿¬»êÀÚ Áß ÇÔ¼ö È£Ãâ ¿¬»êÀÚÀÎ ()°¡ ÀÖ°í, ÀÌ´Â classÀÇ ÀνºÅϽº°¡ ÇÔ¼ö¿Í °°ÀÌ µ¿ÀÛÇÒ ¼ö ÀÖµµ·Ï ÇØÁÙ ¼ö ÀÖ´Ù. ÀÌ°ÍÀÌ function objectÀÌ´Ù.

°£´ÜÇÑ ¿¹Á¦¸¦ º¸ÀÚ.

<function-object.cpp>=
#include <iostream>

using namespace std;

template<class T>
class square {
public:
    T operator()(T x) { return x*x; }
};
// ÀÌ´Â *°¡ Á¤ÀǵǴ ¾î¶² T¿¡ ´ëÇؼ­µçÁö ¾²ÀÏ ¼ö ÀÖ´Ù.

int main()
{
    // function object¸¦ ¸¸µç´Ù.
    square<double> f1;
    square<int> f2;

    // À̸¦ »ç¿ëÇÑ´Ù.
    cout << "5.1^2 = " << f1(5.1) << endl;
    cout << "100^2 = " << f2(100) << endl;

    // ¾Æ·¡ÀÇ ³»¿ëÀº ÄÄÆÄÀÏ ¿¡·¯¸¦ Ãâ·ÂÇÒ °ÍÀÌ´Ù.
    // cout << "100.1^2 = " << f2(100.1) << endl;
}

function object´Â STLÀÇ ¸î¸î ºÎºÐ, ƯÈ÷ set°ú map¿¡¼­ ¸¹ÀÌ ¾²ÀδÙ.

function object°¡ ÇÊ¿äÇÑ °æ¿ì¸¦ »ý°¢Çغ¸ÀÚ. ¾Æ·¡ÀÇ ³»¿ëÀ» ¸¸Á·ÇÏ´Â comp¶ó´Â °ÍÀ» »ý°¢Çغ¸ÀÚ.

  1. ¸¸¾à comp(x,y), comp(y,z)°¡ trueÀ̸é, comp(x,z)µµ ¿ª½Ã trueÀÌ´Ù.

  2. comp(x,x)´Â ¾ðÁ¦³ª falseÀÌ´Ù.

¾î¶² x,y¿¡ ´ëÇØ comp(x,y)¿Í comp(y,x)°¡ falseÀ̸é x¿Í y´Â °°Àº °´Ã¼ÀÌ´Ù.

ÀÌ´Â ¼ýÀÚ¿¡¼­ ¹Ì¸¸°ü°è ( < )¸¦ ³ªÅ¸³½´Ù. À§¿¡¼­ ¾²ÀÎ less < T > function object ´Â type T¿¡ ´ëÇØ < ¿¬»êÀÚ·Î Á¤ÀǵǾî ÀÖ´Ù. Áï, ´ÙÀ½°ú °°´Ù.

template<class T>
struct less {
  bool operator()(T x, T y) { return x<y; }
}

(ÁøÂ¥ Á¤ÀÇ´Â ·¹ÆÛ·±½º¸¦ »ç¿ëÇÏ°í, ÀûÀýÇÑ const ¼±¾ðÀ» »ç¿ëÇϸç binary_function template class¸¦ »ó¼Ó¹Þ´Â´Ù.)

ÀÌ´Â ¸¸¾à T°¡ < ¿¬»êÀÚ¸¦ ±× ŸÀÔ¿¡ ´ëÇØ Á¤ÀÇÇسõ¾Ò´Ù¸é, T ŸÀÔÀÇ ÁýÇÕÀ» ¼±¾ðÇÒ ¶§, ºñ±³¸¦ À§ÇÑ °ÍÀ¸·Î less < T > ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¸¸¾à < ¿¬»êÀÚ°¡ ÇÏ°íÀÚ ÇÏ´Â °Í°ú ¸ÂÁö ¾ÊÀ» ¼öµµ ÀÖ´Ù. ÀÌ·² ¶§´Â ´Ù¸¥ ¿¹°¡ ÀÖ´Ù. ÀÌ´Â < ¿¬»êÀÚ¸¦ ÀÌ¿ëÇÏ¿© °£´ÜÇÑ class¸¦ ¸¸µé°í, ´Ù¸¥ ¹æ½ÄÀÇ ºñ±³¸¦ ÇÏ´Â function object¸¦ ¸¸µç´Ù. ¿À¹ö·Îµù µÈ <¿Í () ¿¬»êÀÚ°¡ STL°ú Àß µ¹¾Æ°¡±â À§Çؼ­´Â const ¸¦ Àû´çÈ÷ ½áÁà¾ß ÇÑ´Ù´Â °Í¿¡ ÁÖÀÇÇ϶ó.

<set-construct2.cpp>=
#include <iostream>
#include <set>

using namespace std;

// ÀÌ class´Â µÎ °³ÀÇ ¸â¹ö º¯¼ö¸¦ °®´Â´Ù.
// ¿À¹ö·ÎµùµÈ <Àº ¸â¹ö f1°ªÀ» °®°í µÎ class¸¦ ºñ±³ÇÑ´Ù.
class myClass {
private:
    int f1;
    char f2;
public:
    myClass(int a, char b) : f1(a), f2(b) {}
    int field1() const { return f1; }
    char field2() const { return f2; }
    bool operator<(myClass y) const
    { return (f1<y.field1()); }
};

// ÀÌ function object´Â ¸â¹ö f2ÀÇ °ªÀ» ±âÃÊ·Î
// myClass ŸÀÔÀÇ °´Ã¼µéÀ» ºñ±³ÇÑ´Ù.
class comp_myClass {
public:
    bool operator()(myClass c1, myClass c2) const
    { return (c1.field2() < c2.field2()); }
};

int main()
{
    set<myClass, less<myClass> > s1;
    set<myClass, less<myClass> >::iterator i;
    set<myClass, comp_myClass> s2;
    set<myClass, comp_myClass>::iterator j;

    s1.insert(myClass(1,'a'));
    s2.insert(myClass(1,'a'));
    s1.insert(myClass(1,'b'));
    s2.insert(myClass(1,'b'));
    s1.insert(myClass(2,'a'));
    s2.insert(myClass(2,'a'));

    cout << "Set s1 contains: ";
    for (i=s1.begin(); i!=s1.end(); i++)
    { 
        cout << "(" << (*i).field1() << "," 
                << (*i).field2() << ")" << ' ';
    }
    cout << endl;

    cout << "Set s2 contains: ";
    for (j=s2.begin(); j!=s2.end(); j++)
    {
        cout << "(" << (*j).field1() << "," 
                << (*j).field2() << ")" << ' ';
    }
    cout << endl;
}

(1,a)¿Í (2,a)¸¦ °¡Áø ÁýÇÕ s1Àº f1À» ±âÁØÀ¸·Î ºñ±³¸¦ ÇÑ´Ù. µû¶ó¼­ (1,a)¿Í (1,b)´Â °°Àº ¿ø¼Ò·Î Ãë±ÞµÈ´Ù. (1,a)¿Í (1,b)¸¦ °¡Áø ÁýÇÕ s2´Â f2¸¦ ±âÁØÀ¸·Î ºñ±³¸¦ Çϱ⠶§¹®¿¡ (1,a)¿Í (2,a)°¡ °°Àº ¿ø¼Ò·Î Ãë±ÞµÈ´Ù.


17.7.3. Ãâ·ÂÇϱâ

À§ÀÇ ¿¹¿¡¼­ ÁýÇÕÀÇ ³»¿ëÀ» Ãâ·ÂÇÏ´Â °ÍÀº º°·Î ÁÁÁö ¾Ê´Ù. ¾Æ·¡ÀÇ Çì´õÆÄÀÏÀº operator<< À» ¿À¹ö·ÎµùÇÏ´Â °£´ÜÇÑ Ç¥ÇöÀ» °®°í ÀÖ´Ù. ÀÌ´Â °£´ÜÇÑ ¿ø¼Ò ŸÀÔÀ» °®´Â ÀÛÀº ÁýÇÕ¿¡¼­´Â Àß µ¿ÀÛÇÑ´Ù.

<printset.h>=
#ifndef _PRINTSET_H
#define _PRINTSET_H

#include <iostream>
#include <set>

template<class T, class Comp>
std::ostream& operator<<(std::ostream& os, const std::set<T,Comp>& s)
{
    std::set<T,Comp>::iterator iter = s.begin();
    int sz = s.size();
    int cnt = 0;

    os << "{";
    while (cnt < sz-1)
    {
        os << *iter << ",";
        iter++;
        cnt++;
    }
    if (sz != 0) os << *iter;
    os << "}";

    return os;
}
#endif

¿©±â¼­ Ãâ·ÂÀ» À§ÇØ »ç¿ëÇÑ << ¿ë¹ýÀº ÁýÇÕÀÇ ¿ø¼ÒµéÀÌ << ¿¬»êÀÚ¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Á¤ÀǵǾîÀÖ´Ù°í °¡Á¤ÇÑ °ÍÀÌ´Ù. ±×·¡¼­ À̸¦ ÄÞ¸¶(,)·Î ±¸ºÐÇÏ°í ´ë°ýÈ£·Î µÑ·¯½Î¼­ Ãâ·ÂµÇµµ·Ï ÇÑ °ÍÀÌ´Ù. ÀÌ´Â ´ÙÀ½ ¿¹¿¡¼­µµ »ç¿ëµÉ °ÍÀÌ´Ù.


17.7.4. ¿ø¼ÒÀÇ ¼ö ±¸Çϱâ

ÁýÇÕÀÌ °øÁýÇÕÀÎÁö´Â empty() ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© ¾Ë ¼ö ÀÖ´Ù. ÁýÇÕ¿¡ ¸î°³ÀÇ ¿ø¼Ò°¡ µé¾îÀÖ´ÂÁö´Â size() ¸Þ½îµå¸¦ »ç¿ëÇÏ¿© ¾Ë ¼ö ÀÖ´Ù. À̵éÀº ÀÎÀÚ¾øÀÌ ºÒ·Á¼­ °¢°¢ true ³ª false ȤÀº Á¤¼ö(int)¸¦ ¸®ÅÏÇÑ´Ù.

<set-size.cpp>=
#include <iostream>
#include <set>
#include "printset.h"

using namespace std;

int main()
{
    set<int, less<int> > s;

    cout << "The set s is  "
            << (s.empty() ? "empty." : "non-empty.") << endl; 
    cout << "It has " << s.size() << "elements." << endl;

    cout << "Now adding some elements... " << endl;

    s.insert(1);
    s.insert(6);
    s.insert(7);
    s.insert(-7);
    s.insert(5);
    s.insert(2);
    s.insert(1);
    s.insert(6);

    cout << "The set s is now  
            << (s.empty() ? "empty." : "non-empty.") << endl;
    cout << "It has " << s.size() << "elements." << endl;
    cout << "s = " << s << endl;
}


17.7.5. ÁýÇÕÀÌ ¼­·Î °°ÀºÁö °Ë»çÇϱâ

µÎ ÁýÇÕÀÌ ¼­·Î °°ÀºÁö´Â == ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© °Ë»çÇÒ ¼ö ÀÖ´Ù. ÀÌ´Â T::operator== ¸¦ »ç¿ëÇÏ¿© °¢ ¿ø¼Ò¸¦ Â÷·Ê´ë·Î °Ë»çÇÔÀ¸·Î½á ÀÌ·ç¾îÁø´Ù.

<set-equality.cpp>=
#include <iostream>
#include <set>
#include "printset.h"

using namespace std;

int main()
{
    set<int, less<int> > s1, s2 ,s3;

    for (int i=0; i<10; i++)
    {
        s1.insert(i);
        s2.insert(2*i);
        s3.insert(i);
    }

    cout << "s1 = " << s1 << endl;
    cout << "s2 = " << s2 << endl;
    cout << "s3 = " << s3 << endl;
    cout << "s1==s2 is: " << (s1==s2 ? true. : false.) << endl;
    cout << "s1==s3 is: " << (s1==s3 ? true. : false.) << endl;
}

¶ÇÇÑ, µÎ ÁýÇÕÀ» <À¸·Î ºñ±³ÇÏ´Â °Íµµ °¡´ÉÇÏ´Ù. s1 < s2 ´Â s1ÀÌ »çÀü¼ø¼­·Î(lexicographically) s2º¸´Ù ÀÛÀ¸¸é true, ±×·¸Áö ¾ÊÀ¸¸é falseÀÌ´Ù.


17.7.6. ¿ø¼Ò¸¦ Ãß°¡Çϰųª »èÁ¦Çϱâ

ÁýÇÕ¿¡ ¿ø¼Ò¸¦ Ãß°¡ÇÏ´Â °ÍÀº insert ¸Þ½îµå (À§¿¡ »ç¿ëÇÑ °Í°ú °°ÀÌ)¸¦, »èÁ¦ÇÏ´Â °ÍÀº erase ¸Þ½îµå¸¦ ÅëÇØ ÀÌ·ç¾îÁø´Ù.

ŸÀÔ TÀÇ ¿ø¼ÒµéÀ» °®°í ÀÖ´Â ÁýÇÕÀÇ °æ¿ì, ´ÙÀ½°ú °°ÀÌ ÀÌ·ç¾îÁø´Ù :

  • pair < iterator, bool> insert(T& x). À̴ ǥÁØ insert ÇÔ¼öÀÌ´Ù. ¸®ÅÏ°ªÀº ¹«½ÃÇÒ¼öµµ ÀÖ°í, ¼º°øÀûÀ¸·Î Ãß°¡Çß´ÂÁö¸¦ ¾Ë±â À§ÇØ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù (°°Àº ¿ø¼Ò°¡ ÀÌ¹Ì ÁýÇÕ¿¡ ÀÖÀ» °æ¿ì ½ÇÆÐÇÑ´Ù). ¸¸¾à Ãß°¡°¡ ¼º°øÇß´Ù¸é, bool °ªÀº trueÀÌ°í, iterator´Â ±Ý¹æ Ãß°¡µÈ ¿ø¼Ò¸¦ °¡¸®Å°°Ô µÉ °ÍÀÌ´Ù. ¸¸¾à ¿ø¼Ò°¡ ÀÌ¹Ì Á¸ÀçÇÏ´Â °ÍÀ̶ó¸é, bool °ªÀº falseÀÌ°í, iterator´Â ÀÌ¹Ì ÀÖ´Â °ªÀÌ µ¿ÀÏÇÑ ¿ø¼Ò¸¦ °¡¸®Å°°Ô µÉ °ÍÀÌ´Ù.

  • iterator insert(iterator position, T& x). ÀÌ insert ÇÔ¼ö´Â ÀÎÀڷμ­ Ãß°¡ÇÏ°íÀÚ ÇÏ´Â ¿ø¼Ò ¿Ü¿¡ iterator¸¦ ¹Þ´Âµ¥, ÀÌ´Â Ãß°¡ÇÒ À§Ä¡¸¦ ã±â ½ÃÀÛÇÒ iteratorÀÌ´Ù. ¸®ÅϵǴ iterator´Â À§¿Í ¸¶Âù°¡Áö·Î »õ·Î Ãß°¡µÈ ¿ø¼Ò³ª ÀÌ¹Ì Á¸ÀçÇÏ´Â °°Àº °ªÀÇ ¿ø¼ÒÀÌ´Ù.

  • int erase(T& x). ÀÌ eraseÇÔ¼ö´Â Áö¿ì°íÀÚ ÇÏ´Â ¿ø¼Ò¸¦ ÀÎÀÚ·Î ¹Þ¾Æ ¸¸¾à ±× ¿ø¼Ò°¡ Á¸ÀçÇϸé Áö¿ì°í¼­ 1À» ¸®ÅÏÇÏ°í, ¾øÀ¸¸é 0À» ¸®ÅÏÇÑ´Ù.

  • void erase(iterator position). ÀÌ eraseÇÔ¼ö´Â ƯÁ¤ ¿ø¼Ò¸¦ °¡¸®Å°´Â iterator¸¦ ÀÎÀÚ·Î ¹Þ¾Æ ±× ¿ø¼Ò¸¦ Áö¿î´Ù.

  • void erase(iterator first, iterator last). ÀÌ eraseÇÔ¼ö´Â µÎ iterator¸¦ ÀÎÀÚ·Î ¹Þ¾Æ [first,last] ¹üÀ§ÀÇ ¸ðµç ¿ø¼Ò¸¦ Áö¿î´Ù.

¾Æ·¡ÀÇ ¿¹´Â À§ ÇÔ¼öµéÀÇ »ç¿ë¹ýÀ» º¸¿©ÁØ´Ù.

<set-add-delete.cpp>=
#include <iostream>
#include <set>
#include "printset.h"

using namespace std;

int main()
{
    set<int, less<int> > s1;

    // Ç¥ÁØÀûÀÎ ¹æ½ÄÀ¸·Î ¿ø¼Ò¸¦ Ãß°¡ÇÑ´Ù.
    s1.insert(1);
    s1.insert(2);
    s1.insert(-2);

    // ƯÁ¤À§Ä¡¿¡ ¿ø¼Ò »ðÀÔ
    s1.insert(s1.end(), 3);
    s1.insert(s1.begin(), -3);
    s1.insert((s1.begin()++)++, 0);

    cout << "s1 = " << s1 << endl;

    // ¼º°øÀûÀ¸·Î Ãß°¡µÇ¾ú´ÂÁö üũ
    pair<set<int, less<int> >::iterator,bool> x = s1.insert(4);
    cout << "Insertion of 4 " << (x.second ? worked. : failed.) 
            << endl;
    x = s1.insert(0);
    cout << "Insertion of 0 " << (x.second ? worked. : failed.) 
            << endl;

    // insert¿¡¼­ ¸®ÅÏµÈ iterator¸¦ µÎ¹ø° ÇüÅÂÀÇ insertÀÇ ÀÎÀÚ·Î
    // »ç¿ëÇÒ ¼ö ÀÖ´Ù.
    cout << "Inserting 10, 8 and 7." << endl;
    s1.insert(10);
    x=s1.insert(7);
    s1.insert(x.first, 8);

    cout << "s1 = " << s1 << endl;

    // ¸î ¿ø¼ÒµéÀ» Áö¿î´Ù.
    cout << "Removal of 0 " << (s1.erase(0) ? worked. : failed.)
            << endl;
    cout << "Removal of 5 " << (s1.erase(5) ? worked. : failed.)
            << endl;

    // ¿ø¼Ò¸¦ ã¾Æ¼­, Áö¿î´Ù. (find ÇÔ¼ö´Â ´ÙÀ½ ÀåÀ» ÂüÁ¶)
    cout << "Searching for 7." << endl;
    set<int,less<int> >::iterator e = s1.find(7);
    cout << "Removing 7." << endl;
    s1.erase(e);

    cout << "s1 = " << s1 << endl;

    // ¸¶Áö¸·À¸·Î ¸ðµç ¿ø¼Ò¸¦ Áö¿î´Ù.
    cout << "Removing all elements from s1." << endl;
    s1.erase(s1.begin(), s1.end());
    cout << "s1 = " << s1 << endl;
    cout << "s1 is now " << (s1.empty() ? empty. : non-empty.)
            << endl;
}


17.7.7. ¿ø¼Ò¸¦ ã±â

¾î¶² ¿ø¼Ò°¡ ÁýÇÕ¿¡ ÀÖ´ÂÁö üũÇØÁÖ´Â µÎ°¡Áö ÇÔ¼ö°¡ ÀÖ´Ù.

  • iterator find(T& x). ÀÌ ÇÔ¼ö´Â ÁýÇÕ¿¡ ¿ø¼Ò x°¡ Á¸ÀçÇÏ´ÂÁö ã´Â´Ù. ¸¸¾à ãÀ¸¸é À̸¦ °¡¸®Å°´Â iterator¸¦ ¸®ÅÏÇÏ°í, ¾øÀ¸¸é end()¸¦ ¸®ÅÏÇÑ´Ù.

  • int count(T& x). ÀÌÇÔ¼ö´Â Á¸ÀçÇϸé 1À», ¾øÀ¸¸é 0À» ¸®ÅÏÇÑ´Ù. (multiset¿¡¼­ÀÇ countÇÔ¼ö´Â °°Àº ¿ø¼Ò°¡ ¿©·¯°³ ÀÖÀ» ¼ö ÀÖÀ¸¹Ç·Î ¸®ÅÏ°ªÀÌ 1º¸´Ù ´õ Ŭ ¼öµµ ÀÖ´Ù. count¶ó´Â ¸»ÀÇ ¶æÀ» »ý°¢Çغ¸¶ó! )

findÀÇ »ç¿ë¹ýÀº ÀÌ¹Ì À§¿¡ º¸ÀÎ ÀûÀÌ ÀÖ´Ù. ¿ì¸®´Â count¸¦ ÀÌ¿ëÇÏ¿© °£´ÜÇÑ template±â¹ÝÀÇ ÁýÇÕ¿¡ ¼ÓÇÏ´ÂÁö testÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé ¼ö ÀÖ´Ù. (ÀÌ´Â ÀÎÀÚ x¿¡ ´ëÇÑ ·¹ÆÛ·±½º¸¦ Á¦°øÇÑ´Ù.)

<setmember.h>=
#ifndef _SETMEMBER_H
#define _SETMEMBER_H
#include <set>

template<class T, class Comp>
bool member(T x, std::set<T,Comp>& s)
{
 return (s.count(x)==1 ? true : false);
}
#endif

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

<set-membership.cpp>=
#include <iostream>
#include <set>
#include "printset.h"
#include "setmember.h"

using namespace std;

int main()
{
    set<int, less<int> > s;
    for (int i= 0; i<10; i++) s.insert(i);
    cout << "s = " << s << endl;
    cout << "1 is " << (member(1,s) ?  : not) << " a member of s "
            <<  endl;
    cout << "10 is " << (member(10,s) ?  : not) << " a member of s "
            <<  endl;
}


17.7.8. ÁýÇÕ ¿¬»ê

STLÀº ºÎºÐÁýÇÕ, ÇÕÁýÇÕ, ±³ÁýÇÕ, Â÷ÁýÇÕ, ´ëĪÂ÷ÁýÇÕ(XOR) µîÀÇ ÁýÇÕ¿¬»êÀ» generic ¾Ë°í¸®ÁòÀ¸·Î Á¦°øÇÑ´Ù. ÀÌ ÇÔ¼öµéÀ» ÀÌ¿ëÇϱâ À§Çؼ­´Â algo.h¸¦ include ÇؾßÇÑ´Ù. (¾Æ·¡ÀÇ ³»¿ëÁß iter´Â ÀûÀýÇÑ iterator¸¦ ÀǹÌÇÑ´Ù).

  • bool includes(iter f1,iter l1,iter f2,iter l2).

    À§ ÇÔ¼ö´Â [f2,l2] ¹üÀ§¿¡ ÀÖ´Â °ÍµéÀÌ [f1,l1] ¾ÈÀÇ °ÍµéÀ» Æ÷ÇÔÇÏ´Â Áö¸¦ üũÇÑ´Ù. ¸¸¾à Æ÷ÇÔÇϸé true¸¦, ±×·¸Áö ¾ÊÀ¸¸é false¸¦ ¸®ÅÏÇÑ´Ù. µû¶ó¼­ ÇÑ ÁýÇÕÀÌ ´Ù¸¥ ÁýÇÕÀ» Æ÷ÇÔÇÏ´Â Áö¸¦ º¸·Á¸é, ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.

    includes(s1.begin(), s1.end(), s2.begin(), s2.end())

    The includes function checks the truth of 3#3 ( that is of 4#4). ÀÌ ÇÔ¼ö´Â ÁýÇÕÀÌ < ¿¬»êÀÚ¸¦ ÀÌ¿ëÇØ Á¤·ÄµÇ¾ú´Ù°í º»´Ù. ¸¸¾à, <ÀÌ ¾Æ´Ñ ´Ù¸¥ ¿¬»êÀÚ °¡ »ç¿ëµÇ¾ú´Ù¸é, ÀÌ(function object)¸¦ ¸¶Áö¸· ÀÎÀڷμ­ Ãß°¡·Î ³Ñ°ÜÁÖ¸é µÈ´Ù.

  • iter set_union(iter f1,iter l1,iter f2,iter l2,iter result).

    ÀÌ´Â [f1,l1]°ú [f2,l2] ¹üÀ§¿¡ ÀÖ´Â ÁýÇÕµéÀÇ ÇÕÁýÇÕÀ» ¸¸µç´Ù. ÀÎÀÚ·Î ÁÖ´Â result °ªÀº »õ·Î¸¸µé¾îÁø ÇÕÁýÇÕÀÇ Ã¹ ÀÎÀÚ¸¦ °¡¸®Å°´Â iteratorÀÌ´Ù. ¸®ÅÏ°ªÀº »õ·Î¿î ÁýÇÕÀÇ ³¡(end)¸¦ °¡¸®Å°´Â iteratorÀÌ´Ù.

result ÀÎÀÚ°¡ iterator¶õ ¸»Àº, ´ÙÀ½°ú °°Àº ½ÄÀ¸·Î set_unionÀ» »ç¿ëÇÏ¸é ¾ÈµÈ´Ù´Â °ÍÀÌ´Ù.

      set<int, less<int> > s1, s2, s3;
      // s1 °ú s2ÀÇ ¿ø¼Ò¸¦ °¡Áö°í ÇÕÁýÇÕÀ» ¸¸µç´Ù.
      // (±×·¯³ª ÀÌ·± ½ÄÀ¸·Î´Â µ¿ÀÛÇÏÁö ¾ÊÀ½)
      set_union(s1.begin(), s1.end(), 
                s2.begin(), s2.end(), 
                s3.begin());

±× ÀÌÀ¯´Â begin()°ú end()°¡ ÁýÇÕÀ̳ª ¸Ê¿¡ »ç¿ëµÉ ¶§´Â »ó¼ö input iterator°¡ µÇ±â ¶§¹®ÀÌ´Ù. ÀÌ·¯ÇÑ iterator´Â ÁýÇÕÀÇ ¿ø¼Ò¸¦ Àбâ À§Çؼ­´Â »ç¿ëµÉ ¼ö ÀÖÁö¸¸, °ªÀ» ¾µ ¼ö´Â ¾ø´Ù. (¶ÇÇÑ ¸¸¾à °ªÀ» ¾µ ¼ö ÀÖ°Ô ÇÑ´Ù¸é ÁýÇÕÀÇ ¼ø¼­¸¦ ¸Á°¡¶ß¸± ¼ö ÀÖ´Â À§ÇèÀÌ Àֱ⠶§¹®À̱⵵ ÇÏ´Ù)

ÇØ°áÃ¥Àº set_typeÀÇ insert iterator¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ´Â (*i)=value °°Àº ºÒ°¡´ÉÇÑ ±¸¹®À» s.insert(i,value)ÀÇ ÇüÅ·Π¾µ ¼ö ÀÖ°Ô ÇØÁØ´Ù. (¿©±â¼­ s´Â iterator i°¡ °¡¸®Å°´Â ÁýÇÕÀÌ´Ù. ÀÌ´Â ´ÙÀ½°ú °°ÀÌ ¾²ÀδÙ.

      // ÆíÀǸ¦ À§ÇØ Typedef¸¦ »ç¿ë
      typedef set<int, less<int> > intSet;  
      intSet s1, s2, s3;
      // s1°ú s2¿¡ ¸î ¿ø¼Ò¸¦ Ãß°¡.
      // ±×¸®°í ÇÕÁýÇÕÀ» ±¸ÇÑ´Ù.
      set_union(s1.begin(), s1.end(), 
                s2.begin(), s2.end(), 
                insert_iterator<intSet>(s3,s3.begin()) );

ÀÌÁ¦ À§¿¡ ³ª¿À´Â °ÍµéÀ» Á¾ÇÕÀûÀ¸·Î »ç¿ëÇÏ´Â ¿¹Á¦¸¦ º¸ÀÚ.

<set-theory.cpp>=
#include <iostream>
#include <set>
#include <algorithm>
#include <iterator>
#include "printset.h"

using namespace std;

int main()
{
    typedef set<int, less<int> > intSet;

    intSet s1, s2, s3, s4;

    for (int i=0; i<10; i++)
    { s1.insert(i);
        s2.insert(i+4);
    }
    for (int i=0; i<5; i++) s3.insert(i);

    cout << "s1 = " << s1 << endl;
    cout << "s2 = " << s2 << endl;
    cout << "s3 = " << s3 << endl;

    // s1ÀÌ s2ÀÇ ºÎºÐÁýÇÕÀΰ¡?
    bool test = includes(s2.begin(),s2.end(),s1.begin(),s1.end());
    cout << "s1 subset of s2 is " << (test ? true. : false.) << endl;

    // s3°¡ s1ÀÇ ºÎºÐÁýÇÕÀΰ¡?
    test = includes(s1.begin(),s1.end(),s3.begin(),s3.end());
    cout << "s3 subset of s1 is " << (test ? true. : false.) << endl;

    // s1°ú s2ÀÇ ÇÕÁýÇÕ.
    set_union(s1.begin(), s1.end(), s2.begin(), s2.end(),
            insert_iterator<intSet>(s4,s4.begin()) );
    cout << "s1 union s2 = " << s4 << endl;

    // s4¸¦ Áö¿ì°í, s1°ú s2ÀÇ ±³ÁýÇÕÀ» ±¸ÇÑ´Ù.
    // ( ¸¸¾à s4¸¦ Áö¿ìÁö ¾ÊÀ¸¸é ¿ø·¡ s4¿¡ µé¾îÀÖ´Â °Íµéµµ
    // °°ÀÌ µé¾î°¡°Ô µÉ °ÍÀÌ´Ù. )
    s4.erase(s4.begin(),s4.end());
    set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(),
            insert_iterator<intSet>(s4,s4.begin()) );
    cout << "s1 intersection s2 = " << s4 << endl;

    // Â÷ÁýÇÕ
    s4.erase(s4.begin(),s4.end());
    set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
            insert_iterator<intSet>(s4,s4.begin()) );
    cout << "s1 minus s2 = " << s4 << endl;

    // Â÷ÁýÇÕÀº ´ëĪÀûÀÌÁö ¾Ê´Ù. (Áï, A-B != B-A)
    s4.erase(s4.begin(),s4.end());
    set_difference(s2.begin(), s2.end(), s1.begin(), s1.end(),
            insert_iterator<intSet>(s4,s4.begin()) );
    cout << "s2 minus s1 = " << s4 << endl;

    // ´ëĪÂ÷ÁýÇÕ
    s4.erase(s4.begin(),s4.end());
    set_symmetric_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
            insert_iterator<intSet>(s4,s4.begin()) );
    cout << "s1 symmetric_difference  s2 = " << s4 << endl;

    // ´ëĪÂ÷ÁýÇÕÀº ´ëĪÀûÀÌ´Ù. (Áï, commutative)
    s4.erase(s4.begin(),s4.end());
    set_symmetric_difference(s2.begin(), s2.end(), s1.begin(), s1.end(),
            insert_iterator<intSet>(s4,s4.begin()) );
    cout << "s2 symmetric_difference  s1 = " << s4 << endl;
}


17.8. ¸Ê

17절ÀåÀ» º¸¾Æ¶ó.


17.9. STL ¾Ë°í¸®Áò

17절ÀåÀ» º¸¾Æ¶ó.


18. C++¿¡¼­ÀÇ ¾²·¹µå


18.1. ¾²·¹µå Æ©Å丮¾ó


18.2. C++¿¡¼­ ¾²·¹µå class µðÀÚÀÎÇϱâ

ÀÌ ÀåÀº Ryan Teixeira ¿¡ ÀÇÇØ ¾²¿©Á³°í, ±× ¹®¼­´Â ¿©±â¿¡ ÀÖ´Ù. .


18.2.1. ¼Ò°³

¸ÖƼ ¾²·¹µå ÇÁ·Î±×·¡¹ÖÀº Á¡Á¡ Àα⸦ ¾ò°íÀÖ´Ù. ÀÌ ÀåÀº ¾²·¹µå¸¦ Áö¿øÇÏ´Â C++ classÀÇ µðÀÚÀÎÀ» º¸¿©ÁÙ °ÍÀÌ´Ù. mutex³ª ¼¼¸¶Æ÷¾î°°Àº ¾²·¹µå ÇÁ·Î±×·¡¹ÖÀÇ ¸î¸î Ãø¸éÀº ¿©±â¼­ ³íÀǵÇÁö ¾Ê´Â´Ù. ¶ÇÇÑ ¾²·¹µåÀÇ °ü¸®¸¦ À§ÇÑ ½Ã½ºÅÛ ÄݵéÀº ÀϹÝÀûÀÎ ÇüÅ·Π³ªÅ¸³»¾ú´Ù.


18.2.2. ¾²·¹µå¿¡ ´ëÇÑ °£´ÜÇÑ ¼Ò°³

¾²·¹µå¸¦ ÀÌÇØÇϱâ À§Çؼ­´Â, ÇѲ¨¹ø¿¡ µ¹¾Æ°¡´Â ¿©·¯ ÇÁ·Î±×·¥À» »ý°¢ÇؾßÇÑ´Ù. ¶ÇÇÑ, ÀÌ ÇÁ·Î±×·¥µéÀÌ ¶È°°Àº Àü¿ªº¯¼ö¿Í ÇÔ¼öµé¿¡ Á¢±ÙÇÑ´Ù°í »ý°¢Çغ¸¾Æ¶ó. ÀÌ ÇÁ·Î±×·¥µéÀº ½Ç¿¡ ºñÀ¯µÉ ¼ö ÀÖ°í, ±×·¡¼­ ¾²·¹µå¶ó°í ºÒ¸°´Ù. Áß¿äÇÑ Â÷ÀÌÁ¡ÀÌ ÀÖ´Ù¸é, °¢°¢ÀÇ ¾²·¹µå´Â ´Ù¸¥ ¾²·¹µå°¡ ÁøÇàÇÏ´Â °ÍÀ» ±â´Ù¸± ÇÊ¿ä°¡ ¾ø´Ù´Â °ÍÀÌ´Ù. ¸ðµç ¾²·¹µå°¡ µ¿½Ã¿¡ ÁøÇàµÈ´Ù. ºñÀ¯¸¦ ÇÏÀÚ¸é, À̵éÀº À°»ó¼±¼ö¿Í °°ÀÌ ¾Æ¹«µµ ´Ù¸¥ ¼±¼ö¸¦ ±â´Ù¸®Áö ¾Ê´Â´Ù. °¢ÀÚ ÀÚ½ÅÀÇ ¼Óµµ·Î ÁøÇàµÇ´Â °ÍÀÌ´Ù.

¿Ö ¾²·¹µå¸¦ »ç¿ëÇÏ³Ä°í ¹°¾îº»´Ù¸é, ¾²·¹µå´Â Á¾Á¾ ¾îÇø®ÄÉÀ̼ÇÀÇ ¼º´ÉÀ» Çâ»ó½Ãų ¼ö ÀÖ°í, ±¸ÇöÇÏ´Â°Ô ±î´Ù·ÓÁö ¾Ê´Ù. Áï, Á¶±×¸¸ ÅõÀÚ·Î Å« È¿°ú¸¦ º¼ ¼ö ÀÖ´Â °ÍÀÌ´Ù. À̹ÌÁö¸¦ ¼­ºñ½ºÇÏ´Â À̹ÌÁö ¼­¹ö ÇÁ·Î±×·¥À» »ý°¢Çغ¸¾Æ¶ó. ÀÌ ÇÁ·Î±×·¥Àº ´Ù¸¥ ÇÁ·Î±×·¥À¸·ÎºÎÅÍ À̹ÌÁö¿¡ ´ëÇÑ ¿äûÀ» ¹Þ´Â´Ù. ±×·¯¸é ÀÌ À̹ÌÁö¸¦ µ¥ÀÌÅͺ£À̽º¿¡¼­ ã¾Æ ¿äûÀ» º¸³½ ÇÁ·Î±×·¥¿¡°Ô ´Ù½Ã º¸³»ÁØ´Ù. ¸¸¾à ¼­¹ö°¡ ÇϳªÀÇ ¾²·¹µå·Î ¸¸µé¾îÁ³´Ù¸é, Çѹø¿¡ ÇϳªÀÇ ÇÁ·Î±×·¥¸¸ ¿äûÀ» º¸³¾ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¸¸¾à ÇÁ·Î±×·¥ÀÌ À̹ÌÁö¸¦ ã°Å³ª º¸³»ÁÖ´Â ÁßÀ̶ó¸é ´Ù¸¥ ¿äûÀ» ó¸®ÇÒ ¼ö ¾øÀ» °ÍÀÌ´Ù. ¹°·Ð ÀÌ·¯ÇÑ ½Ã½ºÅÛÀ» ¾²·¹µå¸¦ ÀÌ¿ëÇÏÁö ¾Ê°íµµ ¸¸µé ¼ö ÀÖÁö¸¸, ¾²·¹µå¸¦ ¾²¸é, ¿©·¯°³ÀÇ ¿äûÀ» ¾ÆÁÖ ÀÚ¿¬½º·´°Ô ó¸®ÇÒ ¼ö ÀÖ°Ô µÈ´Ù. °£´ÜÇÑ Á¢±Ù ¹æ¹ýÀº ÇϳªÀÇ ¿äû´ç ÇϳªÀÇ ¾²·¹µå¸¦ ¸¸µå´Â °ÍÀÌ´Ù. ¸ÞÀÎ ¾²·¹µå´Â ¿äû¿¡ µû¶ó ¾²·¹µå¸¦ ¸¸µé¾îÁֱ⸸ ÇÏ¸é µÈ´Ù. ±×·¯¸é »õ·Î ¸¸µé¾îÁø ¾²·¹µå°¡ ¿äûÇÏ´Â ÇÁ·Î±×·¥°ú ´ëÈ­Çϸ鼭 ¼­ºñ½º¸¦ ÇØÁÖ¸é µÈ´Ù. À̹ÌÁö¸¦ ã¾Æ¼­ º¸³½ ÈÄ¿¡´Â ¾²·¹µå°¡ ½º½º·Î Á¾·áÇÏ¸é µÈ´Ù. ÀÌ·¸°Ô Çϸé ÇϳªÀÇ ¿äûÀ» ¼­ºñ½º ÇÏ´Â µµÁß¿¡µµ ´Ù¸¥ ¿äûÀ» ¹ÞÀ» ¼ö ÀÖ´Â À¯¿¬ÇÑ ½Ã½ºÅÛÀÌ µÉ °ÍÀÌ´Ù.


18.2.3. ±âº»ÀûÀÎ Á¢±Ù¹æ¹ý

¾²·¹µå¸¦ ¸¸µé±â À§Çؼ­´Â, ¾²·¹µåÀÇ ½ÃÀÛÁ¡ÀÌ µÉ ÇÔ¼ö¸¦ ¸í½ÃÇØ¾ß ÇÑ´Ù. ¿î¿µÃ¼Á¦ ·¹º§¿¡¼­´Â, ÀÌ°ÍÀÌ ÀϹÝÀûÀÎ ÇÔ¼öÀÌ´Ù. ±×·±µ¥ C++ÀÇ class ¸â¹öÇÔ¼ö´Â ½ÃÀÛÇÔ¼ö°¡ µÉ ¼ö ¾ø±â ¶§¹®¿¡ ¾à°£ÀÇ Æ®¸¯À» ½á¾ßÇÑ´Ù. ÇÏÁö¸¸, Ŭ·¡½ºÀÇ static ¸â¹öÇÔ¼ö´Â °¡´ÉÇÏ´Ù. ÀÌ°ÍÀÌ ¿ì¸®°¡ ½ÃÀÛÇÔ¼ö·Î ÀÌ¿ëÇÒ °ÍÀÌ´Ù. static ¸â¹öÇÔ¼ö´Â C++ °´Ã¼ÀÇ this Æ÷ÀÎÅ͸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù. À̵éÀº ¿ÀÁ÷ static µ¥ÀÌÅ͸¸ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ´ÙÇàÈ÷µµ ¹æ¹ýÀÌ ÀÖ´Ù. ¾²·¹µåÀÇ ½ÃÀÛÁ¡ ÇÔ¼ö´Â ÀÎÀÚ·Î void *¸¦ °®°Ô µÇ´Âµ¥, À̸¦ ¾²·¹µå ¾È¿¡¼­ ¾î¶² ŸÀÔÀ¸·Î³ª casting Çؼ­ ¾µ ¼ö ÀÖ´Ù. ¿ì¸®´Â À̸¦ static ÇÔ¼ö¿¡ this ¸¦ ³Ñ°ÜÁÖ±â À§ÇØ ¾µ °ÍÀÌ´Ù. µû¶ó¼­ static ÇÔ¼ö´Â À̸¦ casting ÇÏ¿© staticÀÌ ¾Æ´Ñ ÇÔ¼ö¸¦ ºÎ¸£±â À§ÇØ ¾µ ¼ö ÀÖ´Ù.


18.2.4. ±¸Çö

¿ì¸®´Â ¾à°£ Á¦ÇÑµÈ ±â´ÉÀ» °®´Â ¾²·¹µå class¸¦ ¸¸µé °ÍÀÌ´Ù. ½ÇÁ¦ ¾²·¹µå´Â ÀÌ class°¡ ÇÏ´Â °Íº¸´Ù ÈξÀ ¸¹Àº ÀϵéÀ» ÇÒ ¼ö ÀÖ´Ù.

class Thread
{
   public:
      Thread();
      int Start(void * arg);
   protected:
      int Run(void * arg);
      static void * EntryPoint(void*);
      virtual void Setup();
      virtual void Execute(void*);
      void * Arg() const {return Arg_;}
      void Arg(void* a){Arg_ = a;}
   private:
      THREADID ThreadId_;
      void * Arg_;

};

Thread::Thread() {}

int Thread::Start(void * arg)
{
   Arg(arg); // user µ¥ÀÌÅ͸¦ ÀúÀåÇÔ.
   int code = thread_create(Thread::EntryPoint, this, & ThreadId_);
   return code;
}

int Thread::Run(void * arg)
{
   Setup();
   Execute( arg );
}

/*static */
void * Thread::EntryPoint(void * pthis)
{
   Thread * pt = (Thread*)pthis;
   pthis->Run( Arg() );
}

virtual void Thread::Setup()
{
        // Setup¿¡ ÇØ´çÇÏ´Â Àϵé
}

virtual void Thread::Execute(void* arg)
{
        // ½ÇÇàÇÒ ³»¿ë
}

¿ì¸®°¡ ¾²·¹µå¸¦ C++ °´Ã¼·Î »ç¿ëÇÏ°íÀÚ ÇÑ´Ù´Â °ÍÀ» ÀÌÇØÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. °¢°¢ÀÇ °´Ã¼´Â ÇϳªÀÇ ¾²·¹µå¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇÑ´Ù. ¾²·¹µå¿Í °´Ã¼´Â ´Ù¸£´Ù. °´Ã¼´Â ¾²·¹µå ¾øÀÌ Á¸ÀçÇÒ ¼ö ÀÖ´Ù. ÀÌ ±¸Çö¿¡¼­, ¾²·¹µå ÀÚü´Â Start ÇÔ¼ö°¡ ºÒ¸± ¶§±îÁö Á¸ÀçÇÏÁö ¾Ê´Â´Ù.

¿©±â¼­ userÀÇ ÀÎÀÚ¸¦ class¿¡ ÀúÀåÇѴٴµ¥ ÁÖÀÇÇضó. ÀÌ´Â ¾²·¹µå°¡ ½ÃÀÛµÉ ¶§±îÁö Àӽ÷ΠÀ̸¦ ÀúÀåÇÒ °ø°£ÀÌ ÇÊ¿äÇϱ⠶§¹®ÀÌ´Ù. ¿î¿µÃ¼Á¦ ¾²·¹µå´Â ÀÎÀÚ¸¦ Çϳª ³Ñ±æ ¼ö ÀÖ°Ô ÇØÁÖÁö¸¸, ¿ì¸®´Â this ¶§¹®¿¡ À̸¦ Á÷Á¢ ³Ñ°ÜÁÙ ¼ö ¾ø´Ù. ±×·¡¼­ ¿ì¸®´Â ÀÎÀÚ¸¦ Àá½Ã class¿¡ ÀúÀåÇß´Ù°¡ ÇÔ¼ö°¡ ½ÃÀÛµÉ ¶§ ´Ù½Ã ²¨³»¼­ ³Ñ°ÜÁÖ°Ô µÈ´Ù.

Thread(); »ý¼ºÀÚÀÌ´Ù.

int Start(void * arg); ÀÌ ÇÔ¼ö´Â ¾²·¹µå¸¦ ¸¸µé°í, À̸¦ ½ÃÀÛÇÏ°Ô ÇØÁØ´Ù. ÀÌ ÀÎÀÚ´Â ¾²·¹µå¿¡ µ¥ÀÌÅ͸¦ ³Ñ°ÜÁÖ±â À§ÇØ »ç¿ëµÇ°í, Start()´Â ¿î¿µÃ¼Á¦ÀÇ ¾²·¹µå »ý¼º ÇÔ¼ö¸¦ ºÎ¸§À¸·Î½á ¾²·¹µå¸¦ ¸¸µç´Ù.

int Run(void * arg); ÀÌ ÇÔ¼ö´Â °Çµå¸®¸é ¾ÈµÇ´Â ÇÔ¼öÀÌ´Ù.

static void * EntryPoint(void * pthis); ÀÌ ÇÔ¼ö´Â ¾²·¹µåÀÇ ½ÃÀÛ Á¡ ¿ªÇÒÀ» ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ´Ü¼øÈ÷ pthis¸¦ Thread *·Î castingÇؼ­ Run ÇÔ¼ö¸¦ ºÒ·¯ÁØ´Ù.

virtual void Setup(); ÀÌ ÇÔ¼ö´Â ¾²·¹µå°¡ ¸¸µé¾îÁø ÈÄ, ½ÇÇàÀÌ ½ÃÀ۵DZâ Àü¿¡ ºÒ·ÁÁø´Ù. ÀÌ ÇÔ¼ö¸¦ override ÇÒ ¶§´Â, ºÎ¸ð classÀÇ Setup()¸¦ ºÎ¸£´Â °ÍÀ» ±â¾ïÇ϶ó.

virtual void Execute(void *); ÇÏ°íÀÚ ÇÏ´Â ÀÏÀ» À§ÇØ ÀÌ ÇÔ¼ö¸¦ overrideÇضó.


18.2.5. Thread Class »ç¿ëÇϱâ

thread class¸¦ »ç¿ëÇϱâ À§Çؼ­´Â, »õ·Î¿î class¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. ±×¸®°í ¸¸µé°íÀÚ ÇÏ´Â ±â´ÉÀ» À§ÇØ Execute()¸¦ overrideÇÏ¸é µÈ´Ù. ¶ÇÇÑ, Execute°¡ ºÒ¸®±â ÀüÀÇ ÃʱâÈ­¸¦ À§ÇØ Setup()À» overrideÇÒ ¼öµµ ÀÖ´Ù. ¸¸¾à, Setup()À» overrideÇÑ´Ù¸é, ºÎ¸ð classÀÇ Setup()À» ºÎ¸£´Â °ÍÀ» ±â¾ïÇ϶ó.


18.2.6. °á·Ð

ÀÌ ÀåÀº C++·Î ¾²·¹µå classÀÇ ±¸ÇöÀ» »ìÆ캸¾Ò´Ù. ¹°·Ð ÀÌ°ÍÀº ´Ü¼øÇÑ Á¢±Ù¹æ¹ýÀÌ°í, ´õ ÁÁÀº µðÀÚÀÎÀ» À§ÇÑ ±âÃÊ·Î ¾²ÀÏ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¸¸¾à ÄÚ¸àÆ®³ª Á¦¾ÈÇÏ°í ½ÍÀº °ÍÀÌ ÀÖÀ¸¸é, ¸ÞÀÏÀ» ½áÁֱ⠹ٶõ´Ù. Ryan Teixeira


19. C++ À¯Æ¿¸®Æ¼µé

C++ À¯Æ¿¸®Æ¼¸¦ À§ÇÑ ´ÙÀ½ »çÀÌÆ®¸¦ ¹æ¹®Çغ¸¶ó.


19.1. ¸Þ¸ð¸® Åø

¾Æ·¡ÀÇ ¸Þ¸ð¸® µð¹ö±ë ÅøµéÀ» »ç¿ëÇ϶ó.

  • "MPatrol" Àº °­·ÂÇÑ ¸Þ¸ð¸® µð¹ö±ë ÅøÀÌ´Ù. À¥»çÀÌÆ® : http://www.cbmamiga.demon.co.uk/mpatrol , ±×¸®°í http://www.rpmfind.net ¿¡ °¡¼­ 'mpatrol'·Î ã¾Æº¸¾Æ¶ó. ¸¸¾à, ¸®´ª½º¸¦ »ç¿ëÇÏ°í ÀÖ´Ù¸é, mpatrol*.src.rpm ÆÄÀÏÀ» rpmfind.net¿¡¼­ ´Ù¿î·Îµå ¹Þ¾Æ¶ó. mpatrol*.src.rpmÀ» ÃֽŹöÀüÀ¸·Î ¾÷µ¥ÀÌÆ® Çϱâ À§Çؼ­´Â, ¿¾³¯ mpatrol.spec ÆÄÀÏÀ» »ç¿ëÇÏ¿© ÃÖ½ÅÀÇ mpatrol*.tar.gzÀ» »õ·Î¿î ¼Ò½ºÆÐÅ°Áö(SRPM)À¸·Î ¸¸µé ¼ö ÀÖ´Ù.

  • ¸®´ª½º ¹èÆ÷ÆÇ ¾¾µð·Ò¿¡¼­ mem_test*.rpm ÆÐÅ°Áö¸¦ º¸¾Æ¶ó. ±×¸®°í http://www.rpmfind.net À¸·Î °¡¼­ mem_test ·Î ã¾Æº¸¾Æ¶ó.

  • ¸®´ª½º ¹èÆ÷ÆÇ ¾¾µð·Ò¿¡¼­ ElectricFence*.rpm ÆÐÅ°Áö¸¦ º¸¾Æ¶ó. ±×¸®°í http://www.rpmfind.net À¸·Î °¡¼­ electricfence·Î ã¾Æº¸¾Æ¶ó.

  • Purify Tool from Rational Software Corp http://www.rational.com

  • Insure++ Tool from Parasoft Corp http://www.parasoft.com

  • Linux Tools : http://www.xnet.com/~blatura/linapp6.html#tools

  • Google, Yahoo, Lycos, Excite, Mamma.com °°Àº ¼­Ä¡¿£ÁøÀ¸·Î °¡¼­ "Linux memory debugging tools"¶ó´Â Å°¿öµå·Î ã¾Æº¸¾Æ¶ó.


20. ÀÌ ¹®¼­ÀÇ ´Ù¸¥ Æ÷¸Ë

ÀÌ ¹®¼­´Â 14°¡Áö Æ÷¸ËÀ¸·Î ¹èÆ÷µÈ´Ù. - DVI, Postscript, Latex, Adobe Acrobat PDF, LyX, GNU-info, HTML, RTF(Rich Text Format), Plain-text, Unix man pages, ÇϳªÀÇ HTMLÆÄÀÏ, SGML (linuxdoc format), SGML (Docbook format), MS WinHelp Æ÷¸Ë.

ÀÌ howto ¹®¼­´Â

  • http://www.linuxdoc.org ¿¡¼­ HOWTOs¸¦ ´©¸£°í, À¥ºê¶ó¿ìÀú¿¡¼­ CTRL+f ³ª ALT+f¸¦ ÀÌ¿ëÇØ howto À̸§À» ³Ö¾î¼­ ãÀ» ¼ö ÀÖ´Ù.

¶ÇÇÑ, ´ÙÀ½ ¹Ì·¯»çÀÌÆ®¿¡¼­µµ ãÀ» ¼ö ÀÖ´Ù -

ÀÌ ¹®¼­´Âhttp://www.sgmltools.org¿¡¼­ ãÀ» ¼ö ÀÖ´Â "SGML-Tools"·Î ¾²¿©Á³´Ù. ¼Ò½º¸¦ ÄÄÆÄÀÏÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.

  • sgml2html xxxxhowto.sgml (html ¸¸µé±â)

  • sgml2html -split 0 xxxxhowto.sgml (ÇϳªÀÇ html file·Î ¸¸µé±â)

  • sgml2rtf xxxxhowto.sgml (RTF file¸¸µé±â)

  • sgml2latex xxxxhowto.sgml (latex file¸¸µé±â)


20.1. Acrobat PDF Æ÷¸Ë

PDF ÆÄÀÏÀº acrobatÀÇ distillÀ̳ª Ghostscript¸¦ »ç¿ëÇؼ­ Postscript ÆÄÀϷκÎÅÍ ¸¸µé ¼ö ÀÖ´Ù. ±×¸®°í Postscript ÆÄÀÏÀº LaTex ÆÄÀϷκÎÅÍ ¸¸µé¾îÁö´Â DVIÆÄÀÏ·Î ¸¸µé ¼ö ÀÖ´Ù. distill ¼ÒÇÁÆ®¿þ¾î´Â http://www.adobe.com. ¿¡¼­ ¹ÞÀ» ¼ö ÀÖ´Ù. ¾Æ·¡ÀÇ ¿¹Á¦¸¦ º¸¶ó.

bash$ man sgml2latex
bash$ sgml2latex filename.sgml
bash$ man dvips
bash$ dvips -o filename.ps filename.dvi
bash$ distill filename.ps
bash$ man ghostscript
bash$ man ps2pdf
bash$ ps2pdf input.ps output.pdf
bash$ acroread output.pdf &
ȤÀº ps2pdf °°Àº Ghostsciprt ¸í·É¾î¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ps2pdf´Â AdobeÀÇ Acrobat Distiller¿Í °ÅÀÇ °°Àº ¿ªÇÒÀ» ÇÑ´Ù (Áï, PostScript ÆÄÀÏÀ» PDF·Î ¹Ù²Û´Ù) ps2pdf ´Â Ghostscript¸¦ ½ÇÇà½ÃÅ°°í, pdfwrite¶ó´Â Ưº°ÇÑ "Ãâ·ÂÀåÄ¡"¸¦ »ç¿ëÇÏ´Â ÀÛÀº ½ºÅ©¸³Æ®ÀÌ´Ù. ps2pdf¸¦ »ç¿ëÇϱâ À§Çؼ­´Â pdfwrite ÀåÄ¡°¡ Ghostscript ÄÄÆÄÀÏ ½Ã¿¡ Makefile¿¡ Æ÷ÇԵǾîÀÖ¾î¾ß ÇÑ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ÇØ´ç ¹®¼­¸¦ º¸µµ·Ï Çضó.


20.2. linuxdoc À» Docbook Æ÷¸ËÀ¸·Î ¹Ù²Ù±â

ÀÌ ¹®¼­´Â linuxdoc SGML Æ÷¸ËÀ¸·Î ¾²¿©Á³´Ù. Docbook SGML Æ÷¸ËÀº linuxdoc Æ÷¸ËÀ» Æ÷ÇÔÇÏ°í, ´õ ¸¹Àº ±â´ÉÀ» °®°í ÀÖ´Ù. linuxdocÀº °£´ÜÇÏ°í »ç¿ëÇϱ⠽±´Ù. linuxdoc SGMLÆÄÀÏÀ» Docbook SGML·Î ¹Ù²Ù·Á¸é ld2db.sh ÇÁ·Î±×·¥°ú ¸î¸î perl ½ºÅ©¸³Æ®¸¦ »ç¿ëÇضó. ld2db¿¡¼­ ¾ò¾îÁö´Â °ÍÀº 100% ±ú²ýÇÑ °ÍÀÌ ¾Æ´Ï°í, clean_ld2db.pl perl ½ºÅ©¸³Æ®¸¦ »ç¿ëÇÒ Çʿ伺ÀÌ »ý±ä´Ù. ¶ÇÇÑ, Á÷Á¢ ¹®¼­¿¡¼­ ¸î¸îÀ» °íÃľßÇÒ ¼öµµ ÀÖ´Ù.

ld2db.sh ´Â 100% ±ú²ýÇÏÁö ¾Ê¾Æ¼­, ´ÙÀ½ °ú°°ÀÌ ½ÇÇàÇÏ·Á¸é ¿¡·¯°¡ ³¯ °ÍÀÌ´Ù.
	bash$ ld2db.sh file-linuxdoc.sgml db.sgml
	bash$ cleanup.pl db.sgml > db_clean.sgml
	bash$ gvim db_clean.sgml 
	bash$ docbook2html db.sgml
¶ÇÇÑ, perl ½ºÅ©¸³Æ®¸¦ µ¹¸° ÈÄ¿¡ ¸î¸î ÀÛÀº ¿¡·¯¸¦ °íÄ¡°í ½Í±âµµ ÇÒ °ÍÀÌ´Ù. ¿¹¸¦µé¾î, </Para>¸¦ ¸Å <Listitem>¸¶´Ù ³ÖÀ» ÇÊ¿ä°¡ ÀÖÀ» ¼öµµ ÀÖ´Ù.


20.3. MS WinHelp Æ÷¸ËÀ¸·Î ¹Ù²Ù±â

SGML Howto¸¦ Microsoft Windows Help ÆÄÀÏ·Î ¹Ù²Ü ¼öµµ ÀÖ´Ù. ¸ÕÀú, sgmlÀ» ´ÙÀ½°ú °°ÀÌ html·Î ¹Ù²ã¶ó.

	bash$ sgml2html xxxxhowto.sgml     (html ÆÄÀÏ ¸¸µé±â)
	bash$ sgml2html -split 0   xxxxhowto.sgml (ÇϳªÀÇ html ÆÄÀÏ·Î ¸¸µé±â)
±×¸®°í HtmlToHlpÀ̶ó´Â ÅøÀ» ¾²¸é µÈ´Ù. ¶ÇÇÑ, winhelp ÆÄÀÏÀ» ¸¸µé±â À§ÇØ sgml2rtf¸¦ ¾´´ÙÀ½, RTFÆÄÀÏÀ» ¾µ ¼öµµ ÀÖ´Ù.


20.4. ¿©·¯°¡Áö Æ÷¸ËÀÇ ¹®¼­¸¦ Àбâ

dvi Æ÷¸ËÀÇ ¹®¼­¸¦ º¸±â À§Çؼ­´Â, xdvi ÇÁ·Î±×·¥À» »ç¿ëÇضó. xdvi ÇÁ·Î±×·¥Àº Redhat ¸®´ª½ºÀÇ °æ¿ì ControlPanel | Applications | Publishing | Tex menu ¹öÆ°¿¡ ÀÖ°í, tetex-xdvi*.rpm ÆÐÅ°Áö¿¡ µé¾îÀÖ´Ù. dvi ¹®¼­¸¦ ÀÐÀ¸·Á¸é ´ÙÀ½°ú °°Àº ¸í·ÉÀ» ¾²¸é µÈ´Ù.

	xdvi -geometry 80x90 howto.dvi
	man xdvi
±×¸®°í À©µµ¿ì Å©±â¸¦ ¸¶¿ì½º·Î Á¶Á¤ ÇÑ´Ù. À̸®Àú¸® »ìÇ¥º¸±â À§Çؼ­´Â È­»ìǥŰ³ª PageUp, PageDownÅ°, ±×¸®°í 'f', 'd', 'u', 'c', 'l', 'r', 'p', 'n' Å° µîÀ» À§, ¾Æ·¡ Áß¾ÓÀ¸·Î ¿òÁ÷À̰ųª ´ÙÀ½ÆäÀÌÁö, ÀÌÀüÆäÀÌÁö µîÀ¸·Î ³Ñ±â±â À§ÇØ ¾µ ¼ö ÀÖ´Ù. expert ¸Þ´º¸¦ ²ô±â À§Çؼ­´Â 'x'¸¦ ´©¸£¸é µÈ´Ù.

Postscript ÆÄÀÏÀ» Àбâ À§Çؼ­´Â 'gv'(ghostview)ÇÁ·Î±×·¥À̳ª 'ghostscript'¸¦ ¾²¸é µÈ´Ù. ghostscript ÇÁ·Î±×·¥Àº ghostscript*.rpm ÆÐÅ°Áö¿¡ ÀÖ°í, gv ÇÁ·Î±×·¥Àº gv*.rpm ÆÐÅ°Áö¿¡ µé¾îÀÖ´Ù. À̵éÀº ControlPanel | Applications | Graphics menu ¹öÆ°¿¡ ÀÖ´Ù. gv ÇÁ·Î±×·¥ÀÌ ghostscriptº¸´Ù ÈξÀ »ç¿ëÇϱâ ÆíÇÏ´Ù. ghostscript¿Í gv ´Â À©µµ¿ì³ª OS/2 µî ´Ù¸¥ Ç÷§Æû¿¡¼­µµ »ç¿ë°¡´ÉÇÏ´Ù.

Postscript ¹®¼­¸¦ Àбâ À§Çؼ­´Â ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù -

		gv howto.ps
		ghostscript howto.ps

HTML Æ÷¸ä ¹®¼­´Â Netscape Navigator, Microsoft Internet explorer, Redhat Baron Web browser ³ª ´Ù¸¥ À¥ºê¶ó¿ìÀú·Î ÀÐÀ¸¸é µÈ´Ù.

latex, LyX ´Â latexÀÇ X-Window ÇÁ·ÐÆ®¿£µåÀÎ LyX ·Î ÀÐÀ¸¸é µÈ´Ù.


21. ´Ù¸¥ ¾ð¾î·ÎÀÇ ¹ø¿ª

´Ù¸¥ ¾ð¾î·ÎÀÇ ¹ø¿ªÀº ȯ¿µÇÑ´Ù.


22. Copyright

Copyright´Â LDP(¸®´ª½º ¹®¼­È­ ÇÁ·ÎÁ§Æ®)¿¡ µû¶ó GNU/GPLÀÌ´Ù. LDP´Â GNU/GPL ÇÁ·ÎÁ§Æ® ÀÌ´Ù. ºÎ°¡ÀûÀÎ ¿ä±¸»çÇ×Àº ÀúÀÚÀÇ À̸§°ú À̸ÞÀÏÁÖ¼Ò, ÀÌ Copyright ¸¦ ¾ðÁ¦³ª Æ÷ÇÔ½ÃÄÑ´Þ¶ó´Â °ÍÀÌ´Ù. ¸¸¾à º¯°æÀ̳ª Ãß°¡ÇÒ »çÇ×ÀÌ ÀÖÀ¸¸é ÀÌ ¹®¼­ÀÇ ÀúÀڵ鿡°Ô ¾Ë·ÁÁֱ⠹ٶõ´Ù. ÀÌ ¹®¼­¿¡ ¾ð±ÞµÈ ȸ»çÀ̸§À̳ª »óÇ¥´Â °¢°¢ ±× ¼ÒÀ¯ÁÖÀÇ °ÍÀÌ´Ù. Copyright policy is GNU/GPL as per LDP (Linux Documentation project). LDP is a GNU/GPL project. Additional requests are that you retain the author's name, email address and this copyright notice on all the copies. If you make any changes or additions to this document then you please intimate all the authors of this document. Brand names mentioned in this document are property of their respective owners.


23. ºÎ·Ï A String ÇÁ·Î±×·¥ ÆÄÀÏ

¸ðµç ÇÁ·Î±×·¥ ÆÄÀÏÀ» ÇϳªÀÇ tar.gz À¸·Î 4절¿¡¼­ ¹ÞÀ» ¼ö ÀÖ´Ù. ±×¸®°í ¾ÐÃàÀ» ´ÙÀ½°ú °°ÀÌ Ç®¸é µÈ´Ù.

bash$ man tar
bash$ tar ztvf C++Programming-HOWTO.tar.gz
ÀÌ´Â ¾ÐÃàµÈ ÆÄÀϵéÀ» º¸¿©ÁÙ °ÍÀÌ´Ù.

bash$ tar zxvf C++Programming-HOWTO.tar.gz
ÀÌ´Â ¾ÐÃàÀ» ½ÇÁ¦·Î Ç® °ÍÀÌ´Ù.


ID
Password
Join
Take care of the luxuries and the necessities will take care of themselves.


sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-01-31 17:23:20
Processing time 0.0028 sec