Android의 Kotlin 코루틴(1)

KanuKim97·2023년 1월 1일
0

Kotlin Coroutine

목록 보기
1/1
post-thumbnail

이번 피드는 Dispatcher와 CoroutineScope 그리고 코루틴이 무엇인지에 대해 설명하고자 합니다.

코틀린 코루틴(Coroutine)?

Android는 스레드를 경량화한 코루틴(Coroutine)이라는 도구를 제공합니다.
다른 언어에서 사용되는 동시성 프로그래밍이라는 개념을 코틀린에 도입한 것으로 비동기적으로 실행되는 코드를 간소화하기 위해 Android에서 사용할 수 있는 동시 실행 설계 패턴입니다.
여기서 코루틴의 Co(코)함께, 동시에라는 의미를 가지고 있습니다.
코루틴에서 스레드는 단지 코루틴이 실행되는 공간을 제공하는 역할을 합니다.
실행 중인 스레드를 중단시키지 않기 때문에 하나의 스레드에 여러 개의 코루틴이 존재할 수 있으며
원래 작업하던 코루틴이 도중에 다른 코루틴으로 코드를 넘겨도 기존에 작업 중인 코루틴은 잠시 멈출 뿐, 공간을 제공하는 스레드는 계속 동작합니다.
위 작업 구조를 스레드를 이용하여 처리하게 된다면 원래 작업 중인 스레드를 잠시 멈춘 뒤 다른 스레드가 작업을 처리하도록 우선순위를 넘겨야하는 데, 이런 스레드 간 전환을 우리는 컨텍스트 스위칭(context switching)이라고 부르며, 이 스위칭이 자주 일어나면 성능 저하가 발생합니다.
하지만 코루틴은 이런 컨텍스트 스위칭을 하나의 스레드에서 처리하므로 성능저하가 적고, 동일한 구조에서는 스레드보다 훨씬 적은 자원을 소모합니다.

종속 항목 정보 (Dependencies)

Android 프로젝트에서 코루틴을 사용하려면 App수준의 build.gradle파일에 다음 종속 항목을 추가 합니다.

dependencies {
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'
}

코루틴 스코프 (Coroutine Scope)

GlobalScope.launch {
	// TODO: CODE
}

코루틴은 정해진 스코프 안에서 실행됩니다.
위 예제는 GlobalScope를 사용하여 코루틴을 실행하는 간단한 코드입니다.
코루틴을 실행하는 스코프에는 글로벌 스코프(GlobalScope)와 코루틴 스코프(Coroutine Scope)가 있습니다.

글로벌 스코프(GlobalScope)

앱의 생명주기와 함께 동작하기 때문에 실행되는 동안은 별도의 생명 주기 관리가 필요하지 않습니다.
만약 앱의 시작부터 종료될 때까지 혹은 장시간 실행되어야 하는 코루틴이 있다면 Global Scope를 사용하면 됩니다.

코루틴 스코프(CoroutineScope)

필요할 때만 열고 완료되면 닫는 용도의 코루틴은 CoroutineScope를 사용해야 합니다.

뷰모델 스코프(ViewModelScope) - Android Jetpack

Jetpack 아키텍처의 ViewModel 컴포넌트를 사용하는 경우 ViewModel 인스턴스에서 사용하기 위해 제공되는 코루틴 스코프로 뷰모델 인스턴스가 소멸할 때 자동으로 취소됩니다.

CoroutineScope(Dispatchers.IO).launch {
	// TODO: CODE -> Job을 수행
}

코틀린 코루틴의 디스패쳐 (Coroutine Dispatchers)

Dispatchers.Default

안드로이드의 기본 스레드를 사용합니다. CPU를 쓰는 작업에 많이 최적화 되어있습니다.
예를 들어 데이터 정렬이나 복작한 연산등에 사용됩니다.

Dispatchers.IO

이미지 다운로드, 파일 입출력 등 입출력에 최적화 되어있습니다.
그외 네트워크, 디스크, DB 작업에 사용됩니다.

Dispatchers.Main

안드로이드 기본 스레드에서 코루틴을 실행합니다.
UI와 상호작용에 최적화 되어있습니다.

이러한 디스패쳐는 아래와 같이 사용됩니다.

CoroutineScope(Dispatchers.IO).launch {
	// TODO: CODE -> Job을 수행
}

CoroutineScope(Dispatchers.Main).launch {
	// TODO: CODE -> Job을 수행
}

CoroutineScope(Dispatchers.Default).launch {
	// TODO: CODE -> Job을 수행
}
profile
천방지축 개발자

0개의 댓글