C++ 초급 - 1. C++ 소개 및 개발 환경 설정 (2 - C++ 표준 버전 개요)

2025. 2. 12. 11:19프로그래밍 언어/C++

1.2 C++ 표준 버전 개요

C++는 지속적인 발전을 통해 새로운 기능을 추가하고 최적화를 거듭해 왔다. 각 표준 버전별 주요 변화를 살펴보자.


C++ 표준 버전별 주요 변화

C++98 (최초 표준화, 기본적인 OOP 기능)

C++98은 1998년에 ISO(국제표준화기구)에서 공식적으로 표준화한 최초의 C++ 버전이다.
이전까지는 C++ 언어가 명확한 표준 없이 다양한 컴파일러에서 구현되었으나, C++98을 통해 통일된 기능이 정의되었다.

주요 특징

  • 객체지향 프로그래밍(OOP) 개념 정립
    • 캡슐화, 상속, 다형성 등의 객체지향 기능을 공식적으로 포함
  • STL (Standard Template Library)
    • vector, map, set 등 주요 컨테이너 제공
    • algorithm, iterator 등의 표준 라이브러리 포함
  • 예외 처리 (try-catch)
  • 템플릿(Template) 도입
    • 제네릭 프로그래밍 지원
    • 함수 및 클래스 템플릿 가능

코드 예시 (STL vector 사용)

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    for (size_t i = 0; i < numbers.size(); i++) {
        std::cout << numbers[i] << " ";
    }
    return 0;
}

C++03 (C++98 보완)

C++03은 2003년에 발표된 마이너 업데이트 버전으로, C++98의 버그 수정 및 성능 개선을 목표로 했다.

주요 개선점

  • 템플릿 사용 시 예외 처리를 개선
  • std::copy 버그 수정 (STL 개선)
  • 기본적인 메모리 관리 최적화

C++03은 새로운 기능보다는 기존 기능을 더 안정적으로 만들기 위한 개선 버전이었다.


C++11 (스마트 포인터, auto, 람다 함수, nullptr 도입)

C++11은 C++의 가장 큰 변화 중 하나로 평가받는 버전이다.

  • 개발자의 코드 작성 편의성을 높이고,
  • 메모리 관리 자동화,
  • 병렬 프로그래밍 지원을 강화했다.

주요 추가 기능

  • 스마트 포인터 (std::shared_ptr, std::unique_ptr)
    • 기존의 new / delete 방식의 메모리 관리 문제를 해결
  • 자동 타입 추론 (auto)
    • 컴파일러가 변수의 타입을 자동으로 결정
  • 람다 함수 ([](){};)
    • 간결한 함수 정의 가능
  • 이동 시멘틱스 (move semantics)
    • std::move를 통해 불필요한 복사 연산 줄임
  • nullptr 도입
    • 기존의 NULL보다 더 안전한 널 포인터 표현 방식

코드 예시 (스마트 포인터, 람다 함수)

#include <iostream>
#include <memory>

int main() {
    auto ptr = std::make_unique<int>(10);  // 스마트 포인터 사용
    auto add = [](int a, int b) { return a + b; }; // 람다 함수
    std::cout << "Sum: " << add(2, 3) << std::endl;
    return 0;
}

C++14 (C++11 개선, std::make_unique)

C++14는 C++11의 불편한 점을 보완하는 역할을 했다.

주요 개선점

  • std::make_unique<T>() 추가
    • C++11에서는 std::unique_ptr 생성 시 new를 사용해야 했으나, C++14에서는 std::make_unique<T>()를 도입해 간결한 코드 작성 가능
  • 람다 함수 개선
    • 반환형 추론 (auto)을 좀 더 직관적으로 사용 가능
  • 디폴트 매개변수 (default parameters) 개선

코드 예시 (std::make_unique)

#include <memory>

int main() {
    auto ptr = std::make_unique<int>(42); // 안전한 메모리 할당
    return 0;
}

C++17 (std::optional, if constexpr, 구조적 바인딩)

C++17에서는 기존 기능을 더욱 최적화하고 코드 가독성을 높이는 기능을 추가했다.

주요 추가 기능

  • std::optional<T>
    • 값이 존재할 수도 있고, 없을 수도 있는 변수 표현 가능
  • if constexpr (컴파일 시간 조건문)
    • 조건에 따라 불필요한 코드 제거 가능 (컴파일 최적화)
  • 구조적 바인딩
    • tuple, pair 등의 데이터를 직관적으로 다룰 수 있음

코드 예시 (std::optional, if constexpr)

#include <iostream>
#include <optional>

std::optional<int> getNumber(bool valid) {
    if (valid) return 42;
    return std::nullopt;
}

int main() {
    auto num = getNumber(true);
    if (num) std::cout << "Number: " << *num << std::endl;
    return 0;
}

C++20 (concepts, ranges, coroutines)

C++20은 코드의 명확성을 높이고, 성능을 개선하는 기능을 대거 도입했다.

주요 추가 기능

  • 개념 (concepts)
    • 템플릿 타입 검증을 더 쉽게 처리할 수 있음
  • 범위 기반 라이브러리 (ranges)
    • std::vector 등의 컨테이너를 더 간편하게 다룰 수 있음
  • 코루틴 (coroutines)
    • 비동기 프로그래밍을 더 효율적으로 구현할 수 있음

코드 예시 (concepts, ranges)

#include <iostream>
#include <vector>
#include <ranges>

template <typename T>
concept Number = std::is_integral_v<T>;

void print(Number auto value) {
    std::cout << value << std::endl;
}

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};
    for (auto i : nums | std::views::filter([](int n) { return n % 2 == 0; })) {
        std::cout << i << " ";
    }
    return 0;
}

C++23 (std::expected, 개선된 모듈 시스템)

C++23에서는 오류 처리와 모듈 시스템을 개선했다.

주요 추가 기능

  • std::expected<T, E> (예외 없이 오류 처리)
    • std::optional과 유사하지만, 오류 정보를 명확히 제공할 수 있음
  • 개선된 모듈 시스템
    • #include 대신 import를 활용하여 컴파일 속도 개선

코드 예시 (std::expected)

#include <iostream>
#include <expected>

std::expected<int, std::string> divide(int a, int b) {
    if (b == 0) return std::unexpected("Division by zero");
    return a / b;
}

int main() {
    auto result = divide(10, 0);
    if (!result) std::cout << result.error() << std::endl;
    else std::cout << *result << std::endl;
    return 0;
}