0Pricing
C++ Academy · 강의

간단한 생성기 구현

값을 지연 방식으로 생성하는 생성기 코루틴을 만듭니다.

간단한 생성기 구현은(는) 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 4

coroutine_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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 코루틴 개념: co_await, co_yield, co_return
  2. 간단한 생성기 구현
  3. 비동기 작업과 Awaiter 형식
  4. 코루틴 프레임 할당
← C++ Academy(으)로 돌아가기