[TIL] 비동기 프로그래밍(UniTask)
UniTask란?
Unity에 최적화된 Zero Allocation 비동기 프로그래밍 라이브러리
- 구조체(struct) 기반 + promise 풀링 → 신규 GC 할당 제로
- Unity PlayerLoop 통합 → 코루틴처럼 메인 스레드에서 동작
- 완벽한 async/await 지원 → 직관적이고 안전한 비동기 코드 작성
왜 UniTask가 필요한가?
코루틴의 한계
- GC 할당 발생: WaitForSeconds 등 YieldInstruction 객체 생성
- 타입 안정성 부족: 반환값처리 어려움
- 예외 처리 복잡함: try-catch 사용 불가
- 취소 관리 번거로움: StopCoroutine 수동 관리
UniTask의 해결책
- 구조체 사용: promise 객체를 사용하여 GC가 없다
- 반환값 지원: 제네릭을 사용하여 타입 안정
- 예외 처리 가능: try-catch 구문 사용 가능
- 취소 관리 가능: CancellationToken 활용하여 취소 가
promise 객체는 비동기 작업의 미래 결과를 담는 그릇으로 "나중에 값을 줄게"라는 약속이라고 생각하면 됨
UniTask의 3가지 핵심 장점
1. Zero Allocation
struct 기반 UniTask로 Task 객체 할당을 없애고, async 상태머신의 promise 객체를 풀링·재사용해 신규 GC 할당을 제로로 만듦.
- Task: 호출마다 클래스 인스턴스 할당 → GC 발생
- UniTask: struct 반환 + promise 풀링·재사용 → 신규 GC 할당 없음
2. Unity PlayerLoop 통합
UniTask는 Unity의 PlayerLoop에서 직접 실행됨.
- 코루틴처럼 메인 스레드에서 동작
- Update, FixedUpdate, LateUpdate 등 타이밍 지정 가능
3. 완벽한 async/await 지원
- Task처럼
async/await키워드 사용 - 코루틴보다 직관적인 코드 작성
- 예외 처리, 반환값, 취소 등 모두 지원
UniTask vs 코루틴
| 구분 | 코루틴 | UniTask |
|---|---|---|
| 할당 | 적음 | 없음 (Zero) |
| 성능 | 보통 | 빠름 |
| 반환값 | ❌ | ✅ |
| 예외 처리 | ❌ | ✅ |
| 취소 | StopCoroutine | CancellationToken |
| 타입 안정성 | ❌ | ✅ |
| Unity 통합 | ✅ | ✅ |


![[Unity] PC 세이브 데이터 Android로 옮기기](https://data.develog.develrocket.com/upload/develog/muchan/1792206352286-hd4xz4/_____2026-10-17_114953.png)
![[Unity] 제네릭 박싱 예방](https://data.develog.develrocket.com/upload/develog/gmumdev/1792123312021-bhxx2i/_____.png)