- Today
- Yesterday
- Total
메이쁘
[Kotlin] 코틀린의 Coroutine 이란 무엇일까 ? 본문
안녕하세요.
Coroutine 은 코루틴이라고 불리며
코틀린의 주요 기능 중 하나입니다.
코루틴은 2018년 10월 29일 Kotlin 1.3에서 정식 릴리즈되면서 추가된 기능 중 하나라고 합니다.
그럼 시작하겠습니다.
코루틴(Coroutine) 이란?
- 서브루틴보단 크지만 쓰레드는 아닌, 그렇지만 쓰레드와 비슷한 기능을 함
- light-weight Threads 로, 가벼운 쓰레드 와 같아서 비동기적(async) 프로그래밍이 가능함
*** 현실 동기(동시) 와 컴퓨터상의 동기 와는 반대개념.
*** 즉, 동기는 비동시라 이전 코드나 함수 완료 전까지 대기. 비동기는 동시라 코드나 함수 호출만 하고 바로 다음 동작 진행.
- 함수 형태로 코드를 작성하여 가독성이 높음
- 대용량 처리, 복잡한 계산과 게임 등에서 주로 사용한다. (RxJava와 비슷하다..!)
- 코루틴 블럭에서 내부 코루틴이 존재하는 경우, 모든 내부 코루틴이 실행 완료될 때까지 기다린다.
- 앱 프로세스 종료 시 함께 종료된다.
- Thread 와 Coroutine 의 차이를 자세하게 본다면?
Thread
-> OS에 직접 들어가서 동작하므로 시스템 자원을 많이 소모한다.
-> 쓰레드 간 전환 시에도 CPU에서 상태 체크를 하므로 그만큼 소모되는 비용이 있다.
-> 포그라운드, 백그라운드 작업이 가능함
Coroutine
-> 비동기적 프로그래밍이 가능하고, delay 함수 등 지연시킬수도 있어서 즉시 실행하는 것이 아니다.
-> 쓰레드와 다르게 OS에 영향을 주지 않아 쓰레드만큼 비용을 소모하지 않는다.
-> Coroutine 전환 시 Context Switch 가 일어나지 않는다.
-> 개발자가 직접 루틴을 설계할 수 있어 원하는 시작 시간 및 종료 시간을 지정할 수 있다.
-> Coroutine 의 작업 전환 시 시스템에 영향을 주지 않아 그만큼 비용을 소모하지 않는다.
-> 포그라운드, 백그라운드 작업이 가능하다.
쓰레드(Thread)와 코루틴(Coroutine) 코드 비교
Thread(Runnable {
Thread.sleep(2000L)
println("Hello, Thread!")
}).start()
-> 쓰레드 기본 문법.
-> Runnable 객체를 인자로 넣는데, 이 안에 2초 sleep 후 "Hello, Thread!" 를 출력하는 코드를 넣었다.
-> 쓰레드의 start() 함수 를 실행하여 쓰레드를 작동시킨다.
GlobalScope.launch(Dispatchers.Default) {
delay(2000L)
println("Hello, Coroutine!")
}
-> 코루틴 기본 문법.
-> GlobalScope(코루틴의 범위, 블록) 객체의 launch 함수로 작동시킨다.
-> 인자로 넣은 값은 Dispatchers.Default 종류의 작업을 실행한다는 뜻
-> GlobalScope.launch{} = Thread {}
-> delay {} = Thread.sleep {}
-> repeat(1000) : 1000 milliseconds (1초) 마다 반복
-> delay(1000) : 1000 milliseconds (1초) 지연
-> launch 의 리턴 값은 job임. 그래서 이 job을 가지고 join 등 사용할 수 있음. join은 자식(내부) 코루틴이 종료하면 남은 코드들을 실행하겠다는 뜻.
*** 내부 코루틴을 만들어 순서를 보장하기위해선 내부에 coroutinescope 를 만드는 것임. 내부에 launch, job을 만드는 것과는 다름.
*** 총 3개의 Dispatchers 를 제공한다.
-> Dispatchers.Main : 안드로이드의 메인 쓰레드로 주로 UI 작업을 처리한다. 포그라운드
-> Dispatchers.IO : Disk 또는 네트워크에서 데이터 읽는 I/O 작업을 처리한다.
ex) Read File, AAC의 Room DB.
-> Dispatchers.Default : 위에서 말한 작업 외 CPU에서 처리하는 대부분의 작업들을 처리한다. 백그라운드
Suspend Function
- suspend Function 은 내부에서 Coroutine API (delay, repeat 등) 를 사용 가능하다.
- 대신, 이 함수는 일반 함수에서 호출 시 Compile Error 를 발생시킨다.
- 그렇기 때문에 코루틴 블록 내에서만 호출 가능하다.
- 코루틴에 의해 언제든 지연되고, 다시 재개되는 함수
suspend fun suspendFunc() {
repeat(100) {
delay(300)
println("Hello, suspend")
}
}
*** suspend 함수
이상입니다.
감사합니다!
좋은 하루 보내세요!
참고 사이트
https://thdev.tech/kotlin/2018/10/04/Kotlin-Coroutines/
https://tourspace.tistory.com/150
https://codechacha.com/ko/android-coroutine/
https://medium.com/@jeho1335/kotlin-coroutine-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC-c2c0a063b2fd
https://medium.com/@limgyumin/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%BD%94%EB%A3%A8%ED%8B%B4%EC%9D%98-%EA%B8%B0%EC%B4%88-cac60d4d621b