[C++] C++ 역사, 특징, 개발과정

3 분 소요

1. C++ 언어의 역사

1950년대 어셈블리어의 한계를 극복한 고급 언어들이 개발되기 시작했다. 1954년에 Fortran이 개발되고 1967년에 운영체제나 컴파일러와 같은 시스템 소프트웨어를 작성하기 위한 용도로 BCPL이라는 언어가 개발되었다. 1970년 BCPL을 개선하여 B언어를 만들고, 1972년에 DEC PDP-11 컴퓨터에서 실행되는 유닉스 운영체제를 작성하기 위해 B언어를 개선한 C언어를 만들었다. C언어는 시스템 소프트웨어뿐만 아니라 모바일, 게임, 그래픽, 임베디드 등 다양한 응용프로그램의 개발에 이르기까지 광범위하게 사용되고 있다. 한편, 컴퓨터의 속도가 빨라지고 소프트웨어 크기도 커지게 되면서 C언어로 덩치 큰 소프트웨어를 개발할 때 프로그램 코드 관리에 어려움을 겪게 되었다. 이러한 어려움을 개선하기 위해 Bell연구소의 Bjarne Stroustrup는 1979년부터 C언어에 객체지향특성 및 기능을 추가한 새로운 언어를 만들었고 1983년에 C++로 명명했다. C++언어는 C언어의 모든 기능을 가지고 있기 때문에 이미 작성된 C 소스 프로그램을 그대로 혹은 조금만 수정하면 C++ 프로그램으로 재사용할 수 있고, 이미 컴파일 된 C목적 코드도 C++프로그램에서 링크해 사용가능하다.

1995년에 c++의 영향을 받아 객체지향언어 java가 선마이크로시스템의 제임스 고슬링에 의해 만들어졌고 2000년에는 마이크로소프트에서 c++와 java의 개념을 섞은 c# 언어를 만들었다.

c++언어는 1998년 처음으로 c++98로 표준화되었고, c++03, c++11, c++14, c++17 등 표준은 계속 진화하고 있다.

표준 C++ 프로그램의 중요성

1998년 미국 국립 표준원 ANSI에서 c++언어에 대한 표준을 정했다. 현대 대부분의 컴파일러 회사들은 표준을 따르는 c++컴파일러를 제작 공급하고 있어 표준에 따라 만들어진 c++프로그램 소스는 모든 플랫폼, 모든 c++컴파일러에 의해 컴파일 가능하고, 모두 동일한 실행결과를 보장한다.

볼랜드 사의 c++, 마이크로소프트의 비주얼 c++ 등 컴파일러를 제작하는 대부분의 회사들은 표준 c++ 기능에 자신만의 기능을 첨가한다. __cdec1이라는 비주얼 c++만의 전용 키워드를 사용하여 비주얼 c++ 컴파일러가 아닌 다른 컴파일러에 의해서는 컴파일되지 않는다. 비주얼 c++ 도구를 이용하되 c++ 언어 표준에 준하여 프로그래밍하면 컴파일러나 플랫폼에 상관없이 컴파일되고 실행 가능하다.

C++ 언어의 특징

1. C++언어의 주요한 설계 목표

  • C언어로 작성된 프로그램과의 호환성을 유지
  • 소프트웨어의 재사용을 위해 객체지향 개념 도입
  • 타입체크를 엄격히 해 실행 시간 오류의 가능성을 줄이고 디버깅을 돕는다.
  • 실행시간의 효율성 저하를 최소화

2. C언어에 추가한 기능

  • 함수중복
  • 디폴트 매개 변수
  • 참조
  • 참조에 의한 호출
  • new와 delete 연산자
  • 연산자 재정의
  • 제네릭 함수와 클래스

3. C++의 객체 지향 특성

  • 객체와 캡슐화
  • 상속성
  • 다형성

