C++

PoolCWiki

ko.wp 위키백과에 이 글과 관련된 글이 있습니다.

브야네 스트로스트룹(Bjarne Stroustrup) 아저씨에 의해 처음으로 제안된 이후 발전을 거쳐 1998년 첫 표준이 확립된 다중 패러다임 언어이다. 현재 차기 표준인 C++0x의 표준화 작업이 진행중이며, 2010년 이내로 투표를 통해 표준이 확정될 계획이다.

목차

[편집] 언어의 특징

[편집] C with Class

C++의 가제는 C with Class이다. 말 그대로 객체 지향 개념을 지원하는 C의 superset으로써 디자인되었으며, 첫 컴파일러는 C++로 코드를 작성하면 해당되는 C코드를 만들어내는 메타 프로그램이었다. 이러한 특징으로 인해 C++에서는 기존에 사용되된 C 라이브러리, 기존 코드들을 그대로 이어 받을 수 있게 되었으며, 이는 자바가 나오기 전까지 C++이 산업계를 장악하는데 큰 역할을 하였다.

객체 지향 언어이므로 데이터 추상화, 정보 은닉, 상속, 다형성 등 객체 지향 프로그래밍을 위한 기본적인 개념들을 모두 지원한다. 허나 C의 문법과 특징을 그대로 이어 받은데다, 객체 지향 개념으로 치면 나름 초창기 언어인지라 적지 않은 시행 착오를 거쳤고, 결과적으로 상당히 복잡하고 까다로운 문법을 소유한 언어가 되었다. (이후 이러한 시행 착오들을 바탕으로 자바, C# 등은 훨씬 깨끗하고 사용하기 쉬운 문법을 가지고 있다.) 게다가 아래에서 설명할 효율을 포기하지 않는 추상화라는 목표 역시 이러한 문법을 가지는데 일조한 바가 있다.


[편집] 일반화 프로그래밍

C++의 또 다른 특징 중 하나는 템플릿을 이용한 일반화 프로그래밍(Generic programming)을 지원한다는 것이다. 일반화 프로그래밍이란 사용되는 타입과는 무관한 하나의 일반화된 코드를 통해 각종 다양한 자료를 다루는 패러다임으로, 타입에 종속되는 다른 코드들과는 달리 타입과는 무관하게 코드끼리 조합할 수 있기 때문에 훨씬 넓은 범용성과 확장성을 지닌다. C++에서는 템플릿과 연산자 오버로딩 등을 통해 이를 지원하고 있으며, STL은 이러한 특징을 극명하게 드러내는 우수한 라이브러리이다.

이는 C#, Java의 Generic과 유사하나, 템플릿은 그보다 훨씬 더 강력한 표현력을 가진다. 이로 인해 C++은 단순한 객체 지향 언어가 아닌 다중 패러다임 언어라 하며, 일반적인 객체 지향 언어에서는 불가능한 다양한 기법들을 구현할 수 있다. 허나 안타깝게도 사용하기가 무척 까다로운 관계로 (C#, Java에서 저걸 지원 못 해서 안 한게 아니다.) 아직까지는 일부 구루 수준에서나 이러한 기능들을 적극 활용하고 있다. 그런 관계로 차기 표준인 C++0x에서는 이러한 기능의 진입 장벽을 낮추는 것에 상당한 노력을 할애하고 있다.


[편집] 효율을 포기하지 않는 추상화

성능에 악영향을 주는 기능이 있을 때, C++에서는 유저가 이를 사용하지 않으면 성능에 아무런 영향을 주지 않는 것을 목표로 한다. 예를 들어 자바에서는 모든 함수가 기본적으로 가상함수로, 이러한 동적 바인딩은 직관적이긴 하되 일반적으로 메모리, 성능적인 이점을 일부 포기해야 한다. C++에서는 명시적으로 지정하지 않는 이상 모든 함수는 일반 함수로 호출되어 아무런 오버헤드를 가지지 않는다.

하지만 이렇게 모든 선택을 사용자에게 넘기는 특징으로 인해 컴퓨터와 언어의 기능등을 제대로 모르는 사람은 이 언어를 잘 쓰기가 무척 어렵다. C와 마찬가지로 시스템 프로그래밍에도 쓸 수 있도록 하기 위해서는 어쩔 수 없는 선택이지만.