Async, Await - cheona-thousand-man/Unity-myBasics-Wiki GitHub Wiki

async / await ๊ฐœ์š”

async

  • ๋ฉ”์„œ๋“œ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ‘œ์‹œํ•˜๋Š” ํ‚ค์›Œ๋“œ
  • async๋กœ ํ‘œ์‹œ๋œ ๋ฉ”์„œ๋“œ๋Š” Task ๋˜๋Š” Task ๋ฐ˜ํ™˜
  • ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์—์„œ await ์‚ฌ์šฉ ๊ฐ€๋Šฅ

await

  • ๋น„๋™๊ธฐ ์ž‘์—…์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋ฉด์„œ ํ˜„์žฌ ์Šค๋ ˆ๋“œ๋ฅผ ๋ธ”๋กœํ‚นํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ‚ค์›Œ๋“œ
  • await๋Š” async๋กœ ํ‘œ์‹œ๋œ ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

์ด ๋‘ ํ‚ค์›Œ๋“œ๋Š” C# 5.0๋ถ€ํ„ฐ ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ, Unity์—์„œ๋Š” C# 7.0 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

Unity์—์„œ async / await ์‚ฌ์šฉ

  • Unity์—์„œ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ๋•Œ async์™€ await๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ
    • ๊ฒŒ์ž„์˜ ํ”„๋ ˆ์ž„๋ฅ  ์œ ์ง€
    • ๋„คํŠธ์›Œํฌ ์š”์ฒญ
    • ํŒŒ์ผ I/O
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ ๋“ฑ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—… ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌ

1. ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ ์ •์˜

  • ๋น„๋™๊ธฐ ๋ฉ”์„œ๋“œ๋Š” async ํ‚ค์›Œ๋“œ๋กœ ์ •์˜ํ•˜๊ณ , Task ๋ฐ˜ํ™˜
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์›น์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑ
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;

public class Example : MonoBehaviour
{
    private async void Start()
    {
        string data = await FetchDataAsync("https://api.example.com/data");
        Debug.Log(data);
    }

    private async Task<string> FetchDataAsync(string url)
    {
        using (UnityWebRequest webRequest = UnityWebRequest.Get(url))
        {
            await webRequest.SendWebRequest();
            if (webRequest.result == UnityWebRequest.Result.Success)
            {
                return webRequest.downloadHandler.text;
            }
            else
            {
                Debug.LogError("Error: " + webRequest.error);
                return null;
            }
        }
    }
}

2. await๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—… ๊ธฐ๋‹ค๋ฆฌ๊ธฐ

  • await๋Š” ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ, ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰ ๋ธ”๋กœํ‚นX
  • ์œ„ ์˜ˆ์ œ์—์„œ await webRequest.SendWebRequest()๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€๋งŒ, Unity์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋Š” ๊ณ„์†ํ•ด์„œ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

3. Unity์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€ ๋น„๋™๊ธฐ ์ž‘์—…

  • Unity์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„์˜ Unity API๊ฐ€ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋น„๋™๊ธฐ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ
  • async์™€ await๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์‹คํ–‰ํ•œ ํ›„, ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ

๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์žฅ์ 

1. ์„ฑ๋Šฅ ํ–ฅ์ƒ

  • ๋น„๋™๊ธฐ ์ž‘์—…์„ ํ†ตํ•ด ๊ธด ์‹œ๊ฐ„ ๋™์•ˆ ๋ธ”๋กœํ‚น์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๊ฒŒ์ž„ ์„ฑ๋Šฅ ์œ ์ง€์— ๋„์›€
  • ํŠนํžˆ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด๋‚˜ ํŒŒ์ผ I/O ๊ฐ™์€ ์ž‘์—…์—์„œ ์œ ์šฉ

2. ์ž์› ํ™œ์šฉ ์ตœ์ ํ™”

  • async์™€ await๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CPU ์ž์›์„ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ
  • I/O ์ž‘์—…์ด๋‚˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด, CPU๊ฐ€ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„ ํ™•๋ณด ๊ฐ€๋Šฅ

3. ์ฝ”๋“œ ๊ฐ€๋…์„ฑ

  • ๋น„๋™๊ธฐ ์ž‘์—…์„ async์™€ await๋กœ ๊ตฌํ˜„ํ•˜๋ฉด, ์ฝœ๋ฐฑ ๊ธฐ๋ฐ˜์˜ ๋ณต์žกํ•œ ์ฝ”๋“œ ๊ตฌ์กฐ ํšŒํ”ผ
  • ์ฝ”๋“œ๊ฐ€ ๋ณด๋‹ค ์ง๊ด€์ ์ด๊ณ  ๊ฐ€๋…์„ฑ ์ข‹์Œ
โš ๏ธ **GitHub.com Fallback** โš ๏ธ