🍐☘️🍏πŸ₯¬πŸ₯¦πŸŒ³πŸŒ²
μΉ΄ν…Œκ³ λ¦¬
μž‘μ„±μΌ
2022. 11. 9. 00:55
μž‘μ„±μž
Λ—Λ‹ ΰ­¨ΰ­§ ΛŠΛ—

코루틴 μ •μ˜

Coroutines are computer program components that generalize subroutines for non-preemptive multitasking, by allowing execution to be suspended and resumed.

μ‹€ν–‰μ˜ μ§€μ—°κ³Ό 재개λ₯Ό ν—ˆμš©ν•¨μœΌλ‘œμ„œ, λΉ„ 선점적 λ©€ν‹°νƒœμŠ€ν‚Ήμ„ μœ„ν•œ μ„œλΈŒλ£¨ν‹΄μ„ μΌλ°˜ν™”ν•œ 컴퓨터 ν”„λ‘œκ·Έλž¨ κ΅¬μ„±μš”μ†Œ

  μ„€λͺ… 병행성, λ™μ‹œμ„±(Concurrency)  병렬성(Parallelism)
λΉ„ 선점적 λ©€ν‹°νƒœμŠ€ν‚Ή
(Non-preemptive multitasking)
CPUλ₯Ό μ°¨μ§€ν•˜κ³  μžˆλŠ” μ“°λ ˆλ“œκ°€ CPU 연산이 ν•„μš”μ—†μŒμ„ λ‚˜νƒ€λƒˆμ„ λ•Œ, μš΄μ˜μ²΄μ œκ°€ νšŒμˆ˜ν•  수 μžˆλŠ” κ²½μš° ⭕️ ❌
μ„ μ ν˜• λ©€ν‹°νƒœμŠ€ν‚Ή
(Preemptive multitasking)
CPUλ₯Ό μ°¨μ§€ν•˜κ³  μžˆλŠ” μ“°λ ˆλ“œκ°€ CPU 연산이 ν•„μš”μ—†μŒμ„ λ‚˜νƒ€λƒˆμ„ λ•Œ, μš΄μ˜μ²΄μ œκ°€ νšŒμˆ˜ν•  수 μ—†λŠ” κ²½μš° ❌ ⭕️
  • 병행성(Concurrency), λ™μ‹œμ„±
    1. λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μž„
    2. Logical Level에 속함
    3. Single Core μ‚¬μš©
    4. 물리적으둜 병렬이 μ•„λ‹Œ 순차적으둜 λ™μž‘ν•  수 μžˆλ‹€.
    5. μ‹€μ œλ‘œλŠ” Time-sharing으둜 CPUλ₯Ό λ‚˜λˆ  μ‚¬μš©ν•¨μœΌλ‘œμ¨ μ‚¬μš©μžκ°€ Concurrencyλ₯Ό λŠλ‚„ 수 μžˆλ„λ‘ ν•œλ‹€.
  • 병렬성(Parallelism)
    1. μ‹€μ œλ‘œ λ™μ‹œμ— μž‘μ—…μ΄ 처리됨
    2. Physical(Machine) Level에 속함
    3. 였직 Multi Coreμ—μ„œλ§Œ κ°€λŠ₯
  • 루틴(메인 루틴 + μ„œλΈŒ 루틴): 컴퓨터 ν”„λ‘œκ·Έλž¨μ—μ„œ ν•˜λ‚˜μ˜ μ •λ¦¬λœ 일
    • 메인 루틴: ν”„λ‘œκ·Έλž¨ μ „μ²΄μ˜ κ°œκ΄„μ μΈ λ™μž‘ 절차λ₯Ό ν‘œμ‹œν•˜λ„λ‘ λ§Œλ“€μ–΄μ§„ 것
    • μ„œλΈŒ 루틴: λ°˜λ³΅λ˜λŠ” νŠΉμ • κΈ°λŠ₯을 λͺ¨μ•„ λ³„λ„λ‘œ λ¬Άμ–΄ 놓아 이름을 λΆ™μ—¬ 놓은 것

μ„œλΈŒλ£¨ν‹΄κ³Ό 코루틴 차이점

μ„œλΈŒλ£¨ν‹΄ 코루틴
  메인 or μ„œλΈŒ 루틴이 μ—†μŒ
