[Coroutine] μ‹œν€€μŠ€ λΉŒλ”

 πŸ’‘ μ‹œν€ΈμŠ€ λΉŒλ”μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ³ , 쀑단이 μ™œ ν•„μš”ν•œμ§€ ν•™μŠ΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

μ‹œν€€μŠ€ λΉŒλ”

  • μ½”ν‹€λ¦°μ˜ μ‹œν€€μŠ€λŠ” Listλ‚˜ Setκ³Ό 같은 μ»¬λ ‰μ…˜μ΄λž‘ λΉ„μŠ·ν•œ κ°œλ…μ΄μ§€λ§Œ, ν•„μš”ν•œ 값을 ν•˜λ‚˜μ”© κ³„μ‚°ν•˜λŠ” 지연(lazy) 처리λ₯Ό ν•©λ‹ˆλ‹€.
    • μš”κ΅¬λ˜λŠ” 연산을 μ΅œμ†Œν•œμœΌλ‘œ μˆ˜ν–‰
    • λ¬΄ν•œμ •μ΄ 될 κ°€λŠ₯μ„± 쑴재
    • λ©”λͺ¨λ¦¬ μ‚¬μš©μ΄ 효율적
  • !μ½”ν‹€λ¦°μ—μ„œλŠ” μ‹œν€ΈμŠ€λ³΄λ‹€ 더 쒋은 κ°œλ…μΈ flow builderλ₯Ό μ œκ³΅ν•˜μ§€λ§Œ, 이해λ₯Ό μœ„ν•΄μ„œ μ‹œν€€μŠ€μ˜ κ°œλ…μ„ λ¨Όμ € ν•™μŠ΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

순차적 계산과 λ°˜ν™˜

val seq = sequence {
    yield(1)
    yield(2)
    yield(3)
}

fun main() {
    for (num in seq) {
        print(num)
    }
}
  • μœ„ μ½”λ“œμ— μ‚¬μš©λœ sequence ν•¨μˆ˜λŠ” DSL μ½”λ“œμž…λ‹ˆλ‹€.
  • 인자둜 μˆ˜μ‹  객체 지정 λžŒλ‹€ ν•¨μˆ˜(yield)λ₯Ό λ°›κ³  μžˆμŠ΅λ‹ˆλ‹€.
    • DSL : Domain-Specific Language둜 νŠΉμ • 도메인에 νŠΉν™”λœ μ–Έμ–΄λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
      • λ„λ©”μΈμ˜ νŠΉμ„±μ„ 잘 λ°˜μ˜ν•˜μ—¬ κ°„κ²°ν•˜κ³  직관적인 μ½”λ“œκ°€ μž‘μ„± κ°€λŠ₯ν•©λ‹ˆλ‹€.
    • μˆ˜μ‹  객체 지정 λžŒλ‹€ : Kotlin의 κΈ°λŠ₯ 쀑 ν•˜λ‚˜λ‘œ ν•¨μˆ˜ λ¦¬ν„°λŸ΄ λ‚΄λΆ€μ—μ„œ μˆ˜μ‹  객체의 멀버에 직접 μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.
fun recyclerView(block: RecyclerView.() -> Unit): RecyclerView {
    val recyclerView = RecyclerView(context)
    recyclerView.block() // μˆ˜μ‹  객체 지정 λžŒλ‹€ 호좜
    return recyclerView
}

fun main() {
    val recyclerView = recyclerView {
        layoutManager = LinearLayoutManager(context)
        adapter = MyAdapter(myDataSet)
        addItemDecoration(DividerItemDecoration(context, LinearLayoutManager.VERTICAL))
    }
}
  • μ—¬κΈ°μ„œ μ€‘μš”ν•œ 점은 μˆ«μžκ°€ 미리 μƒμ„±λ˜λŠ” λŒ€μ‹ , ν•„μš”ν•  λ•Œλ§ˆλ‹€ μƒμ„±λœλ‹€λŠ” νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

μ‹œν€ΈμŠ€ λΉŒλ” λ‚΄λΆ€ ꡬ쑰 확인

  • μ‹œν€ΈμŠ€ λΉŒλ” λ‚΄λΆ€, μ‹œν€ΈμŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” κ³³μ—μ„œ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•˜λ©΄ μ΄λŸ¬ν•œ μž‘λ™ 방식을 μ‰½κ²Œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
