Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>
서문

1. 서문

(이 문서의 최신판은 http://milkyway.bounceme.net/HOWTO/cpphowto/C++Programming-HOWTO.html 에서 구할 수 있다)

이 문서의 목적은 C++에 관한 URL과 C++ online 책에 대한 링크, C++ 프로그래밍 팁 등을 포괄적으로 제공하는 것이다. 또한, 이 문서는 Java 스타일의 String class, string tokenizer, 메모리 함수등 일반적인 C++ 프로그램에서 널리 쓰일 수 있는 많은 함수들을 제공한다. C++ 과 Java는 오늘날 많은 소프트웨어 프로젝트에서 쓰이고 있다. 프로그래머는 C++과 Java를 번갈아가며 쓰게될 것이고, 이 Java 스타일의 class가 매우 유용함을 알게 될 것이다. 이 library와 C++ 표준 라이브러리의 사용법을 알려줄 다양한 예제가 제시될 것이다.

이 문서는 C++에 대한 교과서가 아니며, 이에 대해서는 이미 몇가지 좋은 on-line 책들이 있다. C++이 꽤 오랜시간동안 사용되어왔기 때문에, 매우 많은 수의 C++ 문서/글/튜토리얼이 인터넷상에 존재한다. 만약 당신이 C++을 처음 접하는 것이고, C++ 프로그램을 짜 본 적이 없다면, 13절장에 링크되어 있는 on-line C++ 책을 먼저 읽어보거나, Amazon 이나 barnes과 같은 곳에서 C++ 책을 사 볼 것을 추천한다.

누군가가 말했듯 - C/C++ 언어는 OS나 디바이스드라이버, 빠른 응답을 필요하는 real-time 프로그램등을 만드는 시스템 엔지니어나 쓰라고 하고, 당신은 2002년보다 컴퓨터가 몇백만배 빨라질 2005년을 생각하면 Java나 PHP-scripting을 써야한다. 하드웨어 는 점점 싸면서도, 빨라진다.

1.1. C++ 프로그램? C++ vs. Java/PHP

C++은 가장 강력한 언어들 중 하나이고, Java나 PHP-scripting 같은 것이 나타났지만, 앞으로도 오랜 시간동안 쓰이게 될 것이다. 실시간의 매우 빠른 응답을 필요하는 프로그램에는 C나 C++이 사용된다. C++은 매우 빠르게동작하고, 실제로 Java보다 10배에서 20배 정도 빠르다 . Java는 C++에서 "파생된" 언어이다. Java의 단 하나의 문제점은 바로 - "Java 는 느리다!!"는 것이다. VM위에서 도는 Java 바이트코드는 컴파일된 실행코드보다 느리고, JIT(Just-In-Time) 컴파일러 위에서 더 빠르게 돌기는 하지만, 여전히 C++보다는 느리다. 최적화 된 C/C++ 프로그램은 JIT 나 그 이전의 컴파일러로 컴파일 된 Java 코드보다 약 3 에서 4배 정도 빠르다!! 그렇다면, 왜 사람들이 Java를 쓰는가? 이는 Java가 순수한 객체지향을 지원하고, Java의 자동화된 메모리 관리로 인해 프로그래밍하기가 쉬우며, 프로그래머들이 직접 메모리 관리하기를 싫어하기 때문이다. 이 문서는 C++의 메모리 관리를 자동화하여 훨씬 사용하기 쉽게 하고자 했다. 여기서 나오는 library는 C++을 Java 만큼 쉽게 느끼게 해줄 것이고, C++이 Java와 경쟁할 수 있도록 해줄 것이다.

수동적인 메모리 관리를 위해 C++ 프로그램 디버깅의 대부분 시간이 소모된다. 이 문서는 디버깅 시간을 줄이기 위한 몇가지 아이디어와 팁을 줄 것이다.

언제 C++을 써야하고 언제 Java/PHP를 써야하는가?

아래와 같은 경우엔 C++을 써라:

  • 실행속도와 성능이 매우 중요한 프로그램을 만들 때.

  • 만드는 프로그램의 사용자 수가 많을 때. C++은 컴파일-링킹-디버깅 사이클이 필요하기 때문에, 프로그램 개발에 더 많은 시간이 소요된다. 따라서 사용자수가 충분히 많을 때에나 적당하다. 실행파일을 만들기 위해 많은 수의 object파일을 링크하는 것은 꽤 시간이 걸린다. (링크하는데 걸리는 시간을 줄이기 위해 archive나 라이브러리, 공유 라이브러리를 사용할 수도 있다.)

  • C++프로그래밍 경험이 많을 때.

Java/PHP를 써야할 경우:

  • (C/C++로 작성되는 것에 비해서) 실행속도와 성능이 중요하지 않을 때.

  • 생산 비용을 낮추기 위해 - 컴파일-링크 사이클이 없기 때문에, Java/PHP는 C++보다 개발이 빠르다.

  • 빠른 개발이 필요할 때.

  • 코드 유지보수를 쉽게 하기 위해. C++ 을 유지보수하는 것이 Java나 PHP-scripting 보다 훨씬 어렵다.

  • Java와 PHP-scripting은 미래이다, 하드웨어의 속도는 분자와 원자, 원자보다 작은 크기의 컴퓨터 도입과 함께 급등할 것이다. 미래의 컴퓨터는 오늘날 컴퓨터의 수조배의 성능을 가질 것이다. 미래에 하드웨어 성능이 진보함과 함께, Java나 PHP-script의 느린 실행 속도는 중요치 않게 될 것이다. 오늘날 당신이 쓰는 컴퓨터(현재는 2002년이다.)는 엄청나게 느리고, 기어가고 있으며, 충분히 빠르지 못하다.

NOTE: Java 컴파일러 (JIT 나 다른 것들)에 많은 진보가 있었다. Java 프로그램은 GNU GCJ http://gcc.gnu.org/java로 컴파일 될 수 있다. GCJ는 간편하고, 최적화되어있으며, 진보적인 Java 프로그래밍 언어를 위한 컴파일러이다. GCJ는 Java source 코드를 머신 코드로 바로 컴파일 할 수도 있고, Java 바이트코드(class file)로 컴파일 할 수도 있다.

GCJ 정보:

1.2. 어떤 것을 선택할 것인가. Ada95, C, C++, Java 아니면 PHP?

언어의 선택은 어려운 일이다. 여기엔 너무나 많은 고려할 사항이 있다 - 개발자, 사람의 능력, 비용, 툴들, 정책 (국가의 정치 정책까지도), 사업가나 회사들에 대한 영향까지. 기술적인 이유로는 최적의 언어일지라도 단순히 정치적인 결정으로 인해 선택되지 못할 수도 있다.

David Wheeler의 언어 비교를 보자. Ada 비교 차트. Ada가 93%, Java는 72%, C++은 68% C는 53%을 각각 받았다. C++과 Java는 점수면에서는 비슷하다 (4% 차이). Ada의 개발 비용은 Stephen F. Zeigler에 따르면 C++의 반절이다. Ada95는 아래에서 구할 수 있다 -

C++ 컴파일러는 C 컴파일러보다 훨씬 복잡하고, C++은 C보다 약간 느리게 동작할 수 있다. C 컴파일러는 충분히 오랬동안 잘 쓰여져왔다.

몇몇 시스템에서, 당신은 생성된 코드를 최적화 하기 위해 몇가지 옵션을 쓸 수 있다.

오늘날, C는 주로 운영체제나 디바이스 드라이버, 빠르게 작동해야하는 프로그램을 쓰기 위해 로우레벨 시스템 프로그래밍에 쓰인다.

Note: 이 HOWTO에 제공되는 String, StringBuffer, StringTokenizer class를 이용하여 C++ 코드를 Java와 완전히 똑같이 쓸 수 있다. 이 문서의 일부는 C++로 Java class를 흉내냄으로써 C++과 Java의 차이를 줄이고자 했다. C++과 Java를 왔다갔다하는 Java 프로그래머들은 이 String class를 좋아할 것이다.

만약 C++의 작성-컴파일-디버깅-컴파일 싸이클이 싫다면, web 개발이나 일반적이 프로그래밍에 쓰일 수 있는 PHP같은 script 언어를 알아보아라. PHP나 PERL같은 script언어는 빠른 어플리케이션 개발을 가능하게 한다. PHP는 몇가지 객체지향을 위한 특징도 갖고 있다. PHP HOWTO는 http://doc.kldp.org/wiki.php/LinuxdocSgml/PHP-HOWTO 에서 볼 수 있고, 더 자세한 정보는 PHP 공식 홈페이지를 참고하면 된다.

1.3. 현재 C++ 컴파일러의 문제점

C++은 C를 포함하기 때문에, C의 *나쁜* 점들을 모두 갖고 있다. 메모리의 수동 할당과 해제는 지루하고, 에러를 만들어내기 일쑤이다. ( 9.3절 를 보라).

C 프로그래밍에서는 다음과 같은 것들로 인해 메모리 릭이나 오버플로우가 매우 흔하다.

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

char *strcpy의 사용은 "오버플로우", "경계침범에러(fence past errors)", "메모리 오염(memory corruption)", "다른변수 침범(step-on-others-toe)" 이나 "메로리 릭(memory leaks)" 등의 끔찍한 메모리 문제를 일으킨다. 메모리 문제는 매우 디버깅이 힘들고, 따라서 고치기는데 많은 시간이 든다. 메모리 문제는 프로그래머의 생산성을 떨어뜨린다. 이 문서는 C++의 이러한 단점을 해결하기 위해 고안된 여러가지 방법들을 통해, 프로그래머의 생산성을 높이는데 도움을 주고자 한다. 메모리 관련 버그는 잡기 힘들고, 경험많은 프로그래머들도 메모리 관련 문제를 고치는 데는 며칠에서 몇주가 걸린다. 메모리 버그는 몇달동안 코드 속에 숨어서 갑작스런 프로그램 정지를 일으킬 수 있다. char * 와 C/C++에서의 포인터 사용으로 인한 메모리 버그는 디버깅과 프로그램 정지로 인해 매년 20억 달러에 해당하는 시간의 소모를 일으킨다. 만약 C++에서 char *포인터 를 사용한다면, 그리고 특히 프로그램의 크기가 10,000 줄이 넘어가는 상황이라면, 매우 힘든 일이 될 것이다.

따라서, 아래의 것들이 C-style에서의 문제점을 극복하기 위해 제안되었다. 앞에 나올 수록 더 좋은 것이다.

  1. 포인터 대신 레퍼런스를 사용한다.

  2. (이 HOWTO에 주어진) Java 형식의 class를 사용하거나, C++ 표준라이브러리의 string class를 사용한다.

  3. C++에서의 문자 포인터(char *) 사용은 String class를 사용하지 못할 때로 그 사용을 제한한다.

  4. 만약 C++에서의 문자 포인터(char *)를 사용하고 싶지 않을 때는, extern 연계를 이용하는 (char *)를.

"C의 char *"를 사용하기 위해서는, C 프로그램을 다른 파일에 넣고, 연계명시extern "C" 를 이용하여 C++ 프로그램에 링크한다 -

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

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

extern "C" 는 연계 명시이고, 양 중괄호로 둘러싸인 블록안의 모든 내용이 C++이 아닌 C의 연계 방법을 사용한다는 말이다.

'String 클래스'는 메모리 할당과 해제를 위해 생성자와 파괴자를 이용하고, ltrim, substring 등등과 같은 함수를 제공한다.

또한 관련된 7절 를 사용하는 C++ 컴파일러에서 찾아보아라. string 클래스는 표준 C++ 라이브러리의 일부이고, 여러가지 문자열 관련 함수를 제공한다.

C++ 'string 클래스''String 클래스' 라이브러리가 많은 문자열 함수를 제공하기 때문에, 직접 문자열 함수를 쓰기 위해 문자 포인터를 사용할 필요성이 거의 없다. 또한, C++ 프로그래머는 항상 'malloc'이나 'free'대신 'new', 'delete'를 사용해야 한다.

두 문자열 클래스는 char *char []가 할 수 있는 모든 일을 할 수 있다. 그리고 더 좋은 점은 메모리 문제나 메모리 할당에 대해 전혀 걱정할 필요가 없다는 것이다.