류광님의 블로그에 갔다가 C++ 창시자인 Bjarne Stroustrup의 C++ FAQ 링크가 있어 시간 날적에 하나 하나 번역해 보려고 합니다. 나름대로 살도 많이 붙여보려 노력은 할테지만.... 아마두 번역하는 선에서 끝나지 않을까 하네요.. ㅋ 영어 공부도 할겸... C++의 철학도 느낄 수 있지 않을까 하는 기대에서 작업합니다..
+ Bjarne Stroustrup's C++ Style & Tech FAQ
http://www.research.att.com/~bs/bs_faq2.html#simple-program
C++ 코드를 어떻게 작성해야하느냐는 질문을 자주 받는다. 아래의 예제 코드를 예로 들겠다... (어떻게 작성하느냐는 질문은 너무 포괄적인지라, 어떠한 예를 들더라도 설명할 수 없는 질문이다)
여기에 몇가지 주목해야할 점이 있는데...
- 이 프로그램은 표준 라이브러리을 사용한 표준 ISO C++ 코드이고, 표준 라이브러리는 'std' namespace 안에 선언되어 있는데, 다시 이 'std' namespace는 확장자 .h 가 없는 헤더파일 안에 있다.
- 윈도우즈 환경에서 이 소스 코드를 컴파일하려면, 콘솔(Console) 어플리케이션으로 컴파일 해야겠고.. 위의 코드는 구현소스코드이니까 확장자를 .cpp로 해야한다. 그렇지 않으면 C++ 코드가 아닌 C 코드로 컴파일러가 판단하고 컴파일하게된다. 확장자가 cpp뿐만 아니라 대문자 .C(소문자 .c는 C 코드로 인식됨)과 .cxx도 C++ 코드로 컴파일러가 인식하게 된다.
- main() 함수는 int 형을 리턴하는데, 0 값으로 리턴하는 경우 프로그램이 성공적으로 수행되었음을 의미하며 나머지 값을 오류 코드값으로 사용된다.
- vector 컨테이너를 씀으로해서 정해지지 않은 크기의 배열(메모리)에 대한 오버플로우가 발생하지 않도록 보장할 수 있다. 하지만 이것도 어디까지나 개발자의 주의를 요한다. vector 클래스는 [] 연산자를 제공하여 배열처럼 사용할 수 있도록 하는데, 효율성을 이유로 첨자의 경계검사를 하지 않는다. 물론 이경우는 메모리의 릭은 아니겠지만 잘못된 메모리 읽기 또는 쓰기 에러와 함께 프로그램은 다운될것이다.
- cin>>d 코드는 키보드로부터 데이터를 입력받는데, 입력받은 값이 d의 Type이 아닌 경우, NULL을 반환하게 된다. 이때 cin.eof()을 검사해보면 End Of File 상태가 아니게 되므로, 잘못된 데이터 입력이라는 것을 알 수 있다.
- vector 컨테이너는 자신의 크기를 알고 있으니까, 데이터를 추가하거나 삭제할때마다 셀 필요가 없는 편리함이 있겠고...
- 이 프로그램은 vector 컨테이너 이외에 별다른 메모리 사용이나 관리를 하지 않으므로 메모리 릭(Leak)이 없다. vector 클래스는 자신의 데이터를 저장하는데 사용하는 메모리를 계속 추적하면서 관리하는데, 데이터를 추가하면 내부적으로 필요한 만큼의 메모리를 자동으로 할당받아 사용하고 데이터를 제거하면 마찬가지로 메모리를 자동으로 해제시킨다. 그러니까 개발자는 vector의 데이터에 대해서 메모리의 할당과 해제를 신경쓸 필요가 없다.
- cin.end()를 검사해서 데이터의 입력이 옳바르게 끝났는지, 잘못된 데이터를 입력했는지를 알 수 있는데, 데이터 입력을 끝내게 되는데, cin.end()가 참일경우 End Of File 상태로 옳바르게 끝난 상태이고, 거짓인경우 옳바르지 못한 데이터의 입력(실수값인데 문자열을 입력했다던지...)한 것이다. Unix 계열에서 이 프로그램을 실행하게 된다면 키보드로 ^D(Ctrl + D)를 누르면 되고, Windows라면 End Of File 문자를 식별하지 못하는 버그 때문에, 직접 입력의 끝을 의미하는 데이터를 입력 받음으로써 입력의 끝을 판단하도록 해야할 것이다. 아래 코드처럼...
그런데 사실, Windows가 스트림의 끝임을 나타내는 코드문자값이 ^D가 아니고 ^Z이다. 즉, ^Z를 누르면 End Of File..! 입력의 끝을 프로그램에게 알릴 수 있다.
지금까지 C++ 언어로 코딩할때 생각해봐야할 많은 것(매우 많은 것) 중에 빙산의 일각만을 살펴본 내용이다.
끙.... 별로 의미 없는(?) 것을 골라 해석한게 아닌지 싶네요.. 처음이니깐 뭐.. 시작했다는데 의미를 두고... 다음에 좋은 것을 골라 해석해 봐야겠습니다.
|