본문 바로가기
-----ETC-----/C++ 마스터 시리즈

[C++ 마스터] Day 27: 최신 C++ 표준 (C++11, C++14, C++17, C++20) 기능 소개

by cogito21_cpp 2024. 8. 1.
반응형

C++11 기능

C++11은 C++ 언어에 많은 중요한 기능을 도입했습니다. 주요 기능 중 일부를 살펴보겠습니다.

 

1. 자동 타입 추론 (auto)

auto 키워드는 변수의 타입을 자동으로 추론합니다.

#include <iostream>
#include <vector>

using namespace std;

int main() {
    auto x = 10;               // int로 추론
    auto y = 3.14;             // double로 추론
    auto z = "Hello, World!";  // const char*로 추론

    cout << x << endl;
    cout << y << endl;
    cout << z << endl;

    return 0;
}

 

2. 람다 함수 (Lambda Functions)

람다 함수는 익명 함수로, 함수 객체를 간단하게 정의할 수 있습니다.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<int> vec = {1, 2, 3, 4, 5};

    // 람다 함수 사용
    for_each(vec.begin(), vec.end(), [](int x) {
        cout << x << " ";
    });
    cout << endl;

    return 0;
}

 

3. 스마트 포인터 (Smart Pointers)

스마트 포인터는 메모리 관리를 자동화하여 메모리 누수를 방지합니다.

#include <iostream>
#include <memory>

using namespace std;

class MyClass {
public:
    MyClass() {
        cout << "Constructor called" << endl;
    }
    ~MyClass() {
        cout << "Destructor called" << endl;
    }
    void display() {
        cout << "Hello from MyClass" << endl;
    }
};

int main() {
    unique_ptr<MyClass> ptr1(new MyClass());
    ptr1->display();

    shared_ptr<MyClass> ptr2 = make_shared<MyClass>();
    ptr2->display();

    return 0;
}

 

4. 범위 기반 for 루프 (Range-Based for Loop)

범위 기반 for 루프는 컬렉션의 요소를 반복하는 데 사용됩니다.

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> vec = {1, 2, 3, 4, 5};

    for (int x : vec) {
        cout << x << " ";
    }
    cout << endl;

    return 0;
}

 

C++14 기능

C++14는 C++11의 확장을 포함하며, 몇 가지 유용한 기능을 추가했습니다.

 

1. 제네릭 람다 (Generic Lambda)

람다 함수에서 매개변수의 타입을 자동으로 추론할 수 있습니다.

#include <iostream>

using namespace std;

int main() {
    auto add = [](auto x, auto y) {
        return x + y;
    };

    cout << add(1, 2) << endl;         // 3
    cout << add(1.1, 2.2) << endl;     // 3.3

    return 0;
}

 

2. 이진 리터럴 (Binary Literals)

이진 리터럴을 사용하여 이진수를 표현할 수 있습니다.

#include <iostream>

using namespace std;

int main() {
    int bin = 0b1010;  // 10진수 10
    cout << bin << endl;

    return 0;
}

 

C++17 기능

C++17은 몇 가지 중요한 기능과 라이브러리 개선을 도입했습니다.

 

1. 구조적 바인딩 (Structured Binding)

구조적 바인딩을 사용하여 튜플 또는 구조체의 멤버를 변수에 쉽게 할당할 수 있습니다.

#include <iostream>
#include <tuple>

using namespace std;

int main() {
    tuple<int, double, string> tpl = make_tuple(1, 2.3, "Hello");

    auto [a, b, c] = tpl;  // 구조적 바인딩
    cout << a << ", " << b << ", " << c << endl;

    return 0;
}

 

2. if 초기화 문 (if with initializer)

if 문에서 변수를 선언하고 초기화할 수 있습니다.

#include <iostream>

using namespace std;

int main() {
    if (int x = 10; x > 5) {
        cout << "x is greater than 5" << endl;
    }

    return 0;
}

 

C++20 기능

C++20은 많은 새로운 기능과 개선을 도입했습니다. 주요 기능 중 일부를 살펴보겠습니다.

 

