Coroutine Builder 이해하기

2024. 5. 2. 03:30·Study/Kotlin
728x90
반응형

우리는 지금까지 예제에서 코루틴을 실행할 때 async를 사용해 suspend function을 실행해왔다.

 

명확히 하자면 이번 제목이 코루틴을 실행하는데 필요한 녀석이다.

 

그래서 뭐임?

Coroutine Builder(코루틴 빌더)는 새로운 코루틴을 만들기 위해 필요한 녀석이다.

 

총 3가지 빌더가 있고 launch, async, runBlocking이 있다.

 

먼저 launch를 사용해보려고 한다.

 

launch 사용하기

fun main() {
	launch {}
}

 

단순히 이렇게 사용할 순 없다.

 

launch는 최상위 함수가 아닌 CoroutineScope의 확장함수이기 때문이다.

 

CoroutineScope.launch

이렇게 launch를 사용하려면 새로운 CoroutineScope가 필요하다.

 

launch는 대체 어떤 경우에 사용하는 걸까?

 

코루틴 외부에서 코루틴 결과물에 접근할 필요가 없을 때 사용한다.

 

반면에 코루틴 결과물에 접근할 필요가 있을 때는 무엇을 사용할까?

 

바로 async를 사용하면 된다.

 

하지만 이번엔 다른 코루틴 빌더인 runBlocking을 사용해보자.

 

runBlocking 사용하기

runBlocking은 아래처럼 사용할 수 있다.

fun main() {
	runBlocking {
    	launch {
        	// ... some code
        }
    }
}

 

조금 생각해보면 runBlocking은 launch와 다른 점이 있다.

 

이 녀석은 일반 함수처럼 호출했기 때문이다.

 

가능한 이유가 뭘까?

 

runBlocking은 내부적으로 CoroutineScope를 가지고 있기 때문이다.

 

runBlocking

 

launch 추가 설명

launch 코루틴 빌더를 사용하면 Job 객체를 리턴한다.


그리고 이 Job 객체를 사용하여 launch로 만들어진 코루틴의 상태를 확인할 수 있고, 취소시킬 수 있다.

 

게다가 Job 객체로 코루틴 간의 부모-자식 계층을 만들 수 있다.

 

두 코드를 가지고 실행 결과를 비교해보자.

fun main() = runBlocking {
	val job = launch {
    	networkRequest()
        println("result received")
    }
    println("end of runBlocking")
}

이 코드는 예상하다시피 Job 객체를 사용해 어떤 계층을 만들지 않은 코드이다.

 

실행 결과는 어떻게 될까?

...
end of runBlocking
result received
...

위처럼 나오게 된다.

 

그럼 두 print문이 순서대로 출력되도록 만드려면 어떻게 해야할까?

 

fun main() = runBlocking {
	val job = launch {
    	networkRequest()
        println("result received")
    }
    job.join()
    println("end of runBlocking")
}

이 코드를 실행하게 되면 runBlocking에서 launch로 실행된 코루틴이 종료될 때까지 기다리게 된다.

 

 

또다른 launch가 제공하는 기능 중 흥미로운 옵션은 코루틴을 늦게 시작하는 기능이다.

 

기본적으로는 코루틴이 바로 시작되지만,

start 파라미터에 CoroutineStart.LAZY를 설정해주면 어디서 코루틴을 시작할 지 정할 수 있다.

fun main() = runBlocking {
	val job = launch(start = CoroutineStart.LAZY) {
    	networkRequest()
        println("result received")
    }
    delay(200)
    job.start()
    println("end of runBlocking")
}

이렇게 Job 객체에 start() 메소드를 사용하면 된다.

 

위 코드에서는 200밀리초 동안 기다린 후 해당 코루틴을 시작하고 있다.

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Study > Kotlin' 카테고리의 다른 글

async CoroutineBuilder Introduction  (0) 2024.05.27
Coroutines의 Main safety  (0) 2024.05.07
Coroutines의 내부 동작  (0) 2024.03.07
Coroutines을 다른 스레드에서 실행하기  (0) 2024.03.03
Blocking vs Suspending 차이점  (0) 2024.03.01
'Study/Kotlin' 카테고리의 다른 글
  • async CoroutineBuilder Introduction
  • Coroutines의 Main safety
  • Coroutines의 내부 동작
  • Coroutines을 다른 스레드에서 실행하기
BonusTrack02.dev
BonusTrack02.dev
공부, 일상
  • BonusTrack02.dev
    BonusTrack02.dev
    BonusTrack02.dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (236)
      • Dev experience (85)
        • Android (84)
        • Kotlin (1)
      • Study (61)
        • Kotlin (25)
        • Swift (17)
        • Java (19)
      • 프로그래머스 (68)
      • 주저리주저리 (22)
        • 카페 (5)
        • 음식점 (4)
        • 컨퍼런스 (1)
        • 팝업스토어 (4)
        • 전시회 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    viewModelScope
    PCCE
    daterangepicker
    오블완
    databinding
    코루틴
    프로그래머스
    MVVM
    배열
    Kotlin
    안드로이드
    Observer
    android
    Material
    ViewModel
    room
    스위프트
    coroutines
    Java
    ios
    jetpack
    LiveData
    programmers
    티스토리챌린지
    자바
    SWIFT
    코틀린
    CodeLab
    aac
    getNumericValue
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BonusTrack02.dev
Coroutine Builder 이해하기
상단으로

티스토리툴바