Coroutine

[Coroutine Basics 1] Routine과 Coroutine의 개념과 예시

xiaolin219 2024. 1. 11. 18:08

개념

  • Routine : 프로그래밍에서 루틴은 특정한 일을 처리하기 위한 일련의 명령이다.
  • Sub-Routine : 함수 안에 함수가 있을 경우, 안쪽의 함수를 Sub-Routine이라 한다.
  • Co-Routine
    • co : 함께 수행되는
    • routine : 함수(Routine)

루틴이랑 코루틴 그래서 뭐가 다른데?

아래와 같이 main() 함수와 test()라는 함수가 있다고 해보자.

루틴 예시와 설명

// Routine, Sub-Routine ver.
// START, test, END 순으로 출력
fun main(){
  println("START")
  test()
  println("END")
}

fun test(){
  println("test")
}
  • 일반적으로 생각하는 동작 순서이다.
  • 아래 이미지에서 Routine은 main() 함수에, subRoutine은 test() 함수에 대응된다.
  • 굳이 포인트를 꼽자면 test()의 실행이 시작되면 완료될때까지 끊기지 않는다.
  • 이후 main()에서 test()의 호출 지점 다음부터 실행 재개

img

코루틴 예시와 설명

// Coroutine ver.
// START, END, test 순으로 출력
fun main(): Unit = runBlocking {
  println("START") // 1
  launch {
    test()
  }
  yield() // 2
  println("END") // 5, 6
}

suspend fun test() {
  // 3
  yield() // 4
  println("test") // 7
}

코루틴에서는 test()함수의 실행 중단되었다가 다시 재개 가능하다. 이것이 코루틴과 루틴의 차이점이다.

그렇다면 routine작동 과정과 달리 어떻게 func test()를 중단 및 재개 시킬까?

가장 먼저 main 함수에 runBlocking과 같은 coroutine Scope을 열어서 새로운 코루틴을 생성해줌으로써 가능하다.

runBlocking의 내부에서 START를 출력 후 launch 블럭을 만나게 된다.

Launch 또한 새로운 코루틴을 만드는 코루틴 블럭에 해당한다

해당 코루틴을 시작하면 비동기적으로 작동하기 때문에 코루틴이 완료될때까지 기다리지 않고 'END' 메세지를 먼저 출력하게 된다.

img

출처

이미지 출처 : https://kotlinworld.com/214
코드 참고 : 2시간으로 끝내는 코루틴(인프런)