C++프로그램 개발 과정

  • 컴파일(compile) : cpp 소스 프로그램 작성이 완료되면 c++컴파일러를 이용해 컴파일 한다. c++컴파일러는 c++소스 프로그램이 문법에 맞게 작성되었는지 검사하고 기계어 코드로 변환하여 목적파일(.obj)을 생성한다. 만일 문법에 맞지 않게 작성된 코드가 있으면 컴파일 오류를 발생시킨다.
  • 링킹(linking) : 컴파일 후 기계어로 구성된 목적파일이 생성되더라도 목적파일은 바로 실행될 수 없다. 표준 c++ 라이브러리나 다른 c++프로그램에 있는 함수, 객체, 데이터를 이용하는 경우 개발자가 작성한 c++소스의 목적파일에는 이들에 대한 참조만 있을 뿐 이들 코드를 포함하지 않는다. 그러므로 목적파일은 온전히 실행파일이 아니며 이들과 결합되어야만 실행가능한 파일이 된다. 링킹이란 어떤 목적파일이 참조하는 c++ 표준 라이브러리나 다른 목적파일 속에 있는 함수, 객체, 데이터를 포함하여 실행에 필요한 모든 기계어 코드를 확보해 하나의 실행 파일로 만드는 과정이다. 링킹의 결과 실행에 필요한 모든 요소를 포함한 하나의 실행파일(.exe)이 만들어진다. 실행 파일에는 실행에 필요한 모든 요소들이 들어 있다. 만일 링킹 과정 동안 목적 파일에느 참조하는 코드를 다른 목적 파일이나 c++표준 라이브러리 속에서 발견할 수 없다면 링크 오류가 발생한다.
  • 프로그램 실행과 디버깅 : 링킹의 과정에 의해 생성된 실행파일은 컴퓨터에서 바로 실행이 가능하다. 만일 프로그램에 논리적 오류가 있다면 프로그램 내에 오류 위치를 발견하거나 문제의 원인을 찾아 수정하는 디버깅 과정을 한다. 디버깅은 일반적으로 디버거라는 특별한 소프트웨어를 이용한다. 디버거는 일반적으로 컴파일러를 공급하는 회사에서 함께 공급한다.


링킹과 DLL(Dynamic Linking Library) 일반적으로 개발자가 작성한 c++소스와 이 소스에서 필요한 모든 라이브러리는 링킹 단계에서 완전히 결합되어 하나의 온전한 실행 파일이 만들어지며, 실행 시 이 실행 파일 외에 다른 코드는 필요 없다. 하지만 링킹 단계에서 결합하지 않고 실행 중 필요한 순간에 결합하도록 만들어진 라이브러리가 있는데 이것이 바로 DLL이다. DLL은 실행 파일의 크기를 줄이는 역할과 함께 여러 응용프로그램이 실행 중에 공유하는 특징이 있다.

C++ 표준 라이브러리

이미 만들어진 함수나 클래스를 활용해 프로그램 개발에 걸리는 시간을 단축하고 프로그램의 확장성이나 정확성을 높인다. c++표준 라이브러리는 개발자들이 불러 쓸 수 있는 다양한 종류의 함수나 클래스가 컴파일된 목적파일들이다. 이들 함수나 클래스 이름이 표준화되어 있기 때문에 c++ 표준 컴파일러 사이에 호환된다. c++ 표준 라이브러리는 컴파일된 목적파일로만 제공되고 원시 소스 코드는 공개되지 않는다. c++ 표준 라이브러리는 다음 3그룹과 기타기능으로 나뉜다.

  • c 라이브러리 : 기존 c 표준 라이브러리를 수용해 이름이 c로 시작하는 헤더 파일에 선언됨.
  • c++ 입출력 라이브러리 : 콘솔 및 파일 입출력을 위한 함수나 클래스들로 제네릭 프로그래밍을 지원하기 위해 템플릿으로 작성.
  • c++ stl 라이브러리 - 제네릭 프로그래밍을 지원하기 위해 템플릿으로 작성된 유용한 함수나 클래스를 포함하는 라이브러리.

c++ 표준 라이브러리를 구성하는 헤더 파일들

  • c 라이브러리 cassert, cctype, cerrno, cfloat, ciso646, climits, clocale, cmath, csetjmp, csignal, cstdarg, cstddef, cstdio, cstdlib, cstring, ctime
  • c++ 입출력 라이브러리 fstream, iomanip, ios, iosfwd, iostream, istream, ostream, sstream, strstream, streambuf
  • c++ stl 라이브러리 algorithm, bitset, complex, deque, exception, functional, iterator, limits, list, locale, map, memory, numeric, queue, set, stack, stdexcept, string, typeinfo, utility, valarray, vector

+ 헤더파일은 stl에 포함되지 않는 기타 기능을 구현함.