1. 컨셉 (Concepts)

컨셉은 템플릿 매개변수에 대한 제약 조건을 정의하는 기능입니다.

#include <iostream>
#include <concepts>

using namespace std;

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

template<Integral T>
T add(T a, T b) {
    return a + b;
}

int main() {
    cout << add(1, 2) << endl;         // 3
    // cout << add(1.1, 2.2) << endl;  // 오류: double은 Integral이 아님

    return 0;
}

 

2. 코루틴 (Coroutines)

코루틴은 함수 실행을 일시 중지하고 재개할 수 있는 기능입니다.

#include <iostream>
#include <coroutine>

using namespace std;

struct Generator {
    struct promise_type {
        int current_value;
        static auto get_return_object_on_allocation_failure() { return Generator{nullptr}; }
        auto get_return_object() { return Generator{handle_type::from_promise(*this)}; }
        auto initial_suspend() { return std::suspend_always{}; }
        auto final_suspend() noexcept { return std::suspend_always{}; }
        auto yield_value(int value) {
            current_value = value;
            return std::suspend_always{};
        }
        void return_void() {}
        void unhandled_exception() { std::exit(1); }
    };

    using handle_type = std::coroutine_handle<promise_type>;

    handle_type coro;

    Generator(handle_type h) : coro(h) {}
    ~Generator() { if (coro) coro.destroy(); }

    bool move_next() {
        coro.resume();
        return !coro.done();
    }

    int current_value() { return coro.promise().current_value; }
};

Generator counter() {
    for (int i = 0; i < 5; ++i)
        co_yield i;
}

int main() {
    auto gen = counter();
    while (gen.move_next()) {
        cout << gen.current_value() << " ";
    }
    cout << endl;

    return 0;
}

 

예제 문제

문제 1: C++11의 람다 함수를 사용하여 벡터의 요소를 출력하는 프로그램 작성

벡터의 요소를 람다 함수를 사용하여 출력하는 프로그램을 작성하세요.

 

해설:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    vector<int> vec = {1, 2, 3, 4, 5};

    for_each(vec.begin(), vec.end(), [](int x) {
        cout << x << " ";
    });
    cout << endl;

    return 0;
}

 

이 프로그램은 람다 함수를 사용하여 벡터의 요소를 출력합니다.

 

문제 2: C++14의 제네릭 람다를 사용하여 두 개의 값을 더하는 프로그램 작성

제네릭 람다를 사용하여 두 개의 값을 더하는 프로그램을 작성하세요.

 

해설:

#include <iostream>

using namespace std;

int main() {
    auto add = [](auto x, auto y) {
        return x + y;
    };

    cout << add(1, 2) << endl;         // 3
    cout << add(1.1, 2.2) << endl;     // 3.3

    return 0;
}

 

이 프로그램은 제네릭 람다를 사용하여 두 개의 값을 더합니다.

 

문제 3: C++17의 구조적 바인딩을 사용하여 튜플의 값을 출력하는 프로그램 작성

구조적 바인딩을 사용하여 튜플의 값을 출력하는 프로그램을 작성하세요.

 

해설:

#include <iostream>
#include <tuple>

using namespace std;

int main() {
    tuple<int, double, string> tpl = make_tuple(1, 2.3, "Hello");

    auto [a, b, c] = tpl;  // 구조적 바인딩
    cout << a << ", " << b << ", " << c << endl;

    return 0;
}

 

이 프로그램은 구조적 바인딩을 사용하여 튜플의 값을 출력합니다.

 

다음 단계

27일차의 목표는 최신 C++ 표준(C++11, C++14, C++17, C++20) 기능에 대해 학습하는 것이었습니다. 다음 날부터는 최적화 기법과 코드 프로파일링에 대해 다룰 것입니다.

 

내일은 "최적화 기법과 코드 프로파일링"에 대해 다룰 예정입니다. 질문이나 피드백이 있으면 댓글로 남겨 주세요!

반응형