🤖안드로이드🤖

[안드로이드] 코루틴 개발 환경 설정

bbooyaaa 2025. 9. 17. 00:09

안녕하세요. 오늘은 코틀린 코루틴의 정석 - CH2를 읽고 정리한 글입니다.

 📌 2장에서 다루는 내용
1. IntelliJ IDEA 사용해 개발환경 설정하기
2. 첫 코루틴 실행해 보기
3. 코루틴 디버깅을 위해 JVM 옵션 설정하기
4. CoroutineName 사용해 코루틴에 이름 설정하기

 

사실 이번 챕터는 많은 것을 다루지 않습니다.

개발환경 세팅이 주이기 때문에 간단히 다뤄볼게요.

 

2.1 개발환경 설정하기

kotlin은 언어 수준에서 Coroutine을 지원하지만 저수준 API만을 제공합니다.

코루틴 라이브러리 - kotlinx.coroutines(⇒ 고수준 API - async, await 등 제공)를 사용합니다.

따라서 따로 의존성 추가가 필요해요.

 

2.2 첫 코루틴 실행해 보기

import kotlinx.coroutines.*

fun main() = runBlocking<Unit>{
	println("Hello Coroutines")
}

위 코드에서는 메인스레드를 점유하는 코루틴을 만들어내겠죠?

 

runBlocking 함수는 해당 함수를 호출한 스레드를 사용해 실행되는 코루틴을 생성합니다.

인자로 들어온 람다식을 실행하고 모든 코드가 실행 완료될 때까지 코루틴이 종료되지 않아요.

 

코루틴 생성/실행 함수인데 왜 이름이 runBlocking이냐?

이 함수로 생성된 코루틴이 실행 완료될 때까지 이 코루틴과 관련 없는 다른 작업이 스레드를 점유하지 못하게 막습니다.

 

그럼 코루틴 생성/실행 함수는 runBlocking만 있느냐?

runBlocking 함수의 람다식에서는 수신 객체인 CoroutineScope에 접근이 가능해요.

이 CoroutineScope의 확장함수인 launch로도 코루틴 추가 생성이 가능합니다.

 

import kotlinx.coroutines.*

fun main() = runBlocking<Unit>{ // this: CoroutineScope
	println("[${Thread.currentThread().name}] 실행")
	
	launch{
		println("[${Thread.currentThread().name}] 실행")
	}
	launch{
		println("[${Thread.currentThread().name}] 실행")
	}
}

// 실행 결과:
[main @coroutine#1] 실행
[main @coroutine#2] 실행
[main @coroutine#3] 실행

여기서 Thread.currentThread().name은 실행 중인 스레드를 출력해 줍니다.

 

기본적으로 coroutine이라는 이름을 갖고 #뒤의 숫자만 1씩 증가합니다.

하지만 이런 식으로 네이밍 된다면 뭐가 어떤 코루틴인지 구분할 수가 없겠죠.

 

왜 구분해야 하는가?

 

2.3 코루틴 디버깅

코루틴 비동기 프로그래밍의 핵심은 작업단위인 코루틴입니다.

코루틴은 일시중단이 가능하지만 일시중단 후에 작업 재개 시 실행 스레드가 바뀔 수 있어요.

→ 어떤 코루틴이 어떤 스레드에서 실행되고 있는지를 알아야 디버깅이 가능합니다.

(+ JVM의 VM options에 -Dkotlinx.coroutines.debug를 추가하면 스레드 이름을 출력할 때 코루틴 이름까지 출력이 가능해요.)

 

때문에 정확한 구분이 필요해요.

 

2.4 CoroutineName 사용해 코루틴에 이름 설정하기

CoroutineName 객체는 코루틴 이름을 구분하는 객체입니다.

CoroutineName 객체를 사용해 사용자가 직접 코루틴에 이름을 부여할 수 있습니다.

객체 생성 함수에 코루틴에 설정될 이름을 인자로 넘기면 객체가 생성되죠.

fun main() = runBlocking<Unit>(context = CoroutineName("Main")){
	println("[${Thread.currentThread().name}] 실행")
	
	launch(context = CoroutineName("Coroutine1")){
		println("[${Thread.currentThread().name}] 실행")
	}
	launch(context = CoroutineName("Coroutine2")){
		println("[${Thread.currentThread().name}] 실행")
	}
}

// 실행 결과:
[main @Main#1] 실행
[main @Coroutine1#2] 실행
[main @Coroutine2#3] 실행

그렇게 생성한 객체를 runBlocking/launch에 context 인자로 넘기면 그 이름으로 코루틴이 생성됩니다.

 


이렇게 오늘은 코루틴 개발 환경 설정에 대해서 정리해 보았어요.

이번 챕터는 환경설정에 집중되어서 그런지 정리할게 크게 없네요.

다음에는 CH3 - CoroutineDispatcher에 대해서 알아보겠습니다.

다음에 뵈어요