Effective C++ : 1

Updated:

Chapter1. C++에 왔으면 C++의 법을 따르자

항목 1: C++을 언어들의 연합체로 바라보는 안목은 필수

 초창기의 C++은 단순히 C 언어에 객체 지향 기능 몇 가지가 결합된 형태였다. 오죽하면 C++의 처음 이름조차도 이 점을 드러내려는 듯 ‘클래스를 쓰는 C(C with Classes)’였을까.

 C++은 그 후 꾸준한 성장을 거쳤다. 기능, 아이디어, 프로그래밍 전략들을 취해 자기 것으로 만드는 데 있어 점점 대담하고 과감한 행보를 보였다. 이렇게 발전한 오늘날의 C++은 다중패러다임 프로그래밍 언어(multiparadigm programming language)라고 불린다.

 절차적(procedural) 프로그래밍을 기본으로 해 객체 지향(object-oriented), 함수식(functional), 일반화(generic) 프로그래밍을 포함해 메타프로그래밍(metapro-gramming) 개념까지 지원하고 있다. 이런 엄청난 표현력과 유연성 덕택에 C++은 소프트웨어 개발에 있어 대체할 만한 것이 없는 도구가 되었지만, 혹자에게는 어느 정도 혼동을 줄 여지가 있는 것도 사실이다. 그렇다면 C++은 어떻게 이해해야 잘했다고 소문이 날까?

 가장 쉬우면서 정확한 방법은 C++을 단일 언어로 바라보는 눈을 넓혀, 상관관계가 있는 여러 언어들의 연합체(federation)로 보아라. 그리고 나서 각 언어에 관한 규칙을 각개 격파하는 것이다. 이렇게 해 가면 시각이 단순해지고 명확해지며, 기억하기도 편하다. 물론, 규칙은 언어마다 정도의 차이는 있겠으나 다를 수 있다. C++을 제대로 따라잡으려면, 이 언어가 여러 개의 하위 언어(sublanguage)를 제공한다는 점을 새기고 있어야 한다. 하위 언어는 다음 4가지이다.

  1. C : C++을 처음 배우는 사람조차도 알고 있는 불변의 사실이 이것이다. C++은 여전히 C를 기본으로 하고 있다. 블록, 문장, 선행 처리자, 기본제공 데이터타입, 배열, 포인터 등 모든 것이 C에서 왔다.
  2. 객체 지향 개념의 C++ : 이 부분에 ‘클래스를 쓰는 C’에 관한 것이 모두 해당된다. 클래스(생성자와 소멸자 개념까지), 캡슐화, 상속, 다형성, 가상 함수(동적 바인딩) 등이다. 학교에서 배웠던 객체 지향 설계의 규칙들 대부분이 그대로 들어맞는 부분이라고 보면 된다.
  3. 템플릿 C++ : C++의 일반화 프로그래밍 부분으로, 많은 프로그래머들이 경험해 보지 않은 영역 중 하나이다. 템플릿의 주체 못할 강력함이 너무나도 크고 훌륭해서 완전히 새로운 프로그래밍 패러다임이 파생되기까지 했다. 이름하여 템플릿 메타프로그래밍(template metaprogramming: TMP)이다.
  4. STL : STL은 이름에서 알 수 있듯이 템플릿 라이브러리이다. 하지만 대단히 특별한 템플릿 라이브러리라고 말할 수 있다. STL의 세계는 컨테이너(container), 반복자(iterator), 알고리즘(algorithm)과 함수 객체(function object)가 만수산 드렁칡처럼 얽혀 돌아가는 것을 규약으로 삼고 있으나, 템플릿과 라이브러리는 얼마든지 다른 아이디어를 중심으로 만들어질 수 있다. 또한, STL은 나름대로 독특한 사용규약이 있어서 STL을 써서 프로그래밍하려면 그 규약을 따르면 된다.

 C++은 한 가지 프로그래밍 규칙 아래 똘똘 뭉친 통합 언어(unified language)가 아니라 네 가지 하위 언어들의 연합체이다. 각각의 하위 언어가 자신만의 규칙을 가지고 있다. “하위 언어들로 구성되어 있다”라는 점을 꼭 새겨두어라. 일단 이렇게만 하면 C++ 이해의 관문에 들어서기가 대단히 쉬워질 것이다.

Categories:

Updated:

Leave a comment