1.C++의 탄생: 간략한 역사
1970년대에 C나 Pascal과 같은 컴퓨터 언어들이 등장하여 구조적 프로그래밍의 시대를 열었다. C 언어는 구조적 프로그래밍 뿐만 아니라, 통신 포트나 디스크 드라이브와 같은 하드웨어까지 직접 제어할 수 있었다. 추후 SmallTalk나 C++와 같은 언어로 구현하는 객체 지향 프로그래밍(Object-Oriented Programing : OPP)이 출현했다.
C 언어
1970년대 초반 벨 연구소(Bell Laboratories)의 Dennis Ritchie는 Unix라는 운영 체제를 개발하는 프로젝트를 수행하다 크기가 작고 빠르게 실행되는 프로그램을 작성할 수 있고, 하드웨어를 효율적으로 제어할 수 있는 언어가 필요했다. 당시 이런 요구를 충족할 수 있는 어셈블리 언어가 있었으나, 어셈블리 언어는 컴퓨터 내부에서 사용되는 저수준(low level) 언어여서, 특정 컴퓨터에서 사용하려면 해당 컴퓨터에 맞는 어셈블리 언어로 처음부터 작성해야 했다. 그러나 Unix는 작성한 프로그램을 여러 종류의 컴퓨터에서 수정 없이 사용할 수 있도록 하자는 설계 철학을 바탕으로 했기에 특정 하드웨어에 종속되지 않고 문제 해결방식에 주안점을 둔 고수준(high level) 언어를 사용하는 방법이 제안되었다.
저수준 언어의 효율성과 하드웨어 접근 능력에 , 고수준 언어의 일반성과 이식성이 결합된 실용적인 프로그래밍 언어의 결과물로 만들어진 것이 C 언어이다.
일반적인 컴퓨터 언어는 데이터와 알고리즘 두 가지 개념을 다룬다. 데이터(data)는 프로그램이 사용하고 처리하는 정보를 의미하고, 알고리즘(algorithm)은 프로그램이 데이터를 처리하는 방법을 의미한다.
C는 절차적(procedural) 언어이다. 프로그래밍에서 절차적이란 의미는 데이터보다 알고리즘에 더 치중한다는 뜻이다. 개념적으로, 절차적 프로그래밍은 컴퓨터가 수행해야 할 동작들을 명확히 구분하고, 그 구분된 동작들을 프로그래밍 언어로 구현하는 것이다. 초기의 절차적 언어들은 프로그램의 덩치가 커지면서 어려움이 존재했다. 분기문(if, switch 등)을 사용하는 경우, 어지럽게 엉켜있어 프로그램의 전체적인 윤곽을 쉽게 파악할 수 없었고 유지 보수가 어려웠다.
컴퓨터 과학자들은 구조적 프로그래밍(structured programming)이라는 세련된 방법을 고안했다. C 언어는 구조적 프로그래밍을 지원한다. for 루프, while 루프, do while 루프, if else 구문 등 정형화된 조건을 통해 분기를 사용하도록 제한하는 것들이다.
하향식(top-down) 설계는 구조적 프로그래밍이 고수하는 하나의 철학이다. 규모가 큰 프로그램을 작고 다루기 쉬운 단위 작업들로 쪼개어 나가는 것이다. 이러한 접근 방식을 사용하여 C 언어에서는 개별적인 작업을 수행하는 함수(function) 단위로 프로그램을 개발한다.
C++의 등장: 객체 지향 프로그래밍
구조적 프로그래밍 철학이 프로그램의 간결성과 신뢰성, 유지 보수의 용이성에 많은 향상을 가져왔지만, 여전히 규모가 큰 프로그래밍은 어려운 문제로 남아있었다. 이때 나온게 객체 지향 프로그래밍 철학이다. 절차적 프로그래밍은 알고리즘을 강조하지만, 객체 지향 프로그래밍은 데이터를 강조한다.
C++에서는 클래스가 위와 같은 목적으로 설계되는 새로운 데이터형이다. 일반적으로 클래스는 객체를 나타내는 데이터 부분, 그 데이터를 대상으로 수행할 수 있는 동작 부분으로 정의된다. 객체 지향적으로 프로그램을 설계하려면 프로그램이 다뤄야 하는 객체를 서술하는 클래스를 먼저 설계해야 한다. 작은 클래스를 먼저 설계한 후에 프로그램 설계로 진행하는 것을 상향식(bottom-up) 프로그래밍이라 한다.
데이터와 메소드(함수)를 클래스 정의 안에 함께 넣을 수 있다는 것 외에도 객체 지향 프로그래밍은 몇가지 장점을 갖고 있다.
- 재활용이 가능한 소스 코드
- 캡슐화(정보 은닉)
- 다형성
- 상속
일반화 프로그래밍은 C++의 프로그래밍 철학이다. 여기서 일반화(generic)라는 말은 데이터형과 무관한 코드를 작성한다는 의미이다. C++는 정수, 실수, 문자, 문자열 등 다양한 유형의 데이터를 다룬다. 다양한 유형의 데이터들을 사용하려다 보면 데이터형마다 별개의 함수를 만들어야 한다. 일반화 프로그래밍에서는 일반형을 위한 함수를 하나 만들고, 그 함수를 여러 유형의 데이터형에 두루 사용할 수 있다. 이것을 가능하게 하는 것이 C++ 템플릿이다.
C++의 기원
1980년대 초 벨 연구소(Bell Laboratories)에서 Bjarne Stroustrup이 개발했다. C 언어에서 어떤 변수에 1을 더하는 증가 연산자인 ++로부터 C++라는 이름이 생겼다.이름에서 알 수 있듯이 C++은 C를 기초로 삼아 만들었다. C의 간결성, 시스템 프로그램 작성의 용이성, Unix 운영 체제와의 호환성 때문이였다.