[Android] Coroutine (코루틴)

민채·2024년 2월 27일
0

Android

목록 보기
12/16

Coroutine

  • 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴
  • 동시성 프로그래밍 개념을 코틀린에 적용한 것
  • 일반적으로 CoroutineScope로 실행
  • launch() 함수로 코루틴을 실행하면 Job 인스턴스가 반환

CoroutineScope

  • Coroutine Job이 실행되는 Scope (코루틴은 일반적으로 CoroutineScope로 실행 됨)
  • 코루틴이 실행되는 범위를 생성
  • CoroutineScope 안에 있는 것은 별도의 스레드
  • 다양한 Scope 확장 함수 (Coroutine Builder)를 이용하여 코루틴을 만듦

Coroutine Builder

  • launch()
    • 즉시 실행 (현재 스레드 중단 없음)
    • 실행 결과 반환하지 않음(실행하고 잊어버리는 형태의 코루틴 실행) -> suspend 함수가 아닌 일반 함수 안에서 suspend 함수를 호출할 때와 코루틴의 결과 처리가 필요없을 때 사용
    • 관리를 위한 Job 객체를 반환
    • join을 통해 완료 대기 가능
  • async()
    • 즉시 실행 (현재 스레드 중단 없음)
    • 결과나 예외를 반환
    • 실행결과는 Deferred<T>를 통해서 반환하며 await을 통해서 받을 수 있고, await은 작업이 완료될때까지 기다림
    • await()을 (멈춤 기능) 사용하려면 반드시 코루틴 블럭이나 suspend function 을 선언해야 함
      • suspend function 함수는 코루틴 블럭, suspend function 함수 내부에서만 사용 할 수 있음
  • withContext()
    • 부모 코루틴에 의해 사용되던 컨텍스트와 다른 컨텍스트에서 코루틴을 실행
    • 결과를 반환할 때 async() 대신 유용하게 사용
  • runBlocking()
    • 현재 스레드를 중단하고 실행
    • 코드 테스트, 레거시 코드 및 라이브러리 통합 시 유용

일반적으로 launch(), async()를 가장 많이 사용

CoroutineContext

  • 코루틴이 실행될 컨텍스트에 관한 정보를 제공
  • 코루틴 처리를 어떻게 할 것 인지에 대한 요소들의 집합
  • CoroutineContext 요소
    • Dispatcher : 코루틴을 처리할 적절한 스레드에 작업을 전달
    • Job : 코루틴의 생명 주기 제어 (생명 주기, 부모 자식 관계 정리 및 관리)

Dispatcher

  • 코루틴을 스레드에 배분하는 역할
  • 스레드 풀에서 스레드를 하나 할당해 코루틴을 배당

Dispatcher 종류

  1. Main : 말 그대로 메인 스레드에 대한 Context이며 UI 갱신이나 Toast 등의 View 작업에 사용 (메인 스레드. 화면 UI 작업 등을 하는 곳)
  2. IO : 네트워킹이나 내부 DB 접근 등 백그라운드에서 필요한 작업을 수행할 때 사용 (네트워크, DB 등 백그라운드에서 필요한 작업을 하는 곳)
  3. Default : 크기가 큰 리스트를 다루거나 필터링을 수행하는 등 무거운 연산이 필요한 작업에 사용 (정렬이나 무거운 계산 작업 등을 하는 곳)

Coroutine Job 함수

  • start : 현재 코루틴의 상태를 알아내어 동작 중 = true, 준비/종료 = false
  • join : 현재 코루틴이 종료되기를 기다림 (async Deferred의 await 와 같은 역할)
  • cancel : 현재 코루틴을 즉시종료 (Thread의 interrupt 와 같은 역할)
  • cancelAndJoin : 현재 코루틴을 종료하고 대기
  • cancelChildren : 현재 Coroutine Scope 내에 작성한 자식 코루틴들을 종료 (부모 코루틴은 종료되지 않음)

참조

profile
코딩계의 떠오르는 태양☀️

0개의 댓글