내용 참고
C++ 기초 플러스 4판 (성안당)
나무위키
C++의 특징
■ C++은 Bjarne Stroustrup이 C언어에 객체 지향의 클래스 개념을 추가하여 만든 C with Classes로 시작된 언어이다.
■ 구조지향적 언어는 간단한 알고리즘에는 유용하지만 프로그램이 커질수록 코드가 복잡해지는 단점이 있었다.
■ 또한 구조지향적 구조의 핵심인 함수는 다른 코드에서 재사용하기 어렵다는 문제도 있다.
■ 그래서 Bjarne Stroustrup은 C언어를 발전시키기 위해서 simula67의 객체지향 개념을 포함시켰다.
■ 하지만 Bjarne Stroustrup은 C언어를 빠르고 강력하고 유용한 언어로 만드는 것에만 집중하고 있었다.
■ 그래서 그는 곧 C++에 일반화 프로그래밍을 위한 템플릿 기능도 추가하여 C++을 완성시켰다.
C++에 포함된 프로그래밍 철학들
■ C++은 C언어의 superset으로 시작한만큼 절차지향적 프로그래밍 기법을 지원하고 있다.
■ 하지만 C언어와 C++의 표준이 계속 발전하면서 두 언어의 지향점의 차이에 따라 독자적인 언어가 되어가고 있다.
■ C언어는 구조적 프로그래밍과 저수준의 메모리 관리를 추구하는 반면,
C++은 객체지향을 추구하고 다른 고수준의 언어들처럼 언어차원의 메모리 관리 기법이 추가되어가고 있기 때문이다.
ⅰ. 절차적 프로그래밍
■ C++은 C언어에 객체지향 프로그래밍 기법을 추가한 것이지만 여전히 절차적 프로그래밍 기법도 지원한다.
■ 그래서 C언어를 먼저 공부한 경우에는 사고방식을 절차적 프로그래밍에서 객체지향으로 바꾸는 것이 더 어렵다.
■ C언어부터 내려오는 방법인 만큼 간단한 프로그램 작성시에 유용하다.
ⅱ. 객체지향 프로그래밍
■ C++에 처음으로 추가된 프로그래밍 기법이다.
■ C에서의 구조체를 확장하면 C++의 객체가 된다.
■ 객체지향은 하향식이 아닌 상향식을 추구한다.
■ 절차지향이 거대한 프로그램을 함수로 쪼개는 것이 목적이었다면,
객체지향은 객체들을 조합하여 프로그램을 작성하여 코드 재사용성을 높이는 것이 목적이기 때문이다.
ⅲ. 일반화 프로그래밍
■ 객체지향 프로그램의 클래스가 하나의 클래스에서 데이터가 다른 여러가지 변수를 만든다면,
일반화 프로그램의 템플릿은 하나의 템플릿에서 알고리즘이 같은 여러가지 함수를 만든다.
■ STL(Standard Template Library)은 이러한 일반화 프로그래밍 기법으로 주요 자료구조를 구현해놓은 것이다.
■ STL을 활용하지 못한다면 이러한 자료구조를 스스로 다 만들어야 할 것이다.
■ STL로 구현된 자료구조들은 전문가들이 만들어서 안정성이 보장된 것이므로 이를 활용하는 것이 더 유리하다.
ⅳ. 템플릿 메타 프로그래밍
■ TMP는 템플릿을 이용한 메타 프로그래밍 기법이다.
■ 메타 프로그래밍이란 자기 자신 혹은 다른 프로그래밍 언어를 데이터로 취급하여 프로그래밍 하는 것을 말한다.
■ C언어는 템플릿을 이용하여 컴파일 타임에 생성되는 코드로 프로그래밍을 한다.
■ 이를 이용하면 프로그램 동작시의 실행 속도를 빠르게 만들 수 있다.
■ 하지만 그 대신에 컴파일 시간이 길어지고 디버깅이 어려워진다는 단점도 존재한다.
■ C++의 최신 표준을 의미하는 모던 C++에서 TMP를 더 쉽게 작성하게 해주는 여러 명령어가 추가된 바 있다.
ⅴ. 함수형 프로그래밍
■ 함수형 프로그래밍 또한 모던 C++에서 람다식이 추가되면서 C++에서 사용가능한 기법이 되었다.
■ 함수형 프로그램은 익명 함수와 순수 함수등의 개념을 활용하여 프로그램을 작성한다.
ⅴ. 그 외
■ 그 외에도 C++은 프로그램 작성에 도움을 주는 모든 기법을 표준을 이용하여 추가하고 있다.
■ 이는 C++을 배우는 것을 어렵게 만드는 요소이기도 하지만 C++을 그만큼 강력하게 만드는 요소이기도 하다.