코틀린/Coroutine

Android Coroutine 기본

리워크 2021. 11. 25. 15:36

혼자 공부해보면서 정리한거라 많이 틀릴 수 있다는 것을 미리 알려드립니다!!

 

1. 동기/ 비동기

코루틴을 알아보기 전에 왜 코루틴이 필요한가에 대한 설명이 필요할 것 같다.

 

1) 동기(순차적으로 작업을 함)

  • 작업의 요청이 있을 경우 그 결과가 연결되어 일어나는 것으로, (예시) 네트워크 I/O와 같은 입출력 작업은 요청 이후 출력까지 해당 기기의 부하가 적어 다른 작업을 할 수 있음에도 네트워크의 결과가 나올때 까지 기다려야는 비효율적인 동작을 할 수 있다.

 

2) 비동기(동시에 작업이 일어나는 것 처럼 동작 함)

  • 동기와 다르게 작업의 요청, 요청에 따른 과정, 결과를 분리하여, 시간이 걸리 과정(요청에 따른 과정 등)을 다른 부분에 맡기고 다음 작업의 루틴을 시작하여 마치 동시에 여러 작업이 이루어 지는 것처럼 동작하게하는 방식이다. 효율적으로 동작을 할 수 있지만, 비동기를 구현하는 방법(쓰레딩, 코루틴 등등)에 따라 동기 코드에 비해 복잡하다.

2. 코루틴

실제로 동시에 일어나는 동시성과 병렬적으로 작업을 하는 병렬성에는 차이가 있음을 우선 이해하여야 한다.

 

 1) 동시성

  • 앞서 설명한 동기,비동기와 관계가 있는 패턴으로 여러 작업들이 하나의 타임라인에서 겹쳐서 실행되는 것이다. 여러 작업들이 독립적으로 실행되어 한 번에 하나만 처리할 수 있는 환경에서도, 여러번 번갈아 가면서 처리하여 동시에 처리하는 것 처럼 보이는 것이 핵심이다. 대기시간이 긴 I/O(input/output) 작업 등에 적용하는 것이 효율적이다.

 

 2) 병렬성

  • 위의 동시에 처리하는 것처럼 보이는 것과는 다르게 실제로 동시에 처리하는 것을 말하며, 필수적으로 싱글코어가 아닌 멀티코어 환경에서만 적용할 수 있다. CPU 바운드 작업을 포함한 계산이 필요한 작업에 적요하면 효율적이며, 코루틴의 Dispatcher을 설정하여 병렬성으로 실행할 수 있도록 유도할 수 있다.

 

코루틴은 위의 두 방식 중 동시성에 매우 큰 도움이 되며, 병렬성을 적용할 때에도 코드를 작성하기 쉽게 도와준다. 하지만 병렬성을 적용 할 때, 정밀한 작업이 필요하다면(아주 특별한 경우) 직접 멀티프로세싱이나 멀티쓰레드를 사용하는 것이 더 적합할 수 있다.

 

 3) 장점

 

(1) 코루틴이 제공하는 코루틴 컨텍스트나 디스패쳐를 통해 편하고 직관적으로 동시성 프로그래밍을 설계할 수 있다.

  • 디스패쳐를 통해 가용할 수 있는 쓰레드 풀에서 필요한 쓰레드를 지정하여 사용할 수 있다.

 

(2) 직관적이다.

  • 코드의 표기에 await 등을 사용하여 복잡한 비동기식 코드를 직관적으로 이해할 수 있는 동기식 코드처럼 사용할 수 있다.

 (3) 이외

  • 이것 외에도 취소할 수 있고, 안드로이드 라이브러리와 연계 제공되는 라이브러리를 통해 라이프사이클 조절이 쉽고 등등 여러 장점이 있다.

3. 다른 방법들

동시성, 병렬성을 적용하기 위해서 다른 방법들을 사용할 수 있지만 각각의 장단점과 안드로이드에서 제공하는 라이브러리 편의성 등을 고려하면 

Rx-Kotlin, 직접하는 멀티쓰레딩, 서비스, Excutor등을 사용하는 것 보다 코루틴을 사용하여 개발하는 것이 가독성, 개발성, 예외처리, 생명주기 관리 등 여러 면에서 이득을 챙길 수 있다.