[Kotlin] 코루틴

정상준·2023년 2월 7일
0

kotlin

목록 보기
26/26
post-thumbnail

📚 코루틴 개념

비동기식으로 또는 동시에 작업을 실행할 때는 작업 실행 방법, 코루틴의 지속 시간, 취소되거나 오류로 인해 실패하는 경우 발생하는 현상 등에 대한 질문에 답해야 합니다. 코루틴은 구조화된 동시 실행의 원칙을 따르므로, 메커니즘의 조합을 사용하여 코드에서 코루틴을 사용할 때 이러한 질문에 답해야 합니다.

✏️ Job

launch() 함수로 코루틴을 실행하면 Job 인스턴스가 반환됩니다. Job은 코루틴의 핸들 또는 참조를 보유하므로 그 수명 주기(유지 기간)를 관리할 수 있습니다.

Job을 사용하면 활성, 취소, 완료 등의 상태를 확인할 수 있습니다. 코루틴 및 이 코루틴이 실행한 코루틴이 모든 Job을 완료하면 Job이 완료됩니다. 취소되거나 예외와 함께 실패하는 등 다른 이유로 코루틴이 완료되었을 수도 있지만 그렇더라도 Job은 해당 지점에서 완료된 것으로 간주됩니다.

✏️ 작업 계층 구조

코루틴이 다른 코루틴을 실행할 때 새 코루틴에서 반환되는 작업을 원래 상위 작업의 하위 요소라고 합니다.

val job = launch {
    ...

    val childJob = launch { ... }

    ...
}

이 상위-하위 관계는 하위 요소와 상위 요소 및 동일한 상위 요소에 속한 다른 하위 요소의 특정 동작을 지정하므로 중요합니다.

  • 상위 작업이 취소되면 그 하위 작업도 취소됩니다.
  • 하위 작업이 job.cancel()을 사용하여 취소되면 종료되지만 이로 인해 상위 작업이 취소되지는 않습니다.
  • 작업이 예외와 함께 실패하면 이 예외로 상위 항목이 취소됩니다. 이를 오류 상향 전파라고 합니다(상위 요소 및 그 상위 요소로 전파).

✏️ CoroutineScope

코루틴은 일반적으로 CoroutineScope내에서 실행됩니다. 이렇게 하면 코루틴이 관리되지 않아 손실되는 일이 없으므로 리소스 낭비를 방지합니다.

launch() 및 async()는 CoroutineScope의 확장 함수입니다. CoroutineScope의 범위에서 launch() 또는 async()를 호출하여 이 범위 내에서 새 코루틴을 만듭니다.

CoroutineScope는 수명 주기와 연결되어 범위 내의 코루틴이 유지되는 기간에 경계를 설정합니다. 범위가 취소되면 작업이 취소되고 취소가 하위 작업에 전파됩니다. 범위의 하위 작업이 예외와 함께 실패하면 다른 하위 작업이 취소되고, 상위 작업이 취소되며, 호출자에 예외가 다시 발생합니다.

✏️ CoroutineContext

CoroutineContext는 코루틴이 실행될 컨텍스트에 관한 정보를 제공합니다. CoroutineContext는 본질적으로 각 요소에 고유한 키가 있는 요소를 저장하는 맵입니다. 아래 4가지 항목을 필수적으로 넣어야 하는 것이 아닌 기본 Default값이 정해져있습니다.

  • 이름 - 코루틴을 고유하게 식별하는 이름
  • 작업 - 코루틴의 수명 주기를 제어함
  • 디스패처 - 작업을 적절한 스레드에 전달함
  • 예외 핸들러 - 코루틴에서 실행되는 코드에서 발생하는 예외를 처리함

❗️참고: 값을 입력하지 않으면 아래와 같은 Default 값으로 설정

  • 코루틴 이름으로 'coroutine' 사용
  • 상위 작업 없음
  • 코루틴 디스패처로 Dispatchers.Default 사용
  • 예외 핸들러 없음

✏️ 디스패처

코루틴은 디스패처를 사용하여 실행에 사용할 스레드를 결정합니다. 만약 더이상 진행할 작업이 없으면 스레드는 작업을 종료합니다.

Kotlin은 코루틴을 실행할 위치를 지정하기 위해 다음과 같은 내장 디스패처를 제공합니다.

  • Dispatchers.Main - 이 디스패처를 사용하여 기본 Android 스레드에서 코루틴을 실행합니다. 이 디스패처는 주로 UI 업데이트 및 상호작용을 처리하고 빠른 작업을 실행하는 데 사용됩니다.
  • Dispatchers.IO - 이 디스패처는 기본 스레드 외부에서 디스크 또는 네트워크 I/O를 실행하도록 최적화되어 있습니다. 예를 들어 파일에서 읽거나 파일에 쓰고 네트워크 작업을 실행합니다.
  • Dispatchers.Default - 컨텍스트에 디스패처가 지정되지 않은 상태에서 launch() 및 async()를 호출할 때 사용되는 기본 디스패처입니다. 이 디스패처를 사용하여 계산이 많은 작업을 기본 스레드 외부에서 실행할 수 있습니다. 예를 들어 비트맵 이미지 파일을 처리합니다.
profile
안드로이드개발자

0개의 댓글