C++를 이해하는 첫걸음(from Effective C++(3rd) by Scott Meyers)

10 Apr 2021

들어가며

42서울 CPP-Modules 과제를 하면서 C++를 처음 사용해보고 있다. 주말을 맞이하여, 과제를 시작할 때부터 주변 사람들이 강력 추천하던 스콧 마이어스(Scott Meyers)의 책을 읽던 중에, 블로그에 기록해두면 좋을 것 같은 내용을 발견해 포스팅을 작성한다. 이 포스팅은 『이펙티브 C++(3판)』(곽용재 역, 프로텍미디어)의 52~53쪽의 내용 요약이다.

C++를 이해하기 위한 방법: 여러 하위 언어의 연합체로 보기

스콧 마이어스는 C++는 엄청난 표현력과 유연성으로 인해 강력한 도구이면서 동시에, 사용자에게 어느 정도의 혼동을 주는 언어일 수 있다고 말한다. 그는 이런 상황에서 C++를 잘 이해할 수 있는 방법으로 C++를 단일 언어로 바라 보는 눈을 넓혀, 상관 관계가 있는 여러 언어들의 연합체(federation)로 보기를 주장한다. 즉 이 언어가 여러 개의 하위 언어(sublanguage)를 제공한다는 점을 유념해야 한다는 것이다.

이 하위 언어는 총 네 개이다.

  • C
  • 객체 지향 개념의 C++
  • 템플릿 C++
  • STL

하위 언어 유형 1: C

C++는 C를 기본으로 한다. 블록, 문장, 선행 처리자, 기본제공 데이터타입, 배열, 포인터 등 모든 것이 C에서 왔다. 따라서 C만 쏙 뽑아 써도 되지만, 그렇게 하면 효과적인 프로그래밍을 위한 규칙을 적용할 수 있는 범위가 아주 좁아진다. 템플릿, 예외, 오버로딩 등등 많은 것을 사용할 수 없게 된다.

하위 언어 유형 2: 객체 지향 개념의 C++

책에서 언급한 “클래스를 쓰는 C”에 관한 것이 모두 이 유형에 해당된다. 이는 클래스(생성자와 소멸자 개념을 포함), 캡슐화, 상속, 다형성, 가상 함수(동적 바인딩) 등을 포함한다. 객체 지향 설계의 규칙 대부분이 들어간다고 보면 된다.

하위 언어 유형 3: 템플릿 C++

C++의 일반화(generic) 프로그래밍 부분으로, 많은 프로그래머가 경험해보지 않은 영역 중 하나이다. 템플릿이 C++에 끼치는 영향은 전방위적이므로, 대부분의 프로그래밍 규칙에서는 저마다의 용도에 맞춘 템플릿 구문 하나쯤은 흔히 발견할 수 있다. 템플릿의 강력함으로 인해, 템플릿 메타프로그래밍(template metaprogramming: TMP)이라는 완전히 새로운 프로그래밍 패러다임이 파생되기도 했다.

하위 언어 유형 4: STL

이는 이름(Standard Template Library)에서 알 수 있듯이 템플릿 라이브러리면서, 대단히 특별한 템플릿 라이브러리이다. STL은 컨테이너(container), 반복자(iterator), 알고리즘(algorithm)과 함수 객체(function object)가 얽혀 돌아가는 것을 규약으로 하고 있다. 하지만 템플릿과 라이브러리는 얼마든지 다른 아이디어를 중심으로 만들 수 있다. 또한 STL은 독특한 사용규약이 있으니 STL을 사용할 때는 그 규약을 따르면 된다.

나가며

이렇게 네 가지 하위 언어가 C++를 이루고 있음을 마음에 새겨야 한다. 효과적인 프로그램 개발을 위해 한 하위 언어에서 다른 하위 언어로 옮겨 가며 대응 전략을 바꿔야 하는 상황에도 당황하지 않아야 한다. 예를 들어 C 스타일로 쓸 때는 기본제공 타입에 대해서는 “값 전달이 참조 전달보다 대개 효율이 좋다”는 규칙이 통하지만, 객체 지향 C++로 옮겨 가면 사용자 정의 생성자/소멸자 개념이 생기면서 상수 객체 참조자에 의한 전달(pass-by-reference-to-const) 방식이 더 좋은 효율을 보인다. 이는 사용자가 손에 들고 있는 객체의 타입조차 알 수 없는 템플릿 C++를 쓸 땐 특히 두드러진다. 하지만 STL 쪽으로 넘어오면 반복자와 함수 객체가 C의 포인터를 본떠 만든 것이란 점을 알게 되고, 그렇기 때문에 STL의 반복자 및 함수 객체에 대해서는 값 전달에 대한 규칙이 다시 제 힘을 발휘하게 된다.

C++는 통합 언어(unified language)가 아니라 네 가지 하위 언어들의 연합체이며, 각각의 하위 언어는 자신만의 규칙을 갖는다. 이를 마음에 잘 새겨 두면 C++ 이해의 관문에 들어서기가 대단히 쉬워질 것이다.

C++를 사용한 효과적인 프로그래밍 규칙은 경우에 따라 달라집니다. 그 경우란, 바로 C++의 어떤 부분을 사용하느냐입니다.

TAG: cpp