참고 서적 : Effective C++ - Meyers / 곽용재 옮김 / 피어슨에듀케이션코리아
작성날짜 : 2011-05-12
1. C++에 왔으면 C++의 법을 따릅시다.
가장 근본적인 것들을 다루고 있는 단원.
항목 1 : C++를 언어들의 연합체로 바라보는 안목은 필수
초창기의 C++는 단순히 C 언어에 객체 지향 기능 몇 가지가 결합된 형태였다. 오죽하면 C++의 처음 이름조차도 이 점을 드러내려는 듯 ‘클래스를 쓰는 C(C with Classes)’였겠는가.
C++는 꾸준한 성장을 통해 ‘클래스를 쓴는 C라고는 말할 수 없을 만큼 아이디어, 기능, 프로그래밍 전략들을 취해 자기 것으로 만드는 데 있어 점점 대담하고 과감한 행보를 보였습니다. 예외는 함수 구성방식의 헤게모니를 크게 바꾸었습니다. 템플릿은 프로그램 설계에 대한 새로운 사고방식을 우리에게 선사했으며, STL은 거의 어느 누구도 본 적 없을 듯한 ‘확장성’에 대한 지평을 열었습니다.
이렇게 발전한 오늘날의 C++는 다중패러다임 프로그래밍 언어(multiparadigm programming language)라고 불립니다. 절차적(procedural) 프로그래밍을 기본으로 하여 객체 지향(object oriented), 함수식(functional), 일반화(generic) 프로그래밍을 포함하여 메타프로그래밍(metaprogramming) 개념까지 지원하고 있습니다. 이런 엄청난 표현력과 유연성 덕택에 C++는 소프트웨어 개발에 있어 대체할 만한 것이 없는 도구가 되었다.
C++를 단일 언어로 바라보는 눈을 넓혀, 상관 관계가 있는 여러 언어들의 연합체(federation)로 보십시오. 그리고 나서 각 언어에 관한 규칙을 각개 격파하는 거죠. 이렇게 해 가면 시각이 단순해지고 명확해지며, 기억하기도 편해집니다. 물론, 규칙은 언어마다 정도의 차이는 있겠으나 다를 수 있습니다. C++를 제대로 따라잡으려면, 이 언어가 여러 개의 하위 언어(sublanguage)를 제공한다는 점을 새기고 있어야 합니다.
l C C++는 여전히 C를 기본으로 하고 있습니다. 블록, 문장, 선행 처리자, 기본제공 데이터타입, 배열, 포인터 등 모든 것이 C에서 왔습니다.
l 객체 지향 개념의 C++ 이 부분에 ‘클래스를 쓰는 C’에 관한 것이 모두 해당됩니다. 그러니까 클래스(생성자와 소멸자 개념까지), 캡슐화, 상속, 다형성, 가상 함수(동적 바인딩) 등이지요.
l 템플릿 C++ C++의 일반화 프로그래밍 부분. 템플릿의 주체 못할 강력함이 너무나도 크고 훌륭하다 보니 완전히 새로운 프로그래밍 패러다임이 파생되기까지 했습니다. 이름하여 템플릿 메타프로그래밍(template metaprogramming : TMP)이란 것이죠.
l STL STL은 이름에서 알 수 있듯이 템플릿 라이브러리입니다. STL의 세계는 컨테이너(container), 반복자(iterator), 알고리즘(algorithm)과 함수 객체(function object)가 얽혀 돌아가는 것을 규약으로 삼고 있으나, 템플릿과 라이브러리는 얼마든지 다른 아이디어를 중심으로 만들어질 수 있습니다. 또한 STL은 나름대로 독특한 사용규약이 있어서, STL을 써서 프로그래밍하려면 그 규약을 따르면 됩니다.
자, 이렇게 네 가지의 하위 언어들이 C++를 이루고 있다는 점을 마음에 새기십시오. 그리고 이제는 효과적인 프로그램 개발을 위해 한 하위 언어에서 다른 하위 언어로 옮겨 가면서 대응 전략을 바꾸어야 하는 상황이 오더라도 당황하지 말아야 합니다. 예를 들어, C 스타일로만 쓰고 있으면 기본 제공(즉, C의 그것과 비슷한) 타입에 대해서는 “값 전달이 참조 전달보다 대개 효율이 더 좋다”라는 규칙이 통하지만, C++의 C 부분만 쓰다가 객체 지향 C++로 옮겨 가면 사용자 정의 생성자/소멸자 개념이 생기면서 상수 객체 참조자에 의한 전달(pass-by-reference-to-const) 방식이 더 좋은 효율을 보입니다. 이런 현상은 템플릿 C++를 쓰게 될 때 특히 두드러지는데, 왜냐하면 템플릿 C++의 세계에서는 여러분이 손에 들고 있는 객체의 타입조차 알 수 없기 때문입니다. 그러나 STL 쪽으로 넘어오면 전세가 또 바뀝니다. STL을 배우다 보면 반복자 및 함수 객체에 대해서는 값 전달에 대한 규칙이 다시 제 힘을 발휘하게 됩니다.
C++는 한 가지 프로그래밍 규칙 아래 똘똘 뭉친 통합 언어(unified language)가 아니라 네 가지 하위 언어들의 연합체입니다. 각각의 하위 언어가 자신만의 규칙을 갖고 있지요. “하위 언어들로 구성되어 있다”라는 점을 꼭 새겨 두도록 하세요.
이것만은 잊지 말자!
l C++를 사용한 효과적인 프로그래밍 규칙은 경우에 따라 달라집니다. 그 경우란, 바로 C++의 어떤 부분을 사용하느냐입니다.
'Programming > C/C++' 카테고리의 다른 글
[Effective C++] 낌새만 보이면 const를 들이대 보자! (0) | 2015.04.16 |
---|---|
[Effective C++] #define을 쓰려거든 const, enum, inline을 떠올리자 (0) | 2015.04.16 |
[C] 30자리 곱셈 연산 프로그램 (0) | 2015.04.16 |
[C++] 연산자 우선순위 (0) | 2015.04.16 |
[C/C++] rand function (0) | 2015.04.16 |