본문 바로가기
프로그래밍

c++20 주요 업데이트 기능

by 머니테크리더 2024. 5. 17.
반응형

c++20주요업데이트
c++20주요업데이트

 

🔖 INDEX

     

     

     

    C++이란?

    C++ 표준 중 가장 중요한 업데이트 중 하나로, 많은 새로운 기능과 개선사항을 도입하였습니다

    C++20의 주요 기능과 이점, 그리고 각 기능에 대한 예제를 통해 개발자들이 C++20을 효과적으로 활용할 수 있습니다.

     

    개념(Concepts)

    개념은 템플릿 메타프로그래밍을 간소화하고, 템플릿 코드를 더 명확하고 읽기 쉽게 만드는 기능입니다. 개념을 사용하면 템플릿 매개변수에 대해 더 명확한 요구사항을 지정할 수 있습니다.

     

    예제

    #include <concepts>
    #include <iostream>
    
    template<typename T>
    concept Addable = requires(T a, T b) {
        { a + b } -> std::convertible_to<T>;
    };
    
    template<Addable T>
    T add(T a, T b) {
        return a + b;
    }
    
    int main() {
        std::cout << add(1, 2) << std::endl;  // 정상 작동
        // std::cout << add("Hello", "World") << std::endl;  // 컴파일 에러
    }

    위 예제에서 Addable 개념은 타입 T가 + 연산자를 지원하며 그 결과가 T 타입으로 변환 가능해야 함을 나타냅니다.

     

    코루틴(Coroutines)

    코루틴은 비동기 프로그래밍과 지연 계산을 간편하게 만들기 위한 기능입니다. 코루틴을 사용하면 함수가 중단되었다가 나중에 재개될 수 있습니다.

     

    예제

    #include <iostream>
    #include <coroutine>
    
    struct Generator {
        struct promise_type;
        using handle_type = std::coroutine_handle<promise_type>;
    
        struct promise_type {
            int current_value;
            std::suspend_always yield_value(int value) {
                current_value = value;
                return {};
            }
            std::suspend_always initial_suspend() { return {}; }
            std::suspend_always final_suspend() noexcept { return {}; }
            Generator get_return_object() {
                return Generator{handle_type::from_promise(*this)};
            }
            void return_void() {}
            void unhandled_exception() {
                std::exit(1);
            }
        };
    
        handle_type coro;
    
        Generator(handle_type h) : coro(h) {}
        ~Generator() { if (coro) coro.destroy(); }
    
        bool next() {
            coro.resume();
            return !coro.done();
        }
    
        int value() const {
            return coro.promise().current_value;
        }
    };
    
    Generator counter() {
        for (int i = 0; i < 10; ++i) {
            co_yield i;
        }
    }
    
    int main() {
        auto gen = counter();
        while (gen.next()) {
            std::cout << gen.value() << " ";
        }
        return 0;
    }

    위 예제는 0부터 9까지의 숫자를 생성하는 간단한 카운터 코루틴입니다.

     

     

    범위(Ranges)

    범위는 표준 라이브러리에 강력한 범위 기반 알고리즘을 추가하여 더 직관적이고 간단한 코드를 작성할 수 있게 해줍니다.

     

    예제

    #include <iostream>
    #include <vector>
    #include <ranges>
    
    int main() {
        std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        
        auto even = vec | std::ranges::views::filter([](int n) { return n % 2 == 0; });
        auto squared = even | std::ranges::views::transform([](int n) { return n * n; });
    
        for (int n : squared) {
            std::cout << n << " ";
        }
    
        return 0;
    }

    이 예제에서는 짝수를 필터링하고 각 요소를 제곱하여 출력하는 범위 기반 알고리즘을 사용합니다.

     

    모듈(Modules)

    모듈은 코드 컴파일 속도를 향상시키고, 대규모 프로젝트의 코드 관리를 용이하게 만드는 기능입니다. 모듈을 사용하면 헤더 파일의 필요성이 줄어듭니다.

    예제

    main.ixx

    export module math;
    
    export int add(int a, int b) {
        return a + b;
    }

     

    main.cpp

    import math;
    #include <iostream>
    
    int main() {
        std::cout << add(3, 4) << std::endl;
        return 0;
    }

    이 예제에서는 math 모듈을 정의하고, 이를 main.cpp에서 가져와 사용합니다.

     

    삼항 비교 연산자(Three-way Comparison Operator)

    삼항 비교 연산자는 <=> 연산자로, 세 가지 비교 결과(작다, 같다, 크다)를 한 번에 처리할 수 있게 합니다. 이를 통해 코드가 더 간결해지고, 자동으로 비교 연산자를 생성할 수 있습니다.

    예제

    #include <iostream>
    #include <compare>
    
    struct Point {
        int x, y;
        auto operator<=>(const Point&) const = default;
    };
    
    int main() {
        Point p1{1, 2};
        Point p2{1, 3};
    
        if (p1 < p2) {
            std::cout << "p1 is less than p2" << std::endl;
        }
    
        return 0;
    }

    위 예제에서는 Point 구조체에 삼항 비교 연산자를 자동으로 생성하고 사용합니다.

     

     

    상수평가(constexpr)의 개선

    C++20에서는 constexpr의 기능이 대폭 개선되어, 더 복잡한 상수 표현식을 컴파일 시간에 계산할 수 있게 되었습니다.

    예제

    #include <array>
    
    constexpr int factorial(int n) {
        if (n <= 1) return 1;
        else return n * factorial(n - 1);
    }
    
    int main() {
        constexpr int val = factorial(5);
        std::array<int, val> arr; // 배열의 크기로 사용 가능
        return 0;
    }

    이 예제에서는 constexpr를 사용하여 컴파일 시간에 팩토리얼 값을 계산합니다.

     

    새로운 표준 라이브러리 기능들

    C++20은 다양한 새로운 라이브러리 기능을 도입하였습니다. 이 중 몇 가지 주요 기능은 다음과 같습니다:

    • std::span: 배열과 벡터 같은 시퀀스를 간편하게 다룰 수 있는 뷰입니다.
    • std::jthread: 더 간단하고 안전한 스레드 관리 기능을 제공합니다.
    • std::syncstream: 동기화된 출력 스트림을 제공합니다.

    예제

    #include <iostream>
    #include <span>
    #include <vector>
    
    void print(std::span<int> data) {
        for (int n : data) {
            std::cout << n << " ";
        }
        std::cout << std::endl;
    }
    
    int main() {
        std::vector<int> vec = {1, 2, 3, 4, 5};
        print(vec); // 벡터를 span으로 전달
        return 0;
    }

    위 예제는 std::span을 사용하여 벡터의 데이터를 출력하는 함수입니다.

     

    C++20은 많은 새로운 기능과 개선사항을 도입하여 효율적이고 안전하며 가독성 높은 코드를 작성 할수 있게 합니다.

     

     

    댓글