본문 바로가기

Language

[Kotlin] 코루틴 (1) - Basic

 

 

GlobalScope.launch {} : 코루틴을 생성하기 위한 코루틴 빌더이며 실행중인 스레드를 블록하지 않음

fun main(){
    GlobalScope.launch {
        delay(1000)		//1
        println("world")	//오기전에 종료
    }
    println("hello")		//2
}

// hello

 

- 위의 코드는 hello를 찍은 후 쓰레드가 종료된다

 

 

runBlocking{} : 주어진 블록이 완료될때까지 현재 스레드를 멈추는 새로운 코루틴을 생성하여 실행하는 코루틴 빌더

runBlocking {
    GlobalScope.launch {
        delay(1000)		//1
        println("world")	//오기전에 종료
    }
    println("hello")		//2
}

// hello

- 그러나 위 코드 역시 hello를 찍은 후 쓰레드가 종료된다

- GlobalScope.launch 는 최상위 코루틴을 생성하며, 이는 앱의 전체 생명주기와 독립적으로 동작

- GlobalScope.launch로 생성된 코루틴은 runBlocking의 자식으로 간주되지 않음

 

 

job.join

runBlocking {
    val job = GlobalScope.launch {
        delay(1000L)
        println("World!")
    }
    println("Hello,")
    job.join()
}

- GlobalScope.launch{ } 빌더를 이용해 생성한 코루틴이 종료될 때까지 대기한 후 종료

- 언제 끝날지 모르는 함수에서 사용

 

 

launch : 코루틴을 생성하기 위한 코루틴 빌더이며 실행중인 스레드를 블록하지 않음

runBlocking {
    launch {
        delay(1000)		//1
        println("world")	//3
    }
    println("hello")		//2
}

// hello
// world

- 코루틴이 runBlocking의 자식으로 생성되어 부모 코루틴이 자식 코루틴의 완료를 기다림

- job.join을 사용하지 않아도 자식의 완료를 기다림

 

 

coroutinscope : 코루틴 스코프를 생성하는 일시 중단 함수 기존 코루틴의 스코프를 확장하는 역할

runBlocking {
    coroutinescope {
        delay(1000)		// 1
        println("world")	// 2
    }
    println("hello")		// 3
}

// world
// hello

- 모든 자식이 종료될때까지 다음 블록(println("hello"))으로 넘어가지 않음

 

 

 

suspend : 중단함수(ex. delay())들을 호출 할 수 있음

fun main(){
    runBlocking {
        launch {
            doWorld()
        }
        println("Hello,")
    }
}

suspend fun doWorld() {
    delay(1000L)
    println("World!")
}

 

 

예제 1

runBlocking {
    launch {
        delay(200L)				//1
        println("Task from runBlocking")	//5
    }

    coroutineScope {
        launch {
            delay(500L)				//2
            println("Task from nested launch")	//6
        }
        delay(100L)				//3
        println("Task from coroutine scope")	//4
    }
    println("Coroutine scope is over")		//7
}

//Task from coroutine scope
//Task from runBlocking
//Task from nested launch
//Coroutine scope is over

 

예제 2

runBlocking {
    repeat(100_000) {
        launch {
            delay(1000L)
            print(".")
        }
    }
}

- 1초를 기다린 후 . 을 찍는 십만개의 코루틴이 생성됨 -> out of memory 발생

 

예제 3

runBlocking {
    GlobalScope.launch {
        repeat(100000) {
            delay(1000L)
            println(".")
        }
    }
    delay(3000L)
}

- 1초를 기다린 후 . 을 찍는 십만개의 코루틴이 생성되지만 3초가 지난 후 프로그램이 종료됨

- 즉 허용된 시간 동안만 동작한 결과를 만들어 냄

 

 


요약

- runblocking {} 은 동기적, 코루틴을 차단하여 실행 즉 {} 안에 정의된 코드들은 launch 같은거 없이는 그냥 동기적으로 실행됨 하지만 안에 정의된 코드들이 모두 실행되어야 다음 코드로 넘어감 (블로킹)

- GlobalScope.launch {} 는 비동기적, 완료를 기다리지 않으며 프로그램의 생명주기와 관계없이 백그라운드에서 실행

- coroutineScope.launch {} 는 비동기적, {}안에 정의된 코드들이 완료될때까지 기다림

 


https://myungpyo.medium.com/reading-coroutine-official-guide-thoroughly-part-0-20176d431e9d

 

Reading Coroutine official guide thoroughly — Part 0

요즘 안드로이드 앱 개발자들은 주개발 언어가 Java 에서 Kotlin 으로 많이 전환 되고 있다고 생각합니다. iOS 가 objective-c 에서 swift 로 전환할 때 처럼 안드로이드 SDK 공식 가이드에서도 Kotlin 과 Java

myungpyo.medium.com

 

'Language' 카테고리의 다른 글

[Kotlin] - Channels  (0) 2025.02.09
[Kotlin] - 기본 문법 정리  (1) 2025.02.02
[Kotlin] 제네릭 generic타입  (0) 2025.02.02
[Kotlin] 코루틴 (2) - Cancellation and Timeouts  (1) 2025.02.01