C++의 역사

C++의 역사 (History of C++)

C++이 1979년 'C with Classes'로 시작해 오늘날의 표준까지 어떻게 자라났는지 시간순으로 훑어볼게요. 언어의 주요 기능이 어느 시점에 들어왔는지 한눈에 보는 데 유용한 연대기입니다.

출처: cppreference

본문

초기 C++

  • 1979: C with Classes 최초 구현
    • 새 기능: 클래스(class), 멤버 함수(member function), 파생 클래스(derived class), 분리 컴파일(separate compilation), public·private 접근 제어, friend, 함수 인자의 타입 검사, 기본 인자(default argument), 인라인 함수(inline function), 오버로드된 대입 연산자, 생성자(constructor), 소멸자(destructor), f()f(void)와 같음, call-function과 return-function(동기화 기능으로 C++에는 포함되지 않음)
    • 라이브러리: 동시 태스크 라이브러리(concurrent task library, C++에는 포함되지 않음)
  • 1982: C with Classes 참조 매뉴얼 출간
  • 1984: C84 구현, 참조 매뉴얼 출간
  • 1985: Cfront 1.0
    • 새 기능: 가상 함수(virtual function), 함수·연산자 오버로딩, 참조(reference), new·delete 연산자, const 키워드, 스코프 결정 연산자(scope resolution operator)
    • 라이브러리 추가: 복소수(complex number), 문자열(string, AT&T 버전), I/O 스트림
  • 1985: 《The C++ Programming Language》 1판
  • 1986: 남은 설계 목표를 정리한 "whatis?" 논문 — 다중 상속, 예외 처리, 템플릿 포함
  • 1987: GCC 1.15.3에서 C++ 지원
  • 1989: Cfront 2.0
    • 새 기능: 다중 상속(multiple inheritance), 멤버 포인터(pointer to member), protected 접근, 타입 안전한 연결(type-safe linkage), 추상 클래스(abstract class), static·const 한정 멤버 함수, 클래스별 new·delete
    • 라이브러리 추가: I/O 조작자(I/O manipulator)
  • 1990: 《The Annotated C++ Reference Manual》
    • 이 책은 설계된 대로의 언어를 서술했는데, 아직 구현되지 않은 기능도 일부 포함하고 있었어요. ISO 표준이 나오기 전까지 사실상의 표준 역할을 했습니다.
    • 새 기능: 네임스페이스(namespace), 예외 처리(exception handling), 중첩 클래스(nested class), 템플릿(template)
  • 1991: Cfront 3.0
  • 1991: 《The C++ Programming Language》 2판

표준 C++

  • 1990: ANSI C++ 위원회 설립
  • 1991: ISO C++ 위원회 설립
  • 1992: STL이 C++로 구현됨

