Modern C++ Design (안드레 알렉산드레스쿠, 2003) 독후감

2 minute read

template<bool> struct CompileTimeError;
template<> struct CompileTimeError<true> {};

#define STATIC_CHECK(expr) \
    (CompileTimeError<(expr) != 0>())

기억난다. 이 코드를 처음 봤을 때, 얼마나 놀랐는지. 컴파일 시간에 이런 걸 할 수 있다니.

이 책은 볼 때마다 새롭다. 분명 시간을 부어서 이해한 내용이다. 그런데 새로워. 평소 안 쓰는 근육을 자극하는 재미를 준다. 이 재미는 쏠쏠한데, 책을 덮으면 자극 또한 사라져 버린다. 그래서 볼 때마다 새로웠던 거지. 이쪽 근육을 길러보고 싶다. 재귀를 이해하는 머리는 따로 있다고 말씀하신 알고리즘 교수님이 생각난다. 교수님, 템플릿 메타프로그래밍을 이해하는 머리도 따로 있었어요.

  • 여기서부터 우리는 C++의 깊은 곳을 탐험하게 될 것입니다. 그곳은 이상하고도 새로운 규칙이 지배하는 세계, 즉 컴파일 타임 프로그래밍의 세계인 것입니다. -p108
  • 우리가 C++에서 컴파일 타임 프로그래밍을 하는 데 쓸 수 있는 유일한 도구는 바로 템플릿, 컴파일 타임의 정수 연산, 그리고 자료형에 대한 사용자 정의(typedef) 뿐입니다. -p111

컴파일 시간. 활용할 생각 못 했다. 뭐 줄이려고 노력만 했지. 템플릿이 주요 도구인데, 내가 쓰던 방식이 아니다. 최소로. 조심조심하며 사용했다. 여러 타입에 공통 인터페이스를 제공하는 정도로만 사용했다. 하지만 이 책에선 생각도 못 한 방법으로 사용한다. 컴파일 시간 assert를 만들고 cons cell로 리스트를 만드는 것처럼 타입 리스트(Typelist)를 만든다. 이거 따라가는 것만으로도 꿀잼이다.

예전에 한 번 읽었던 책이다. 7~8년 전쯤? 읽고 리뷰를 안 남겼었다. 그 당시에는 이해가 안 가는 부분이 너무 많았다. 이걸 읽었다고 해야 하나? 그냥 넘어가려니 금광을 보고 지나치는 것 같아 께름칙했다. 그래. 너무 일찍 이 책을 읽었다. 이해가 안 가서 접어놓은 페이지를 펴면서 느꼈다. 소화할 내공이 없으니 좋은 책에서 영양분을 짜낼 수가 없었다. 그래도 미래의 나를 위해 페이지를 접어놓은 건 잘했다. 어떤 부분이 이해가 안 됐는지 흐리게 기억이 난다.

  • 시스템 아키텍처의 중요한 목적 중 하나는 특정 명제들을 “by design”에 의해 공리화시키는 것입니다. 예를 들면, 싱글톤 객체를 두 개 이상 만들어서는 안 됩니다. [.] 그리고 이러한 제약 조건들은 가능하면 컴파일 시에 걸러지도록 디자인되는 것이 이상적이라 할 수 있습니다. -p38
  • 단위전략 인터페이스의 중요한 특징은 고전적인 인터페이스(pure virtual 함수 집합)와는 달리 그것이 다소 모호하게 정의된다는 점입니다. 단위전략은 그 의미보다는 문법 자체에 더 초점이 맞추어져 있습니다. 다시 말하면, Creator 단위전략은 클래스가 정확히 어떤 동작을 하는 함수를 구현해야 하느냐보다는, 클래스를 구성하는 데 어떠한 문법적 구성이 올바른가를 말해줍니다. -p45
  • (단위전략을 사용한) WidgetManager는 마치 작은 코드 생성기와도 같습니다. 그리고 사용자는 자신의 입맛에 따라 이 코드 생성기의 동작을 마음대로 제어할 수도 있는 것입니다. -p47
  • 지금까지의 디자인이란 것이 사실 실행 전에 어떤 자료형이 다른 자료형과 어떻게 상호작용을 하며, 사용자가 할 수 있는 일은 무엇이고, 또한 사용자가 할 수 없는 일은 무엇인지를 말해주는 규칙으로 가득 차 있지 않았습니까? 이제 단위전략을 사용하면, 몇 가지 간단한 선택을 조합하는 것만으로 새로운 디자인을 창조해 낼 수 있으며, 자료형에 따른 안정성까지도 보장받을 수 있습니다. [.] 호스트 클래스와 단위전략 간의 연결이 컴파일 타임에 이루어지기 때문에 [.] -p48
  • 단위전략의 메커니즘은 템플릿과 다중 상속을 병용 [.]. 단위전략을 사용하는 호스트 클래스는 다수의 템플릿 인자를 가지는 또 다른 템플릿이며, 이때 각 템플릿 인자는 그것이 사용하는 단위전략을 가리키게 됩니다. 호스트 클래스는 자신이 선택한 단위전략들을 통해 그 기능을 간접화시키게 되며, 각 단위전략을 서로 밀접하게 응집시켜 주는 하나의 그릇으로써 작용하게 됩니다. -p62
  • Knuth는 다음과 같이 말했습니다. “서두른 낙관론은 만악의 근원이다.” 하지만, “뒤늦은 비관론은 아무런 쓸모가 없다.”라는 Len Lattanzi의 말도 분명 가볍게 넘길 이야기는 아닙니다. -p144
  • 프로그램의 곳곳에서 백여 번에 걸쳐서 주의력을 소진하는 것보다는 당연히 단 한 번만 주의를 기울이는 편이 훨씬 행복한 경우일 것입니다. -p357

Update <2018-01-08 Mon> 표지 사진 교체