C++ 언어는 1980년대 초에 벨 연구소의 비얀 스트로스트룹(Bjarne Stroustrup)이 C언어를 기초로 하여 만들었다. C++ 은 C의 문법을 그대로 유지하면서 OOP(객체 지향 프로그래밍)기능을 추가하였다. 이 언어의 이름에 사용된 ++은 C언어의 증가 연산자를 의미하여 C보다 한 단계 더 발전했다는 뜻을 가지고 있다. C++의 OOP 문법은 Simula67이라는 언어의 문법을 참조하여 만들어진 것이다.

80년대 후반 소프트웨어가 하드웨어의 발전을 따라잡지 못하는 소프트웨어의 위기 문제가 대두되었으며 그 해결책으로 OOP가 제시되었다. 당시 C++은 소프트웨어 위기의 해결사로 인식되었으며 90년부터 본격적으로 사용되기 시작하여 지금은 대부분의 대형 프로젝트에 활용되고 있다. C++은 C언어에 비해 클래스, 상속, 다형성, 템플릿 등이 추가되었다. 이외에 기존 C언어로부터 물려받은 문법도 확장되었는데 다음은 대표적인 몇 가지 예이다.

① 한줄 주석은 //로 표기할 수 있다.

② 새로운 진위형인 bool 타입을 추가했다.

③ 구조체나 열거형의 태그 이름을 하나의 타입으로 인정한다.

④ 함수 중간에서 변수를 선언할 수 있다.

그렇다면 C와 C++ 두 언어의 관계는 과연 어떻게 정의될 수 있을까? 이 질문에 대해서는 학자에 따라 다양한 의견이 제시되고 있어 명확한 결론을 내리기 어렵다. C++이 C를 기반으로 하고 있고 C의 기능 대부분을 쓸 수 있으므로 C++이 C의 상위 버전이라는 주장이 있는 반면 C++이 C를 완전히 포함하지는 못하며 두 언어의 개발 방법이 워낙 판이하게 다르기 때문에 아예 다른 언어라고 보는 학자도 있다. 이 질문에 대한 해답은 각자가 공부를 마친 후 생각해 보기 바라되 나는 C++이 C의 상위 버전이며 그렇게 보는 것이 타당하다고 생각한다.

사용자 삽입 이미지

실제로 C의 문법 중 C++이 지원하지 못하는 부분도 있는데 이런 문법은 대부분 안정성, 이식성에 문제가 있거나 더 좋은 해결 방법이 있어 제외된 것들이다. 두 언어의 개발 방법이 다르다는 주장은 실제로 사실이며 문제 해결을 위한 접근 방법 자체가 다르다. 그러나 C++은 객체 지향한 지원하는 것이 아니라 C의 구조적 개발 방법도 여전히 지원하며 필요할 경우 C++로도 C 스타일의 프로그램을 작성할 수 있다. 구조적 프로그래밍 방법 객체 지향보다 열등하다고 생각하는 것도 일종 고정 관념일 뿐이며 필요하다면 쓸 수도 있다.
C++도 C와 마찬가지로 초창기에는 무분별한 기능 추가로 인해 호환성의 문제가 있었는데 90년대 초반의 볼랜드 C++과 비주얼 C++이 서로 호환되지 않았던 것이 대표적인 예이다. C++의 첫 번째 표준안인 ISO 14882는 98년에 발표되었다. 이 표준안은 89년에 제정된 ANSI C와 95년에 개정된 C95를 기반으로 하며 C++의 객체 지향적인 기능을 추가하여 작성된 것이다. 그래서 ANSI C의 기능 대부분을 흡수하고 있다. 그러나 시기적으로 1년 더 늦은 99년에 새로 제정된 C99 표준을 포함하지는 못하며 그래서 14882는 9899:1999와는 다소 다른면이 있다. 이후 C와 C++은 상호 영향을 미치며 서로 다른 모습으로 발전해 나갈 것으로 예상된다.
사용자 삽입 이미지
C를 쓸 것인가 C++을 쓸 것인가는 프로젝트의 성격에 따라 결정되어야 한다. 대부분의 경우 C++이 더 좋은 선택이 되겠지만 아직도 C가 필요한 경우는 여전히 있다. C++은 기능상 우위에 있기는 하지만 C보다 복잡하여 생성된 프로그램이 크고 느리기 때문에 소규모 프로젝트나 성능이 지극한 중요한 분야에는 적합하지 못한 면이 있기 때문이다. 가령 손목시계에 들어가는 프로그램이나 휴대용 게임기 등에는 객체를 쓰는 것이 어울리지 않으며 C가 더 좋은 선택이 된다. 닭 잡는데 소 잡는 칼을 쓸 필요는 없다.

그렇다면 이번에는 문제를 달리하여 지금 이 책을 읽는 사람은 C를 중심으로 공부를 할 것인가 아니면 C++을 중심으로 공부할 것인가를 생각해보자. 결론은 C++을 선택하는 것이 절대적으로 옳다는 것이다. 기능이 부족하다 하여 C를 무시하는 것은 좋지 않는 태도이지만 그렇다고 해서 C가 C++의 기반이므로 순수한 C를 먼저 배운후 C++을 나중에 배우겠다는 태토는 더 곤란하다. 주석은 무슨 일이 있어도 /* */로만 표기하고 변수는 반드시 함수 선두에만 선언해야 한다고 생각할 필요는 없다.

C++ 창시자인 스트로스트룹은 C++이 C의 모든 영역을 커버할 수 있다고 자신있게 떠들고 다닌다. 물론 학자들은 이 말에 절대적으로 공감하지 않으며 실제로 사실도 아니지만 적어도 그의 말이 99.9% 이상의 경우에 적용된다는데는 동의한다. 현재 출시되고 있는 컴파일러들은 대부분 C++ 컴파일러이며 C 전용 컴파일러는 구경하기가 쉽지 않다. 그래서 처음 C에 입문하는 사람들은 좋건 싫건 C++ 컴파일러로 시작할 수 밖에 없는 상황이다.

이 책은 98년에 발표된 ISO 14882를 기준으로 작성되어 있다. 저반부는 주로 C언어로부터 물려받은 문법들을 설명하여 중반 이후부터 C++의 고유 기능인 클래스를 다룬다. 전반부의 문법 설명 중에도 필요할 경우 C++ 문법이 가끔 등장하여 C의 문법과 비교하는 경우도 있다. 책의 구성이 C, C++로 이루어져 있는 것이 아니라 처음부터 C++ 문법을 다루되 객체 이전과 이후로 나누어져 있다는 점을 알아두기 바란다. 14882를 기준으로 하므로 C99의 확장된 문법 또는 그 이후에 개정되는 C 표준과 맞지 않는 면들이 있을 수 있다. 이런 점은 여러분들이 공부를 마친후 스스로 구분할 수 있을 것이다.

참고

C++은 "씨 플러스 플러스"(C plus plus)라고 읽도록 되어 있다. 그러나 이 발음이 너무 길어 불편하기 때문에 우리나라에서는 통상 "씨뿔뿔"이라고 읽는 경우가 훨씬 더 많다. 원문의 발음을 따르는 것도 좋겠지만 적어도 한글로 된 책에서는 표준보다는 현실적인 발음을 채택하는 것이 더 좋다고 생각하여 이 책에서는 "씨뿔뿔"로 읽기로 한다. 따라서 C++가, C++는, C++를 이라고 하지 않고 C++이, C++은, C++을 이라고 표기할 것이다.

Posted by 테티스
,