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