본문 바로가기

Library/C/C++

C에서 C++로, C++에서 다시 C로의 회귀(回歸)

C++를 연구하다보면, 문득 자신이 중급자 수준으로 넘어갔다고 자각하는 때가 있다. 그것은, 코드를 작성하는 도중 발생하는 갖가지 문제를 디자인 수준에서 방어하려고 애 쓸 때이다. 개체지향 기법들이나, 수많은 관용구 기법은 빙산의 일각에 지나지 않는다. 이런 문제를 다각도로 분석한 좋은 발상과 구현들을 보면, 이미 엄청난 피와 땀이 쏟아부어졌다는 것을 느낀다.

그런데, C에서의 C++로 넘어갔을 때를 생각해보면, 어떤 이유 때문인가? 개체지향 그 자체만의 기능으로 C에서 C++를 선택한 사람은 그렇게 많지 않을 것이다. 개체지향 기능을 더 깔끔하게 구현한 언어는 이미 차고 넘친다. 대부분의 사람들은 STL의 명료함과 막강함에 매료되어 C++를 선택하지 않았을까 싶다. 현실적으로 STL 컨테이너들은 큰 도움을 주는, 언제나 든든한 동반자이다. 또, 일반화 프로그래밍 개념 위에 만들어진 STL 프레임워크만큼 뛰어나고 혁신적인 라이브러리를 아직 본 적이 없다.

그러나, 구루(Guru)의 대열에 합류하기 위해 발버둥을 치다보면, 문득 C++가 끔찍한(horrible) 언어라는 토발즈의 의견에 동의할 수 밖에 없고, '깔끔하고 빠른 코드를 작성하려면 C로 작성하라'는 오랜 격언을 인정할 수 밖에 없다. 타입 안정적이며, 디자인적으로 잘 구성된 코드를 작성하려면, 그리고 C++ 특성을 잘 살리도록 구현하는 것은 쉬운 일이 아니다. 더구나 완전하지 않은 C++ 표준 때문에 이식성을 염두에 둔다면 온갖 지뢰밭을 통과해야 한다. 그런 표준조차 완전하게 준수하는 컴파일러는 없다는 것은 이미 불행한 소식도 아니다.

만약 같은 기능을 구현하는데 C와 C++를 사용한다고 하면, 무엇보다 C는 일반적인 개체지향 접근보다 전체적인 면에서 인터페이스를 간결하고 명료하게 유지하는 것이 우선이며, 이것이 C의 정답이다. C는 하드웨어에 대해 최대한 얇은 레이어를 유지하면서도 고수준의 추상성을 제공하려는 목적으로 설계된 언어이기 때문이다. 또, C는 그 간결성 때문에 모든 플랫폼에 표준을 준수하는 안정적인 컴파일러를 다수 가지고 있다. 그러나, C++로 이런 요구를 만족하면서 언어 자체의 특성을 살리는 방향으로 설계한다면, 이보다 몇 배의 노력이 필요하며, 코드 난이도 역시 이와 비례하여 상승할 것이다. 또, 복잡한 표준 때문에 모든 플랫폼에 동일한 품질의 컴파일러가 존재하리라는 생각은 버려야 한다.

진실로, '당신이 뭘 하고 있는지 모른다면, 멋진 10계층 레이어를 사용하더라도 그것은 무가치하다'라는 격언 또한 인정할 수 밖에 없다. 물론, 이 이야기는 개체지향 설계의 장점을 부정하는 것이 아니며, C++ 자체 강점을 잘 살리면서도 C의 원초적인 장점 또한 살리는 설계를 하기란 극히 어렵다는 것을 이야기하려는 것 뿐이다.

개인적으로, C, C++로의 전환에서 다시 C 개념으로의 회귀는, 코드를 작성하는 본질은 어떤 언어를 쓰든지 다르지 않다는 것을 보여주는게 아닐까 한다. C++가 그런 요구를 만족하기 위해서는 아직도 갈 길이 멀다. 발 8개 달린 돼지에 또 하나의 날개를 더 달아 키메라로 변신할지, 아니면 복잡하기 그지 없는 현 표준이 간결하게 안정화 될 수 있을지 등등을 예측하기란 매우 어렵다.