1 장

C++ 프로그래머와 초심자 제위에게 고함


1.1.1 이 책은...

이 책은, 도입부, 1부 ~ 4부 그리고 부록 으로 구분되어 있다. 이 책은, 알고리즘 작성보다는 프로그램 구성에 더 무게를 둔 책이다. 그러므로 어려운 알고리즘에 대한 이야기가 나온다면 더 단순하고 더 설명하기 좋은것으로 대체해서 설명한다고 한다. 그래서, 책에서의 전반적인 예제는 실무 코드 같지 않다고 한다.


1.1.2 연습문제가...

있는데, 난이도 *1 가 10분 걸렸다면 *2 는 1시간 *3 은 하루짜리 난이도라고 생각하면 된다. 사람에 따라 다르니, 연습문제가 있고, 풀어 보라는 식으로 설명 한다.


1.1.3 이 책의 C++ 코드는 표준이다.

표준안 1998, 2003에 정의한 표준 C++ 이다, 많은 컴파일러들에서 테스트 해보았지만, 최신 기능을 제외하고는 잘 동작한다고 하며, 컴파일러 호환성에 대해서 알고 싶다면, 부록 B를 보라고 한다.


1.2 C++을 공부한다는 것은?

C++ 학습의 포인트는 언어의 기술적 세부사항을 파지 말고, 어떻게 하면, 잘 설계 할수 있는지? 어떻게 하면, 재사용성이 좋은지? 어떻게 하면, 유지 보수가 효과적인지에 대해서 파라고 한다.

C++은 한번에 다 알려고 공부 하지 말고, "새롭고 더 좋은 소프트웨어 제작법을 공부하기 위해서" 공부 하는게 더 좋다고 한다. 공부 할 때는 혼자 하지 말고, 인터넷 등에서 논문이나 다른 스타일의 책도 같이 보는게 효과적이라고 한다.


1.3 C++ 설계에 관련된 이야기들

최대한 C와 호환성을 맞추려 했고, 사용하지 않으면 비용을 내지 않아도 된다는 철학을 가지고 만들어진 언어라고 한다. 더 자세한 이야기는 Stroustrup, 1994를 읽으라고 한다.


1.3.1 C++의 효율과 프로그램 구조

C++ 은 C보다 더 풍부한 표현력을 제공해 주며, 많은 방식의 코딩 스타일을 제공해 주고 있다. 객체지향, 절차지향, 메타프로그래밍, 런타임 다형성 등을 제공해 주고 있다.


1.3.2 C++ 설계에 깃든 철학

C++ 은 C언어의 호환성에서 볼 수 있듯이, 기계에 친화적인 언어이며, 문제에 친화적인 언어이다. 문제에 친화적인 이유는 해결 방식을 이루는 개념을 정확하고 간명하게 표현할 수 있어야 하기 때문인데, C++ 에선 바로 클래스이다.(사실 메타프로그래밍도 어마어마하다.)


1.4 C++의 역사에 대한 짧은 기록

1. C++ 은 C에서 많은 것을 가져 왔다. (타입 시스템 등)
2. C++ 은 시뮬라67(simula67)에서도 많은 것을 가져 왔다.(클래스 개념)
3. C++ 은 알골 68(Alogl68)에서도 많은 것을 가져 왔다.(연산자 오버로딩)
4. C++ 은 에이다(Ada)의 제네릭스(generics)에서 부분적으로 템플릿에 영향을 받았다.
5. C++ 은 클루(Clu)의 매개변수화 모듈에서도 부분적으로 템플릿에 영향을 받았다.
6. C++ 은 에이다, 클루, ML에서 예외 처리 매카니즘에 영향을 받았따.
7. C++ 은 1985년 ~ 1995년 사이에 다중상속, 순수가상함수, 네임스페이스 기능들을 도입시켰다.
8. C++ 은 1980년에 연구 목적으로 클래스 개념만 도입되어 사용 되어 오다 1983년 7월 세상에 나왔다.
9. C++ 이란 이름은 1983년 릭 매시티(Rick Mascitti)가 뽑아 주었다.
10. C++ 의 표준화 작업은 AT&T 벨 연구소이다.
11. C++ 의 위원회는 휴렛 팩커드의 주도하에 1989년 12월 ANSI의 X3J16 위원회가 만들어진다.
12. C++ 은 1990년 결성된 공동(ANSI+ISO) C++ 표준화 위원회는 공론장 역활을 충실히 해왔다.
13. C++ 은 1991년 6월에는 ANSI에서 채택한 C++ 표준안이 ISO C++ 표준화 작업에 포함 되어졌다.
14. C++ 은 1995년 4월에 일반인에게 공개되는 최초의 C++ 표준안 초안이 만들어 지게 된다.
15. C++ 은 1998년 ISO C++ 표준안(ISO/IEC 14882)가 정식으로 인정되었다.
16. C++ 은 2003년 세세한 오류와 모순된 부분을 바로 잡는 정오표가 발표 되었다.
17. C++ 의 복소수(complex), 벡타(vector), 스택(stack) 클래스는 비야네 스트롭스트룹이 설계한 연산자 오버로딩을 가지고 있다.
18. C++ 의 문자열(string) 과 리스트(list) 클래스는 조나단 쇼피로(Jonathan Shopiro)와 비야네가 함께 개발했다.
19. C++ 의 스트림 라이브러리는 비야네가 설계하고 구현했다.
20. C++ 의 스트림 라이브러리를 제리 슈워츠(Jerry Schwarz)가 앤드류 쾨그니의 조작자(manipulator) 기법을 추가하여 iostream을 만들었다.
21. c++ 의 iostream 은 표준화 작업을 거치면서 더 다듬어 졌고, 네이던 마이어스(Nathan Myers), 노리히로 쿠마가이(Norihiro Kumagai)가 상당 작업을 맡아서 작업했다.
22. C++ 의 템플릿 기능은 앤드류 쾨그니, 알렉스 스테파노프(Alex Stepanov) 그리고, 비야네가를 비롯한 몇 명이 vector, map, list, sort 템플릿을 고안하면서 강력한 추진력을 느끼고 개발한것이다.
23. C++ 의 템플릿 컨테이너와 알고리즘은 알렉스 스테파노프가 연구한 것이 기폭제가 되어, 표준 C99 라이브러리에 포함되었다.
24. C++ 의 수치계산을 돕는 valarray 라이브러리는 원래 켄트 버지(Kent Budge)의 작품이다.


