메이쁘

[Kotlin] 코틀린의 Coroutine 이란 무엇일까 ? 본문

Language/Kotlin

[Kotlin] 코틀린의 Coroutine 이란 무엇일까 ?

메이쁘 2020. 6. 12. 01:23

안녕하세요.

 

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

 

Comments