---
title: "Unity를 보고 드디어 C++ 코루틴이 왜 필요한지 이해했다"
published: 2026-03-21T23:19:28.000Z
canonical: https://jeff.news/article/843
---
# Unity를 보고 드디어 C++ 코루틴이 왜 필요한지 이해했다

C++ 코루틴의 실용적 유스케이스를 Unity의 이펙트 시스템에서 발견. 복잡한 상태 머신을 단순한 함수로 변환하는 것이 코루틴의 핵심 가치이며, Unity 스타일 co_yield 핵으로 100줄 미만의 코루틴 실행기를 C++에서 구현하는 방법을 소개.

## "드디어 C++ 코루틴이 왜 필요한지 알겠다"

- C++ 코루틴이 나온 지 6년인데, 프로덕션 코드에서 본 적이 있는 사람이 거의 없음. 이유가 두 가지: 저수준 보일러플레이트가 너무 많고, **피보나치 제너레이터 말고는 쓸만한 예제가 없었기 때문**
- 글쓴이가 Unity의 C# 코루틴을 보고 드디어 감이 옴. Unity에서는 코루틴으로 **이펙트나 일시적 동작(ephemeral behaviour)**을 구현하는데, 이게 진짜 실용적인 유스케이스임

## 코루틴이 빛나는 순간

- 간단한 페이드아웃이야 람다로도 되지만, **여러 단계의 순차적 동작**이 필요하면 얘기가 달라짐. 예: TimeWarp 이펙트처럼 이동 → 대기 → 이동 → 대기를 반복하는 경우
- 이걸 코루틴 없이 C++로 짜면 **수동 상태 머신**이 됨. 상태 변수, 분기, 전환 로직... 코드 리뷰에서 통과시키고 싶지 않은 수준의 코드가 나옴
- 코루틴을 쓰면? 상태 머신이 **그냥 평범한 함수**로 변환됨. "읽기 어려운 상태 머신을 매우 단순한 함수로 바꾸는 것", 이게 코루틴의 핵심 가치라는 거

## Unity 스타일 핵으로 C++에서 구현하기

- `co_yield`는 C++23의 `<generator>`로 비교적 쉬운데, `co_await`가 어려움. 뭘 기다리는지, 누가 깨워주는지, 어떤 실행 큐를 쓰는지... 답이 정해져 있지 않은 질문이 너무 많음
- 글쓴이의 해결책: Unity가 10여 년 전에 쓴 것과 **같은 핵**을 씀. `co_yield`로 "다음 프레임까지 양보"를 표현하는 거. 의미론적으로는 맞지 않지만, 실용적으로는 완벽하게 동작함
- 전체 코루틴 실행기 구현이 **100줄도 안 됨**. `effects.add(TimeWarp(object))`로 이펙트를 추가하고, 메인 루프에서 `effects.run()` 호출하면 끝

## 보너스: 사이드 이펙트 제거 → 병렬화

- 한 발 더 나가면, `co_yield`로 렌더링 객체를 반환하게 만들어서 사이드 이펙트를 없앨 수 있음
- 사이드 이펙트가 없으니 **루프를 병렬로 돌릴 수도 있음**. 게임 이펙트 시스템이 100줄 미만의 코드로 완성되는 거

> [!NOTE]
> C++26에서 execution이 표준화되면 `co_await`를 제대로 쓸 수 있겠지만, 대부분의 프로젝트는 이미 자체 스케줄러와 스레드 풀이 있어서 통합이 쉽지 않을 전망. 당장 코루틴의 가치를 체감하고 싶다면 이 "Unity 핵"이 가장 현실적인 진입점임.

## 핵심 포인트

- C++ 코루틴 6년차인데 프로덕션에서 본 사람이 거의 없음
- Unity의 이펙트 코루틴이 실용적 유스케이스의 좋은 예시
- co_await는 어렵지만 co_yield로 '다음 프레임까지 양보' 패턴은 쉽게 구현 가능
- 전체 코루틴 실행기가 100줄 미만, 사이드 이펙트 제거 시 병렬화도 가능

## 인사이트

코루틴의 가치를 이론이 아니라 실무 관점에서 설명하는 좋은 글. co_await의 복잡함을 피하면서 co_yield로 바로 생산성을 얻는 접근이 현실적.