λ©”μΈλ£¨ν‹΄μ—μ„œ νŠΉμ • μ„œλΈŒλ£¨ν‹΄μ˜ κ³΅κ°„μœΌλ‘œ μ΄λ™ν•œ 후에 return μ˜ν•΄ 호좜자둜 λŒμ•„μ™€ λ‹€μ‹œ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ§„ν–‰ 루틴을 μ§„ν–‰ν•˜λŠ” 쀑간에 λ©ˆμΆ”μ–΄μ„œ νŠΉμ • μœ„μΉ˜λ‘œ λŒμ•„κ°”λ‹€κ°€ λ‹€μ‹œ μ›λž˜ μœ„μΉ˜λ‘œ λŒμ•„μ™€ λ‚˜λ¨Έμ§€ 루틴 μˆ˜ν–‰ κ°€λŠ₯
μ§„μž…μ§€μ μ΄ μ—¬λŸ¬κ°œμ΄κΈ° λ•Œλ¬Έμ— 메인루틴에 쒅속적이지 μ•Šμ•„ λŒ€λ“±ν•˜κ²Œ 데이터λ₯Ό μ£Όκ³  받을 수 있음 μ§„μž…μ κ³Ό λ°˜ν™˜μ μ΄ 단 ν•˜λ‚˜λ°–μ— μ—†μ–΄ 메인루틴에 쒅속적

코루틴 μ‚¬μš©μ΄μœ 

코루틴 μ‚¬μš©λ²•

코루틴 μ„ μ–Έν•˜κΈ°

IEnumerator ParticleFadeOut()
    {
        SpriteRenderer Renderer = this.GetComponent<SpriteRenderer>();
        Color color = Renderer.color;
        while(color.a > 0.0f)
        {
            color.a -= 0.2f;
            Renderer.color = color;
            yield return new WaitForSeconds(0.1f);
        }   
    }
  • μ½”λ£¨ν‹΄μ˜ 리턴 νƒ€μž…μ€ IEnumerator(μ—΄κ±°μž)둜 μ„ μ–Έν•œλ‹€.
  • ν•¨μˆ˜ λ™μž‘ 쀑 μˆ˜ν–‰μ„ 쀑단할 λ•Œ, yield return으둜 returnν•œλ‹€.
    • ν•΄λ‹Ή λ°©μ‹μœΌλ‘œ 리턴할 경우, κ·Έ μœ„μΉ˜μ—μ„œ ν™œλ™μ΄ μ€‘λ‹¨λœ ν›„ λ‹€μ‹œ λŒμ•„μ˜¨λ‹€.
  • Yield의 μ’…λ₯˜λŠ” λ‹€μŒκ³Ό κ°™λ‹€
  • yield return null; -> λ‹€μŒ ν”„λ ˆμž„μ— λ°”λ‘œ μ‹œμž‘
  • yield return new WaitForSeconds(float) -> 일정 μ‹œκ°„λ™μ•ˆ λŒ€κΈ°
  • yield return break; -> 코루틴 μ’…λ£Œ
  • yield return new WaitForEndOfFrame();
    • λͺ¨λ“  카메라와 GUIκ°€ λ Œλ”λ§μ„ μ™„λ£Œν•œ, ν”„λ ˆμž„μ˜ λ°”λ‘œ 직전에 λ‹€μ‹œ μ‹€ν–‰ν•œλ‹€.
    • ν˜„μž¬ 화면을 μ €μž₯ν•˜μ—¬ ν™œμš©ν•  ν•„μš”κ°€ μžˆμ„λ•Œ μ‚¬μš©ν•  수 μžˆλ‹€.
  • yield return new WaitForFixedUpdate();
    • λ‹€μŒ FixedUpdate()κ°€ 호좜될 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦°λ‹€.
  • yield return new WaitUntil(쑰건문);
    • ν•΄λ‹Ή 쑰건문이 trueκ°€ 될 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦°λ‹€.
    • 쑰건문은 Update ~ LateUpdate 사이에 μ‹€ν–‰λ˜μ–΄μ§„λ‹€.
  • yield return new WaitWhile(쑰건문);
    • ν•΄λ‹Ή 쑰건문이 true인 λ™μ•ˆ κΈ°λ‹€λ¦°λ‹€
    • 쑰건문은 Update ~ LateUpdate 사이에 μ‹€ν–‰λœλ‹€.

코루틴 μ‚¬μš©ν•˜κΈ°

//ν˜ΈμΆœλ°©λ²•
StartCoroutine(ParticleFadeOut());
StartCoroutine("ParticleFadeOut");

//쀑단방법
Coroutine particleCorutine;
particleCorutine = StartCoroutine(ParticleFadeOut());
StopCoroutine(particleCorutine);
  • 코루틴 ν˜ΈμΆœμ‹œμ—λŠ”, ν•¨μˆ˜λͺ…을 ν˜ΈμΆœν•˜κ±°λ‚˜ ν•¨μˆ˜λͺ…을 String으둜 ν˜ΈμΆœν•˜λŠ” ν˜•νƒœλ‘œ μ„ μ–Έν•œλ‹€.
  • 코루틴 μ€‘μ§€μ‹œμ—λŠ” Corutine λ³€μˆ˜κ°€ ν•„μš”ν•˜λ―€λ‘œ, 쀑단할 ν•„μš”κ°€ μžˆμ„ 경우 미리 μ„ μ–Έν•˜μ—¬ 코루틴 μ‹œμž‘ μ‹œ μ €μž₯ν•΄λ‘”λ‹€.

