안드로이드

[코틀린] 코틀린 - 코루틴, Scope function

이손안나 2022. 9. 27. 23:35

코루틴

  • 한 스레드에서 실행을 일시 중단하고 다른 스레드에서 재개 
  • suspend function은 일반 함수처럼 코루틴 내부에서 사용될 수 있는 함수
fun main() {
    runBlocking {
        launch {
            doWorld()
        }
        println("Hello")
    }
}

private suspend fun doWorld() {
    delay(1000L) // suspend가 없다면 delay는 실행될 수 없다.
    println("World!")
}

Scope funcions

  • 대상 객체에 대한 임시적인 스코프를 형성하여 해당 객체에 접근 가능.

- let 

  • 객체 참조 : it
  • ?.let 을 활용하여 해당 객체가 null이 아닐때만 코드 블럭 실행
fun main() {
    var nullableStr: String? = "Hello"
    val length = nullableStr?.let {
        println(it)
        it.length
    }
}

- with

  • 객체 참조 : this , 확장 함수 x
  • this 로 객체를 참조하기 때문에 함수를 호출할 때 적절
fun main() {
    with("hello") {
        println("$length")
    }
}

- run

  • 객체 참조: this
  • with 와 동일하지만 확장 함수이다.
  • 객체 초기화와 반환 값 계산이 동시에 수행 될 때
class MultiPortService(var url: String, var port: Int) {
    fun prepareRequest(): String = "Default request"
    fun query(request: String): String = "Result for query '$request'"
}

val service = MultiPortService("https://example.kotlinlang.org", 80)

val result = service.run {
    port = 8080
    query(prepareRequest() + " to port $port")
}

// the same code written with let() function:
val letResult = service.let {
    it.port = 8080
    it.query(it.prepareRequest() + " to port ${it.port}")
}

- apply

  • 객체 참조 : this
data class Person(var name: String, var age: Int = 0, var city: String = "")

fun main() {
    val adam = Person("Adam").apply {
        age = 32
        city = "London"        
    }
}

- also

  • 객체 참조: it
fun main() {
    val stringNumbers = listOf(1, 2, 3)
        .also { println(it) }
        .map { it.toString() }
}