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) 기능에 대해 학습하는 것이었습니다. 다음 날부터는 최적화 기법과 코드 프로파일링에 대해 다룰 것입니다.
내일은 "최적화 기법과 코드 프로파일링"에 대해 다룰 예정입니다. 질문이나 피드백이 있으면 댓글로 남겨 주세요!
'-----ETC----- > C++ 마스터 시리즈' 카테고리의 다른 글
[C++ 마스터] Day 29: C++에서의 디자인 패턴 (0) | 2024.08.01 |
---|---|
[C++ 마스터] Day 26: 멀티스레딩과 동기화 (0) | 2024.08.01 |
[C++ 마스터] Day 24: 프로젝트 - 간단한 콘솔 게임 만들기 (2) (0) | 2024.08.01 |
[C++ 마스터]Day 25: 스마트 포인터 (unique_ptr, shared_ptr) (0) | 2024.08.01 |
[C++ 마스터] Day 22: 파일 입출력 (0) | 2024.08.01 |