val seq = sequence {
    println("Generating 1")
    yield(1)
    println("Generating 2")
    yield(2)
    println("Generating 3")
    yield(3)
    println("Generating end")
}

fun main() {
    for (num in seq) {
        print("next number is $num")
    }
}
// Generating 1
// next number is 1
// Generating 2
// next number is 2
// Generating 3
// next number is 3
// Generating end
  • μ—¬κΈ°μ„œ 반볡문과 λ‹€λ₯Έ μ°¨μ΄λŠ”, λ‹€λ₯Έ 숫자λ₯Ό μ°ΎκΈ° μœ„ν•΄μ„œ λ©ˆμ·„λ˜ λΆ€λΆ„μ—μ„œ λ‹€μ‹œ μ‹€ν–‰λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
  • 쀑단 μ²΄μ œκ°€ μ—†λ‹€λ©΄ ν•¨μˆ˜κ°€ 쀑간에 λ©ˆμ·„λ‹€κ°€, λ‹€μ‹œ λ‚˜μ€‘μ— μ€‘λ‹¨λœ μ§€μ μ—μ„œ λ‹€μ‹œ μ‹€ν–‰ν•˜λŠ” 것은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.
  • main ν•¨μˆ˜μ™€ μ‹œν€ΈμŠ€ μ œλ„ˆλ ˆμ΄ν„°κ°€ λ²ˆκ°ˆμ•„κ°€λ©΄μ„œ μ‹€ν–‰λ˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
  • μ–΄λ–€ 지점이든 상관없이 μ‹œν€ΈμŠ€ μ œλ„ˆλ ˆμ΄ν„°μ—μ„œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ λΉŒλ” ν•¨μˆ˜μ˜ 이전 μ§€μ μœΌλ‘œ λŒμ•„κ°€ λ‹€μŒ 값을 μƒμ„±ν•©λ‹ˆλ‹€.
  • μ΄λŠ” μ½”λ£¨ν‹΄μ˜ μ‹€ν–‰ 예λ₯Ό DSL을 ν™œμš©ν•˜μ—¬ μ²΄ν—˜ν•˜κ³  있으며, μŠ€λ ˆλ“œμ—μ„œλŠ” 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ 큰 λΉ„μš©μ„ μ†Œλͺ¨ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ‹œν€ΈμŠ€ λΉŒλ”μ™€ 쀑단 ν•¨μˆ˜

  • μ€‘μš”ν•œ 점은 μ‹œν€ΈμŠ€ λΉŒλ”λŠ” λ°˜ν™˜μ΄ μ•„λ‹Œ 쀑단 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆλ©λ‹ˆλ‹€.
  • 쀑단이 ν•„μš”ν•˜λ‹€λ©΄ ν”Œλ‘œμš° λ₯Ό ν™œμš©ν•΄μ•Ό ν•˜λ©°, μ‹œν€ΈμŠ€ λΉŒλ”μ™€ λΉ„μŠ·ν•˜μ§€λ§Œ ν”Œλ‘œμš°λŠ” μ—¬λŸ¬κ°€μ§€ 코루틴 κΈ°λŠ₯을 μ§€μ›ν•©λ‹ˆλ‹€.
  • μ‹œν€ΈμŠ€ λΉŒλ” λ‚΄λΆ€μ—μ„œ 쀑단 연산을 ν˜ΈμΆœν•  수 μ—†λŠ” μ΄μœ λŠ” SequenceScope에 Restricts Suspension μ–΄λ…Έν…Œμ΄μ…˜μ΄ λ‚΄μž₯λ˜μ–΄ 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
  • ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ€ 쀑단 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 것을 ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

https://m.yes24.com/Goods/Detail/123034354

 

μ½”ν‹€λ¦° 코루틴 - 예슀24

μ½”ν‹€λ¦° μ „λ¬Έ 강사가 μ•Œλ € μ£ΌλŠ” μ½”ν‹€λ¦° 코루틴에 λŒ€ν•œ λͺ¨λ“  것!μ½”ν‹€λ¦° 코루틴은 효율적이고 μ‹ λ’°ν•  수 μžˆλŠ” λ©€ν‹°μŠ€λ ˆλ“œ ν”„λ‘œκ·Έλž¨μ„ μ‰½κ²Œ κ΅¬ν˜„ν•  수 있게 ν•΄ μ£Όμ–΄ μžλ°” 가상 λ¨Έμ‹ (JVM), 특히 μ•ˆλ“œλ‘œ

m.yes24.com