[Android] Coroutine 코루틴에 대하여 알아보자!

김민주·2022년 11월 24일
0

Android

목록 보기
13/21

비동기라면 많이 접했을 AsyncTask, 코루틴, Rxjava가 있는데,
오늘은 Coroutine 에 대하여 알아보자!

구글에서 AsyncTask가 메모리 누수 등의 문제로 deprecated되어서 코루틴을 사용하는 것을 권장한다고 한다.

Coroutine

특징
1. Heap 메모리를 공유함(스레드는 스택에 할당)
2. 비선점적 멀티태스킹
3. 동시성 프로그래밍 (suspend)(병행X)
4. 경량화, 메모리 누수 감소(스택 할당 감소)

Coroutine Scope -> Coroutine Context -> Coroutine Builder

Coroutine Scope

코루틴를 사용할 스코프를 정하는 인터페이스.
하나의 프로세스에서 여러개의 코루틴을 돌릴 수 있기에 메모리 누수를 막기 위해 사용된다.
GlobalScope는 싱글톤이기 때문에 잘 사용하지 않는다.

Coroutine Context

코루틴은 Kotlin 표준 라이브러리에 정의된 CoroutineContext으로 정의된 context에서 실행된다.
대표적인 요소로는 Dispatchers와 Job이 있다.

  • Dispatchers

사용되는 작업에 따라 디스패처의 종류가 나뉨
- Dispatchers.Default: CPU연산을 많이 사용할 때
- Dispatchers.IO : 로컬DB, FileIO, NetworkIO
- Dispatchers.Main: UI메인스레드

  • Job

코루틴을 잡이라는 오브젝트로 만들어서 흐름제어를 용이하게 한다.
메소드는 start,cancel,join가 있다.

Coroutine Builder

코루틴 빌더는 코루틴을 실행하는 함수로 코루틴 객체 생성한다.

코루틴 생성

  • launch : Job 객체를 반환한다. 코루틴을 실행하며 독립적으로 동작한다.
  • async : 값이 있는 Deferred 객체를 반환한다. 동시성 작업의 결과가 필요한 경우 사용한다.
  • runBlocking : DeferredCoroutine 인스턴스를 반환한다. 코루틴이 일시중단될때 이후 시작된 스레드를 블로킹하지만 잘 사용하지 않는다.
  • withContext : 디스패처를 전환시킨다.

코루틴 지연

  • delay : 코루틴이 지정된 시간만큼 대기시킨다.
  • join : launch로 실행된 코루틴을 대기시킨다.
  • await : async로 실행된 코루틴을 대기시킨다.

코루틴 취소

  • cancel : Cancelling 상태로 만들어준다.
  • cancelAndJoin : cancelling상태 에서 cancelled 상태로 만들어준다. cancel과 join을 합친 것.
  • withTimeout : 특정 시간을 넘기면 취소시키며 TimeoutCancellationException 던진다.
  • withTimeoutOrNull : 특정시간을 넘기면 취소를 시키고 Null을 던진다.

예외처리

  • CoroutineExceptionHandler를 이용하여 코루틴 내부 trycatch 사용.
  • launch 사용 시 Exception 발생하면 바로 예외발생.
  • async 사용 시 Exception 발생해도 await 마주쳐야 예외발생.
  • 자식코루틴에서 Exception이 발생하면 부모코루틴까지 취소된다.
profile
𝐃𝐨𝐧'𝐭 𝐛𝐞 𝐚 𝐩𝐫𝐨𝐜𝐫𝐚𝐬𝐭𝐢𝐧𝐚𝐭𝐨𝐫💫

0개의 댓글