Coroutine에 대해 알아보자! (1)

차경민
쓱싹팀 이야기
4 min readJul 8, 2022
Photo by Aaron Burden on Unsplash

coroutine에 대해 알아보자!

이 글은 코루틴 공식 가이드 읽고 분석하기 — Part 1 를 참고하여 만들었습니다.

Android의 비동기처리 할 때 많이 쓰이는 coroutine!
자주 사용은 해보았지만 정확한 원리를 알지 못해 애먹었던 적이 있습니다. 이번 스터디를 기회로 제대로 공부 해 정리해보겠습니다.

Coroutine의 정의?

코루틴 이란 동시성 프로그래밍을 가능하게 하는 비동기처리 프로그래밍 방법입니다.
동시성 이란 어떠한 동작을 하는 2개의 루틴이 있을 때 동시에 실행되는 것 처럼 보이는 것 입니다. (실제로는 동시에 실행되지 않습니다.)
이게 어떻게 가능한지 알아봅시다.

중단 함수에 대해 알아보자.

위 코드를 실행하면 어떤 결과가 출력될까요?
코루틴을 모르는 사람이라면 World! Hello,가 출력될거라고 생각할 겁니다.
하지만 출력해보면 Hello, World! 가 출력됩니다.
그 이유는 즉슨 중단 함수 덕분인데요. 위 코드 마지막 줄에 쓰인
Thread.sleep 함수가 그 예입니다.

코루틴은 자신이 실행한 호출 스레드를 블록 하지 않기 때문에 메인 함수가 종료되면 메인 함수를 호출한 메인 스레드 역시 종료됩니다.
위의 중단 함수의 사용으로 스레드를 지연 시켜 Hello, World!가 출력될 수 있었습니다.

중단 함수를 사용해보자.

코루틴에서 중단 함수를 사용할려면 코루틴 빌더안에서 사용됩니다.
이를 사용할려면 여러 방법이 있는데 runBlocking 빌더를 통해 알아봅시다.

runBlocking 안의 delay 중단함수로 1초동안 지연시킨 것을 확인할 수 있습니다.
맨 위의 예제도 delay 중단함수를 사용할 수 있었던 이유는 GlobalScope.launch 코루틴 빌더 안에 있었기 때문입니다.

runBlocking은 사용하기 권장하지 않습니다.

코루틴이 완료될 때 까지 메인 스레드를 지연 하는데코루틴이 완료될 때까지의 시간이 얼마나 걸릴지 모릅니다. 이때 시간이 너무 오래 걸릴 경우 ANR이 발생할 수 있습니다.

또한 위의 예제 또한 적합하지 않습니다. 자식 코루틴이 언제 끝날지 부모 코루틴은 알 수가 없습니다.

이때 사용하는 것이 Job 인스턴스 입니다.

Job 인스턴스는 코루틴 빌더의 결과값입니다.
Job 인스턴스로 코루틴 빌더로 생성된 코루틴을 종료될 때까지 대기할 수 있습니다.

이때 메인 코루틴에 자식 코루틴이 두개 이상 있다 고 가정시 자식코루틴이 실행될 때까지 기다렸다가 종료 시켜야합니다.
이런 과정은 너무 번거롭기 때문에 Scope를 사용합니다.

launch 를 사용할 때 새로운 코루틴을 생성하면 메인 코루틴에서 명시적으로 Join 할 필요없이 대기하여 종료할 수 있습니다.

Scope Builder를 사용해보자.

위 예제에서 설명한 runBlocking 처럼 scope Builder는 여러가지가 있는데
이중 CoroutineScope에 대해 알아봅시다.

runBlocking과 다르게 CoroutineScope는 자식 코루틴을 대기하는 동안 현재 스레드를 블록하지 않습니다.

위의 코드를 실행하면 어떤 결과가 나올까요?
실행결과는 다음과 같습니다.

Task from coroutine scope
Task from runBlocking
Task from nested launch
Coroutine scope is over

경량 스레드

일반적인 시간이 오래걸리는 작업은 메모리 부족으로 이어질 수 있습니다.
하지만 코루틴으로 바뀌어 실행하면 제대로 출력됩니다.

이는 코루틴의 특성으로 중단지점에 도착하면 다른 코루틴으로 넘기어 실행되기 때문에 메모리 사용이 줄어듭니다. (동시성)

데몬 스레드

GlobalScope데몬 스레드라고 불립니다.
데몬 스레드란 주 스레드의 작업을 돕는 보조적인 역할을 수행하는 스레드이며 주 스레드가 종료되면 데몬스레드는 강제적으로 종료됩니다.

GlobalScope는 데몬 스레드이기 때문에 이런 시간이 오래걸리는 작업일 때
코루틴은 그것을 수행하는 동안 메인스레드가 종료되면 코루틴도 강제적으로 종료됩니다.

--

--