코루틴 μž₯점

  1. λ™μ‹œμ„± ν”„λ‘œκ·Έλž˜λ° 지원 코루틴은 이전에 μžμ‹ μ˜ 싀행이 λ§ˆμ§€λ§‰μœΌλ‘œ μ€‘λ‹¨λ˜μ—ˆλ˜ 지점 λ‹€μŒμ˜ μž₯μ†Œμ—μ„œ μ‹€ν–‰ μž¬κ°œ
  2. ν˜‘λ ₯ν˜• λ©€ν‹°νƒœμŠ€ν‚Ή ν˜‘λ ₯μž‘μ—…, μ˜ˆμ™Έ, μ΄λ²€νŠΈλ£¨ν”„, 반볡자, λ¬΄ν•œλͺ©λ‘ 및 νŒŒμ΄ν”„ 와 같은 μΉœμˆ™ν•œ ν”„λ‘œκ·Έλž¨ ꡬ성 μš”μ†Œλ₯Ό κ΅¬ν˜„ν•˜λŠ”λ° 적합 StartCoroutine / StopCoroutine으둜 μ‹œμž‘, μ’…λ£Œλ₯Ό ν•  수 μžˆμ–΄ ν•„μš”ν•œ κ²ƒλ§Œ μž‘λ™μ‹œν‚€κ³  끌 수 있음
  3. μ‰¬μš΄ 비동기 처리 코틀린을 톡해 쉽고 가독성 μžˆλŠ” μ½”λ“œ μž‘μ„± κ°€λŠ₯ λ°˜λ³΅λ˜λŠ” μ—¬λŸ¬ κΈ°λŠ₯듀이 Updateμ—μ„œ μ„žμΌ ν•„μš” 없이 λ”°λ‘œ 코루틴 λ³„λ‘œ 관리 ν•  수 μžˆμ–΄μ„œ 관리가 νŽΈν•¨

코루틴 단점

  1. μŠ€ν¬λ¦½νŠΈκ°€ Disable λ λ•Œ 코루틴도 같이 μ’…λ£Œ μ‹œμΌœμ£Όμ–΄μ•Ό ν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ 있음
  2. μ„ ν˜•μ μΈ μ½”λ“œ μž‘μ„± λ°©μ‹μ—μ„œ λ²—μ–΄λ‚˜κΈ° λ•Œλ¬Έμ— λΉ λ₯Έ μ½”λ“œ 해석이 μ–΄λ €μ›Œ 질 수 있음
  3. μ“°λ ˆκΈ° λ©”λͺ¨λ¦¬ (κ°€λΉ„μ§€)λ₯Ό 자주 생성함

ν•΄κ²°λ°©μ•ˆ

  1. λ³΅μž‘ν•œ 쑰건이 ν•„μš” 없이 계속 μ‚¬μš©ν•˜λŠ” 반볡 ν•¨μˆ˜λŠ” ꡳ이 코루틴 쓰지말고 Update에 λ„£μž
  2. λ˜‘κ°™μ€ 쑰건으둜 λ°˜λ³΅λ˜λŠ” μ½”λ£¨ν‹΄μ—μ„œ Wait문을 κΌ­ μΊμ‹±ν•΄μ„œ μ‚¬μš©ν•˜μž
  3. 코루틴을 μˆ˜μ‹œλ‘œ μ‹œμž‘ν•˜κ³  μ’…λ£Œν•˜λŠ” 짓은 μ ˆλŒ€ ν•˜μ§€λ§μž

레퍼런슀

μœ λ‹ˆν‹° 코루틴 / Unity Coroutine

Unity Coroutine(코루틴)κ³Ό Update

[Android] 코루틴 μ™œ μ¨μ•Όν•˜λŠ”κ°€

https://eocoding.tistory.com/88

μ½”ν‹€λ¦° 코루틴(Coroutine) 기초

'μœ λ‹ˆν‹° > C# κ°œλ…' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

C# 비동기와 μ“°λ ˆλ“œ  (1) 2023.08.22
C# 비동기 μ·¨μ†Œ  (0) 2023.08.22
C# 동기/비동기  (0) 2023.08.22
onDrag?.Invoke(eventData);  (0) 2023.08.14
C# ν”„λ‘œκ·Έλž˜λ°  (0) 2023.01.11