유니티 Async & await

Async 란?

비동기 방식을 사용할 때 사용하는 "키워드"입니다.

 

 


비동기란?

"비동기"는 대기하거나 특정 주문에 묶이지 않고 작업을 수행하는 것을 의미합니다.

친구와 카톡을 하고 있다고 가정하고 할 수 있는 작업이 2가지 있다고 상상해 보겠습니다.

 

  1. 카톡을 하는데 친구가 말을 마칠 때까지 기다려야 한다.
  2. 친구가 카톡 입력을 마칠 때까지 기다리지 않고 바로 카톡을 답장한다.

 

첫 번째 작업에서는 조치를 취하기 전에 어떤 일이 발생하기를 기다리기 때문에 "동기적으로" 작업을 수행합니다.


두 번째 작업에서는 상대방이 완료할 때까지 기다리지 않고 바로 응답할 수 있기 때문에 "비동기적으로" 작업을 수행하고 있습니다. 특정 상황에 얽매이지 않고 그동안 멀티태스킹이나 다른 일을 할 수 있습니다.


컴퓨팅 또는 프로그래밍에서 "비동기"는 종종 서로를 기다리지 않고 독립적으로 동시에 수행할 수 있는 작업을 나타냅니다. 이를 통해 프로그램은 여러 작업을 동시에 수행할 수 있으므로 보다 효율적이고 응답성이 높아집니다.

더보기

순차적이라 함은 아침에 일어나서

양치 -> 세수 -> 머리 감기 -> 머리 말리기...... 이렇게 행동 하나가 '반드시' 끝나야만 다음 행동으로 넘어갈 수 있는 것을 뜻합니다.

 

비순차적이라 함은

양치하는 동안 핸드폰하고... 세수하는 동안 다리도 닦고....

머리 감는 동안 방귀(?)도 뀌고... 머리 말리는 동안 옷도 입고.....

하나의 행동을 할 때 그 행동이 끝나기만을 기다리는 것이 아닌 기다리는 동안 다른 작업도 '동시'에 하는 것을 뜻합니다.

 

 

 


비동기를 언제 사용하냐?

무거운 작업(예를 들어, 씬을 넘어가는데 맵을 로드 해와야 하는 등...)을 해야 하는데 실시간성(아까 말한 동시에 작업하는 것)을 확보하고 싶을때가 있습니다.

 

모바일 게임을 하다 보면 씬이 넘어갈 때 긴 로딩바나, 빙글빙글 돌아가는 로딩 아이콘이 있는 경우가 있습니다.

보통 이럴 땐 '일회용 스레드'를 생성하고 그 스레드 안에서 맵을 불러오는 등의 작업을 수행합니다.

이런 작업(스레드 만드는 것)을 편하게 도와주는 녀석들이 Task이며 aysnc와 await는 Task와 함께 사용하는 키워드입니다.

 

async는 비동기식 처리에 필요한 녀석들을 사용함을 암시하는 키워드입니다.

async가 붙은 함수는 반드시 await가 하나 이상 필요합니다!


Async와 코루틴과의 차이는?

유니티에서의 코루틴은 근본적으로 동기처리 방식(정확히는, 싱글 스레드로 비동기 방식을 처리입니다.
만약, 코루틴 루프(While과 같은)에서 무거운 작업을 처리해야 한다면 어떤 일이 발생할까요?

극단적인 예시를 하나 들어보겠습니다!  코루틴 루프 로직에 무한 반복 while(true) 문을 작성해 본다면,

IEnumerator Test()
{
    yield return null;
    while(true)
    {
    	Debug.Log("살...살려줘...");
    }
}

우리의 어플리케이션(Program)이 while문의 굴레를 벗어나지 못한 채 영원히 끝나기를 기다리는 모습을 볼 수 있습니다...

출처 - https://mist16.tistory.com/18

동기처리 - (코루틴) : 한 번에 처리하지 못함, 비선점형

비동기처리 - (Async) : 한 번에 처리함, 선점형


Async을 이용한 예시

Async를 이용한 동기처리 구현 예시입니다.

namespace AsyncTest
{
    class Async
    {
        void Start()
        {
         Debug.Log("Start!!!");
            Test();
            Debug.Log("1");
        }
        private async void Test()
        {
         Debug.Log("2");
            await Task.Delay(7000);
            Debug.Log("3");
        }
    }
}
  1.    Start!!!가 실행되고
  2.    Test 함수가 실행되며
  3.    2가 호출되고 7초를 기다리는 동안,
  4.    작업의 흐름이 Test를 호출한 호출자에게 넘어가서 1을 호출하고
  5.    7초 후에 3이 호출됩니다.