[Unity / C#] async / await에 대해서

조재훈·2024년 3월 19일

개요

새싹의 마법사 프로젝트를 진행하던 중 원래는 async, await에 대해 하나도 모르고 있었다

최근에 로그인, 리더보드와 같은 백엔드 서비스를 이용하면서 API들이 이 키워드를 쓰는 것을 보았는데 이것을 정리하고 가면 좋을 것 같아(사실 겜 개발자라면 알아야 하는 거 아닐까?) 블로그에 정리해보려고 한다

동기식 / 비동기식

컴퓨터 공학을 전공했다면 동기/비동기 방식이라는 용어를 한 번쯤 들어봤을텐데 알아도 한 번 정리해보고 가자

동기식

동기식 작업이란? 순차적인 실행 방식을 의미한다. 한 가지 작업을 끝내고 나서 다음 작업을 끝내는 것

유니티는 일반적으로 동기식 작업 방식으로 프로젝트를 실행한다

동기식 작업방식은 코드를 구현하기가 쉽고 실행 순서를 빠르게 파악할 수 있다(코드 위에서부터 아래로 직관적임)

하지만 위의 코드들에서 엄청난 리소스들이 필요하다면(ex. 무한 루프) 아래의 코드들은 실행이 되지 않고 프로그램 실행에 문제가 생길 것임

비동기식

비동기식 작업이란? 여러 작업들을 동시에 실행하는 방식

컴퓨터 공학 전공에서 다중 스레드를 배웠다면 무슨 느낌인지 알 것이다. 비동기식 작업을 채택하면 동기식 작업에서 생겼던 문제를 해결할 수 있다

하지만 비동기식 작업을 구현하기가 힘들고 보는 사람도 구조를 파악하기 힘들 수 있어 구현할 때 세심한 설계가 필요하다

주로 데이터베이스, 웹 통신 같이 실행에 시간이 걸리는 곳에 사용한다

유니티에서 비동기식 작업 방식을 구현하는 방법

코루틴

코루틴은 저번에 포스팅한적이 있어 자세한 설명은 생략하겠다

코루틴은 사실 비동기식 작업 방식을 모방하는 것 절대 잊지 말자

Task 사용

Task에 대해서 자세한 건 포스팅에서 다뤄보겠다(async / await와 관련 있긴함)

async / await 사용

이번 포스팅의 주제! async과 await에 대해 알아보자

async / await

async 키워드는 비동기식(Asynchronous)의 줄임말로 메서드 앞에 async 키워드를 지정해주면 그 메서드를 비동기 함수로 만들 수 있다

public async Task AsyncMethod()

Task는 작업의 단위를 반환해주는 변수로 결과값은 그 작업의 결과를 제공한다
Task만 있으면 void 반환 / Task<int>는 int 값 반환

비동기 메서드의 내부는 일반 함수와 비슷하게 작성하는데 차이가 있다면 await 키워드일 것이다

await 키워드는 단어의 뜻에서 유추할 수 있듯이 작업을 기다린다는 의미로 쓰인다. await로 지정한 작업이 끝날 때까지는 밑의 코드들이 실행될 일이 없음

이게 왜 필요할까?? 비동기 함수를 사용하는 예에서 웹 통신이 있었는데 웹에서 회원 정보를 받아오는 등의 시간이 오래걸리는 작업을 할 때 이 다음에 실행될 코드들이 웹에서 가져온 회원 정보를 필요로 하는데 만약 회원 정보를 받기도 전에 아래의 코드들이 실행이 되면 미정의 행동이 발생할 것이다

그래서 약간의 동기식 처리로도 생각할 수 있는데 async은 유니티 전체 프로그램과 비동기식으로 작동하며 코드 내에서는 동기식으로 작동한다고 이해하자

profile
나태지옥

0개의 댓글