본문 바로가기

Android 공부

21. 안드로이드 코루틴 (Coroutine) - 기초

코틀린에서 제공하는 코루틴은 비동기적으로 실행되는 코드를 간소화하기 위한 동시 실행 설계 패턴이다. 

 

 

코루틴은 세 가지의 주요 기능을 가진다. 

- 경량 : 실행 중인 스레드를 차단하지 않는 정지를 지원한다. 단일 스레드에서 여러 개의 많은 코루틴 실행이 가능하다.
- 메모리 누수 감소 : 구조화된 동시 실행을 이용하여 범위 내에서 작업을 실행할 수 있다. 
- 취소 지원 : 실행 중인 계층 구조를 통해 자동으로 취소가 전달된다. 

 

 

코루틴은 여러 방식으로 사용이 가능하고 상황에 따라서 사용할 수 있는 builder, scope 등이 다르다. 

- Coroutine builder : launch, runBlocking
- Scope : CoroutineScope, GlobalScope
- Suspend function : suspend, delay(), join()
- Dispatchers : Default, IO, Main

 

간략하게 주요 기능들을 나열하자면 위와 같다.

 

먼저 코루틴은 빌더를 통해서 빌드된다. 빌더 중 하나인 launch 를 하면 job 객체가 반환되는데 코루틴 안에서 해당 job 객체에 suspend function 인 join() 을 사용해주면 작업이 끝날 때 까지 기다려준다. 다른 빌더인 runBlocking 은 스레드를 일시정지시키는 것이 아니라 스레드를 차단해버리는 기능을 수행한다. 따라서 테스트용이 아니라면 사용이 권장되지 않는다. (스레드가 차단되면 앞에서 여러번 언급해온 ANR 이 발생할 위험이 있다. )

 

scope의 경우는 말 그대로 범위를 나타낸다. 코루틴은 빌드되기 위해서 scope를 설정해줘야 하는데, 전역 scope가 아닌 지금의 코루틴을 scope 로 설정하는 것이 권장된다. 

 

실제로 어떤 상황에 사용되는지, 정확한 차이가 무엇인지는 다음 게시물에서 예시를 들어서 설명할 예정이다. 지금은 가장 기초적인 내용만 설명하겠다. 

 


scope 에 대해서 조금 더 알아보자.

 

모든 코루틴은 범위 안에서 실행되어야 한다. 안드로이드는 scope을 크게 3가지로 제공하고 코루틴은 안드로이드가 제공하는 scope 중 하나를 선택하여 실행을 계속할 수 있다. 

- GlobalScope : 어플의 생명주기와 함께 동작하며 별도로 생명주기를 관리할 필요가 없다.
- CoroutineScope : 필요한 순간에 시작하고 완료하는 용도로 사용된다.
- ViewModelScope : 뷰모델 컴포넌트를 사용할 때 ViewModel 에서 Coroutine 을 사용하기 위한 Scope이다. 뷰모델이 destroy 될 때 소멸한다.

 

 

코루틴을 사용하다 보면 launch 를 사용하는 경우도 있지만 async 를 사용하는 경우도 많다. 이 둘의 차이는 반환값의 여부에 달려 있다. 

// launch

print("start")

CoroutineScope.launch(Dispatchers.Main){
	delay(2000)
	print("wait in coroutine")
}

print("end")

/*
start
end
wait in coroutine
*/
// async

print("start")

CoroutineScope.launch(Dispatchers.Main){
	val v = async{
		var cnt = 0
		for(i in 1..10) cnt++;
		cnt
	}.await()
	
	print("$v")
}

/*
start
10
*/

 

위 두 예시코드를 보면 launch 는 실행 그 자체를 하고, async의 경우는 반환값을 받고, 그 반환값이 나오게 되면 다음 실행을 이어가게 한다. 상황에 따라서 골라 사용하는 것이 가능하다. 

 

 

마지막으로 Dispatchers이다. 코틀린은 코루틴의 재개를 담당하며 실행할 위치를 지정하는데 사용한다. 즉 코루틴이 실행될 스레드를 지정하는 것이라 할 수 있다. 구체적인 종류는 다음과 같다.

- Dispatchers.Main : 기본 스레드에서 코루틴을 실행. 빠른 작업과 UI 상호작용을 위해서만 사용해야 한다.
- Dispatchers.IO : 기본 스레드 외부에서 IO 를 실행하도록 최적와 되어 있다. 
- Dispatchers.Default : CPU 를 많이 사용하는 작업을 기본 스레드 외부에서 실행하도록 최적화 되어 있다.

 

 

코루틴의 기본적인 개념과 사용에 대해서 알아보았다. 자세한 예시는 다음 게시물에서 다루겠다.

'Android 공부' 카테고리의 다른 글

23. 안드로이드 viewModel - AAC? MVVM?  (0) 2023.02.08
22. 안드로이드 Fragment LifeCycle  (0) 2023.02.07
20. 안드로이드 멀티스레드  (0) 2023.02.02
19. 안드로이드 Manifest  (0) 2023.02.01
18. 안드로이드 Intent  (0) 2023.01.31