간단한 생성기 구현
값을 지연 방식으로 생성하는 생성기 코루틴을 만듭니다.
간단한 생성기 구현은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
코루틴으로서의 Generator
Generator는 한 번에 하나씩 값을 전달하는 코루틴입니다. Generator를 호출할 때마다 다음 값이 생성되고 코루틴은 일시 중단됩니다.
Generator 타입
중첩된 promise_type을 포함하는 클래스를 정의하십시오. 컴파일러는 이를 사용하여 코루틴의 상태를 관리합니다.
template <typename T>
struct Generator {
struct promise_type {
T current_value;
Generator get_return_object() {
return Generator{std::coroutine_handle<promise_type>::from_promise(*this)};
}
std::suspend_always initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void return_void() {}
std::suspend_always yield_value(T value) {
current_value = value;
return {};
}
void unhandled_exception() { std::terminate(); }
};
std::coroutine_handle<promise_type> h;
// ... constructors, destructor, next() ...
};Generator 사용하기
한 번 정의하면 Generator는 Python의 값 생성 구문처럼 사용할 수 있습니다.
Generator<int> counting() {
int n = 0;
while (true) co_yield n++;
}
auto g = counting();
for (int i = 0; i < 5; ++i) {
std::cout << g.next() << " ";
}
// 0 1 2 3 4coroutine_handle
컴파일러는 std::coroutine_handle을 반환합니다. 이는 일시 중단된 코루틴을 나타내며, resume() 또는 destroy()를 호출하거나 done()을 확인할 수 있습니다.
일시 중단 지점
각 co_yield는 코루틴을 일시 중단합니다. 호출자가 resume()을 호출하면 다음 일시 중단 지점이나 코루틴의 끝까지 실행이 계속됩니다.
initial_suspend와 final_suspend
두 가지 사용자 지정 지점이 있습니다.
initial_suspend— 지연 시작에는suspend_always를 반환하고, 즉시 시작에는suspend_never를 반환합니다final_suspend— 정리 작업을 제어합니다. 올바른 소멸을 위해 보통suspend_always를 사용합니다
C++23 std::generator
C++23은 <generator>에 std::generator를 추가했습니다. 이제 일반적인 경우에는 해당 타입을 직접 구현할 필요가 없습니다.
#include <generator>
std::generator<int> counting() {
int n = 0;
while (true) co_yield n++;
}범위 기반 for
Generator 타입이 begin과 end를 지원하면 범위 기반 for가 바로 작동합니다.
for (int x : counting()) {
if (x >= 10) break;
std::cout << x;
}가져오기와 밀어넣기 의미론
Generator는 가져오기 기반입니다. 반복을 진행하는 주체는 호출자입니다. 밀어넣기 기반 코루틴은 비동기 작업입니다.
사용 사례
Generator는 다음과 같은 작업에 적합합니다.
- 지연 생성 시퀀스(피보나치 수, 소수, 줄 단위 파일 읽기)
- 실체화하지 않고 스트리밍하는 데이터
- 트리 형태 자료 구조 순회
메모리 고려 사항
코루틴 프레임은 기본적으로 힙에 할당됩니다. 인라이닝이 가능하면 컴파일러가 할당을 생략할 수도 있으므로, 성능이 중요할 때는 측정하십시오.
살펴볼 라이브러리
학습할 때는 Lewis Baker가 만든 cppcoro에 문서가 잘 작성된 Generator 및 작업 타입이 있습니다. Boost.Asio는 코루틴에 적합한 입출력을 제공합니다. C++23 이후에는 표준 라이브러리 지원도 추가됩니다.
간단히 확인하기
Generator 코루틴을 위한 C++23 표준 라이브러리 타입은 무엇입니까?
요약
Generator 코루틴은 co_yield를 사용하여 값을 지연 생성합니다. promise_type을 포함하는 클래스로 구현할 수 있습니다. C++23은 std::generator를 표준화했습니다. Generator는 지연 생성 시퀀스와 스트리밍에 뛰어납니다.
자주 묻는 질문
“간단한 생성기 구현” 강의는 무료인가요?
네 — “간단한 생성기 구현” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“간단한 생성기 구현”에서 뭘 배우나요?
값을 지연 방식으로 생성하는 생성기 코루틴을 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C++ Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“간단한 생성기 구현” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.