C++98/03 시기

  • 1998: C++98 (ISO/IEC 14882:1998)
    • 새 기능: RTTI(dynamic_cast, typeid), 공변 반환 타입(covariant return type), 캐스트 연산자, mutable, bool, 조건 안의 선언, 템플릿 인스턴스화, 멤버 템플릿, export
    • 라이브러리 추가: locale, bitset, valarray, auto_ptr, 템플릿화된 문자열, I/O 스트림, 복소수
    • STL 기반: 컨테이너, 알고리즘, 반복자, 함수 객체
  • 1998: 《The C++ Programming Language》 3판
  • 1999: 위원회 멤버들이 표준 후보가 될 고품질 라이브러리를 만들기 위해 Boost 설립
  • 2003: C++03 (ISO/IEC 14882:2003)
    • 사소한 개정판으로, 기술적 정오표(technical corrigendum) 수준을 살짝 넘는 것을 목표로 했어요. 이 개정에서 값 초기화(value initialization)의 정의가 도입됐습니다.
    • C++03에서 수정된 결함 보고(Defect Report): 92개 코어, 125개 라이브러리 — CWG#1, CWG#20, CWG#21, CWG#22, CWG#24, CWG#25, CWG#30, CWG#32, CWG#33, CWG#35, CWG#38, CWG#40, CWG#41, CWG#43, CWG#48, CWG#49, CWG#51, CWG#52, CWG#53, CWG#56, CWG#59, CWG#64, CWG#65, CWG#67, CWG#68, CWG#69, CWG#73, CWG#74, CWG#75, CWG#76, CWG#80, CWG#83, CWG#84, CWG#85, CWG#89, CWG#90, CWG#93, CWG#94, CWG#98, CWG#100, CWG#101, CWG#103, CWG#105, CWG#108, CWG#116, CWG#120, CWG#121, CWG#123, CWG#126, CWG#127, CWG#128, CWG#131, CWG#134, CWG#135, CWG#137, CWG#142, CWG#145, CWG#147, CWG#148, CWG#149, CWG#151, CWG#152, CWG#153, CWG#159, CWG#161, CWG#163, CWG#164, CWG#166, CWG#171, CWG#173, CWG#176, CWG#178, CWG#179, CWG#181, CWG#183, CWG#185, CWG#187, CWG#188, CWG#190, CWG#193, CWG#194, CWG#202, CWG#206, CWG#210, CWG#213, CWG#217, CWG#227, CWG#235, CWG#241, CWG#249, CWG#250, CWG#304, LWG#1, LWG#3, LWG#5, LWG#7, LWG#8, LWG#9, LWG#11, LWG#13, LWG#14, LWG#15, LWG#16, LWG#17, LWG#18, LWG#19, LWG#20, LWG#21, LWG#22, LWG#24, LWG#25, LWG#26, LWG#27, LWG#28, LWG#29, LWG#30, LWG#31, LWG#32, LWG#33, LWG#34, LWG#35, LWG#36, LWG#37, LWG#38, LWG#39, LWG#40, LWG#41, LWG#42, LWG#46, LWG#47, LWG#48, LWG#50, LWG#51, LWG#52, LWG#53, LWG#54, LWG#55, LWG#56, LWG#57, LWG#59, LWG#60, LWG#61, LWG#62, LWG#63, LWG#64, LWG#66, LWG#68, LWG#69, LWG#70, LWG#71, LWG#74, LWG#75, LWG#78, LWG#79, LWG#80, LWG#83, LWG#86, LWG#90, LWG#106, LWG#108, LWG#110, LWG#112, LWG#114, LWG#115, LWG#119, LWG#122, LWG#124, LWG#125, LWG#126, LWG#127, LWG#129, LWG#132, LWG#133, LWG#134, LWG#137, LWG#139, LWG#141, LWG#142, LWG#144, LWG#146, LWG#147, LWG#148, LWG#150, LWG#151, LWG#152, LWG#154, LWG#155, LWG#156, LWG#158, LWG#159, LWG#160, LWG#161, LWG#164, LWG#168, LWG#169, LWG#170, LWG#172, LWG#173, LWG#174, LWG#175, LWG#176, LWG#181, LWG#189, LWG#193, LWG#195, LWG#199, LWG#208, LWG#209, LWG#210, LWG#211, LWG#212, LWG#217, LWG#220, LWG#222, LWG#223, LWG#224, LWG#227
  • 2006: 성능 TR (ISO/IEC TR 18015:2006)
    • 이 TR은 다양한 C++ 추상화의 비용을 다루고, 구현 지침을 제공하며, 임베디드 시스템에서의 C++ 사용을 논의하고 C의 ISO/IEC TR 18037:2008 <iohw.h>에 대한 <hardware> 인터페이스를 소개했어요.
  • 2007: 라이브러리 확장 TR1 (ISO/IEC TR 19768:2007)
    • C++ 표준 라이브러리에 다음을 추가하는 라이브러리 확장입니다:
    • Boost에서: reference_wrapper, 스마트 포인터, 멤버 함수, result_of, bind, function, 타입 특성(Type Traits), 난수(Random), 수학 특수 함수(Mathematical Special Functions), tuple, array, 비정렬 컨테이너(Unordered Containers, hash 포함), 정규 표현식(Regular Expressions)
    • C99에서: C99에서 새로 등장한 <math.h>의 수학 함수, blank 문자 클래스, 부동소수점 환경(Floating-point environment), hexfloat I/O 조작자, 고정 크기 정수 타입, long long 타입, va_copy, snprintf()·vfscanf() 함수 계열, 그리고 printf()·scanf() 함수 계열을 위한 C99 변환 지정자
    • 특수 함수를 제외한 TR1의 모든 내용이 약간의 변경과 함께 C++11에 포함됐어요.
  • 2010: 수학 특수 함수 (ISO/IEC 29124:2010)
    • TR1에 속했지만 C++11에 포함되지 않았던 특수 함수를 추가하는 국제 표준이에요: 타원 적분, 지수 적분, 라게르 다항식, 르장드르 다항식, 에르미트 다항식, 베셀 함수, 노이만 함수, 베타 함수, 리만 제타 함수. 이 표준은 C++17에 병합됐습니다.

C++11 시기

  • 2011: C++11 (ISO/IEC 14882:2011) — 주요 문서: C++11
    • 기존 관행을 표준화하고 C++ 프로그래머에게 제공되는 추상화를 개선하기 위해 아주 많은 변경이 도입됐어요.
  • 2011: 십진 부동소수점 TR (ISO/IEC TR 24733:2011)
    • 이 TR은 IEEE 754-2008 부동소수점 산술 표준의 십진 부동소수점 타입, 즉 std::decimal::decimal32, std::decimal::decimal64, std::decimal::decimal128을 구현해요.
  • 2012: Standard C++ Foundation 설립
  • 2013: 《The C++ Programming Language》 4판