1.5 C++ 은 이렇게 사용 되고 있다.

.... 모든 분야에 사용 되고 있으며, 그 유력을 자랑하고 있다고 한다.


1.6 C와 C++

C는 C++의 밑바탕으로 선택한 언어이며, C의 장점을 고스란이 유지한다. 이런 장점을 유지하기 위해서 각 언어의 차이를 최소한으로 사용 했다. 오해될 만한 사항은 C는 결코 C++ 을 배우기 전에 배우는 과목이 아니다. C에서 구현하는 훌륭한 기법들을 버리기엔 아까우므로 C 도 함께 하는것이 좋다.


1.6.1 C 프로그래머를 위한 제언

C++ 의 장점을 잃지 않도록 하라고 한다.


1.6.2 C++ 프로그래머를 위한 제언

.. C++ 은 매우 방대하기 때문에, 어디가 어떻게 변화하고 어떻게 연계되며, 새로운 어떠한 기법이 나왔는지, 주의 깊게 살펴보라고 한다.


1.7 C++ 프로그래밍에 대한 소견

프로그램 설계는, 1. 문제를 이해하고, 2. 문제를 해결하는 개념을 정리하고, 그 해결방법으로 표현하는 것이다. 하지만 경우에 따라서는 우선 짜 본 후에 생각해 봐야 할 것도 있다. 따라서, C++ 문법이나 세부사항을 생각하기 보다는 "어떻게 하면 잘 짤 수 있을까?" 를 생각하는 자세로 임하라고 한다.


1.8 필자의 조언

C++ 프로그래밍을 하는데 있어 도움이 될 만한 조언이 있긴 하지만, 너무 받아들이지 말라고 한다.
a. 별도의 아이디어는 클래스로 만든다.
b. 그 아이디어의 개체는 그 클래스의 객체로 만든다.
c. 공통 인터페이스를 가지면, 그 인터페이스는 추상 클래스로 만든다.
d. 두 클래스의 구현 코드가 똑같으면, 공통된 부분을 뽑아 기본 클래스로 만든다.
e. 컨테이너가 될 클래스는 템플릿 으로 만든다.
f. 컨테이너에 사용될 함수는 템플릿 함수로 만든다.
g. 어떤 클래스, 템플릿이 서로 논리적으로 가까운 관계를 가지고 있다면, 이것들은 같은 네임스페이스 안에 넣는다.

하위 수준의 타입을 정의 하려 할 떄.(많이 사용 되니까.)

ㄱ. 전역 데이터를 사용하지 않는다.
ㄴ. 전역 함수를 사용 하지 않는다.
ㄷ. public 멤버 데이터를 사용 하지 않는다.
ㄹ. 프렌드를 사용하지 않는다.(경우에 따라 어느 정도 허용 하고)
ㅁ. 클래스에는 타입 필드를 넣지 않고, 가상 함수를 넣는다.
ㅂ. 인라인 함수를 사용하지 않는다.(부득이한 경우를 제외하곤...)


참고 문헌.

엄청나게 많다.


총평

1.8 필자의 조언에서 많이 생각해 보게 되었다. 그 중 하나는, "두 클래스의 구현 코드가 똑같으면, 공통된 부분을 뽑아 기본 클래스로 만든다." 인데, 요즘 들어서 이런 작업이 오히려 읽기나, 생각하기에 무척 불편을 끼친다는 생각을 들게 되었기 때문이다.

다른 사람이 만들어 놓은 코드에서 가장 이해하기 힘든 부분이 바로 "상속 체계"이다, 여러가지 상황에 겪어 보았을 때 상속을 쓰지 않아도 충분하다면, 상속을 쓰지 않는게 오히려 더 좋았기 때문에, 이 상속 체계 부분에 대해서는 좀 더 생각해 보고 선택해야 될 것 같다는 생각이 든다.


신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요