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;
}
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 초급 - 1. C++ 소개 및 개발 환경 설정 (4 - 첫 번째 C++ 프로그램 실행) (0) | 2025.02.12 |
---|---|
C++ 초급 - 1. C++ 소개 및 개발 환경 설정 (3 - 개발 환경 설정) (0) | 2025.02.12 |
C++ 초급 - 1. C++ 소개 및 개발 환경 설정 (1 - C++ 개요 및 특징) (0) | 2025.02.12 |
데이터 타입 (C++) (0) | 2025.01.04 |
std::is_empty - empty class (C++11~) (0) | 2024.08.04 |