C++14 시기

  • 2014: C++14 — 주요 문서: C++14
    • C++ 표준의 사소한 개정판이에요.
  • 2015: 파일시스템 라이브러리 TS (ISO/IEC TS 18822:2015)
    • boost.filesystem V3(일부 수정·확장 포함)에 기반한 파일시스템 라이브러리를 지정하는 실험적 C++ 라이브러리 확장. 이 TS는 C++17에 병합됐어요.
  • 2015: 병렬 처리 확장 TS (ISO/IEC TS 19570:2015)
    • 모든 표준 라이브러리 알고리즘을 위한 병렬·벡터 병렬 API를 표준화하고, reduce, transform_reduce, exclusive_scan 같은 새 알고리즘도 추가해요. 이 TS는 C++17에 병합됐습니다.
  • 2015: 트랜잭셔널 메모리 확장 TS (ISO/IEC TS 19841:2015)
    • C++ 코어 언어에 synchronized·atomic 블록과 트랜잭션 안전 함수를 확장해서 트랜잭셔널 메모리 시맨틱을 구현해요.
  • 2015: 라이브러리 기본 확장 TS (ISO/IEC TS 19568:2015)
    • optional, any, string_view, sample, search, apply, 다형성 할당자(polymorphic allocator), 타입 특성용 변수 템플릿 등을 표준 라이브러리에 추가해요. 이 TS는 C++17에 병합됐습니다.
  • 2015: 개념(Concepts) 확장 TS (ISO/IEC TS 19217:2015)
    • C++ 코어 언어에 개념(이름 붙은 타입 요구사항)과 제약(템플릿·함수·변수 선언에 허용되는 타입의 한계)을 확장해서 메타프로그래밍을 돕고 템플릿 인스턴스화 진단을 단순화해요. 일부 누락과 함께 이 TS는 C++20에 병합됐습니다.
  • 2016: 동시성 확장 TS (ISO/IEC TS 19571:2016)
    • std::future의 여러 확장, latch와 barrier, 원자 스마트 포인터를 라이브러리에 추가해요.

C++17 시기

  • 2017: C++17 — 주요 문서: C++17
    • C++11 이후 처음으로 나온 주요 개정판이에요.
  • 2017: Ranges 확장 TS (ISO/IEC TS 21425:2017)
    • 반복자 쌍을 대체하는 더 강력한 새 추상화인 ranges를 라이브러리에 추가해요. 범위 뷰, 센티널 범위, 즉석 변환용 투영(projection), 새 반복자 어댑터와 알고리즘을 포함하죠. 이 확장 덕분에 마침내 sort(v)로 벡터를 정렬할 수 있게 됐어요.
  • 2017: 코루틴 확장 TS (ISO/IEC TS 22277:2017)
    • 스택리스 코루틴(재개 가능한 함수)을 코어 언어와 표준 라이브러리에 추가해요. co_await, co_yield, co_return 키워드가 여기서 등장했어요.
  • 2018: 네트워킹 확장 TS (ISO/IEC TS 19216:2018)
    • boost.asio 기반의 TCP/IP 네트워킹을 라이브러리에 추가해요.
  • 2018: 모듈 확장 TS (ISO/IEC TS 21544:2018)
    • 코어 언어에 모듈을 추가해요. module, import 특수 식별자를 추가하고, export 키워드를 새로운 의미로 재도입합니다.
  • 2018: 병렬 처리 버전 2 확장 TS (ISO/IEC TS 19570:2018)
    • 두 가지 새 실행 정책(unseq, vec), reduction_plus·for_loop_strided 같은 추가 병렬 알고리즘, 병렬 태스크를 분기·결합하는 태스크 블록, SIMD 타입과 그 연산을 라이브러리에 추가해요.

C++20 시기

  • 2020: C++20 — 주요 문서: C++20
    • C++17 이후의 주요 개정판이에요.
  • 2021: 리플렉션 확장 TS (ISO/IEC TS 23619:2021)
    • 변수, 열거형, 클래스와 그 멤버, 람다와 그 캡처 같은 프로그램 엔터티를 검사하는 기능을 C++에 추가해요.

C++23 시기

  • 2023: C++23 — 주요 문서: C++23
    • C++20 이후의 주요 개정판이에요.

C++26 시기

  • 2026: C++26 — 주요 문서: C++26
    • C++23 이후의 주요 개정판이에요.

향후 개발

  • 실험적 기술 사양들
  • 2029: C++ 최신 초안 n5054 (2026-07-16) — 주요 문서: C++29
    • C++ 표준의 다음 주요 개정판이에요.

더 알아보기 (Learn more)