ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] Scope Function : apply, run, with, also, let 정리
    Kotlin 2023. 5. 28. 23:53
    λ°˜μ‘ν˜•

    πŸ”Ž Scope function λž€?

    제곡된 λžŒλ‹€ 식이 μžˆλŠ” κ°μ²΄μ—μ„œ μ΄λŸ¬ν•œ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ μž„μ‹œ λ²”μœ„κ°€ ν˜•μ„± λ˜λŠ”λ°, 이 λ²”μœ„ λ‚΄μ—μ„œλŠ” 이름 없이 κ°œμ²΄μ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    즉 νŠΉμ • λ²”μœ„ {} μ•ˆμ—μ„œ νŠΉμ • 객체λ₯Ό this λ‚˜ it 을 톡해 μ ‘κ·Ό 및 μ‘°μž‘μ΄ κ°€λŠ₯ν•œ ν•¨μˆ˜μž…λ‹ˆλ‹€.

    scope function은 μ½”λ“œλ₯Ό 더 κ°„κ²°ν•˜κ³  읽고 μ‰½κ²Œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

     

    scope function 은 두가지 ꡬ성 μš”μ†Œλ‘œ 이루어져 μžˆλŠ”λ° μˆ˜μ‹  객체(receiver) 와 μˆ˜μ‹  객체 지정 λžŒλ‹€ μž…λ‹ˆλ‹€.

    μ—¬κΈ°μ„œ μˆ˜μ‹  κ°μ²΄λŠ” ν™•μž₯ ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” λŒ€μƒμ΄ λ˜λŠ” 객체 μž…λ‹ˆλ‹€.

    μˆ˜μ‹  객체 지정 λžŒλ‹€λŠ” λ‚˜λ¨Έμ§€ κ΅¬μ„±μš”μ†ŒμΈ block λΆ€λΆ„ μž…λ‹ˆλ‹€.

     

    μ΄λŸ¬ν•œ ν•¨μˆ˜λŠ” 총 5κ°€μ§€λ‘œ apply, run, with, also, let κ°€ μžˆμŠ΅λ‹ˆλ‹€.

    apply, run, with, also, let λŠ” 맀우 λΉ„μŠ·ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

    ν•¨μˆ˜ 객체 μ°Έμ‘° return κ°’
    apply this 객체 자체
    run this λžŒλ‹€ κ²°κ³Ό
    with this λžŒλ‹€ κ²°κ³Ό
    also it 객체 자체
    let it λžŒλ‹€ κ²°κ³Ό

     

    μ˜λ„λœ λͺ©μ μ— λ”°λ₯Έ μ‚¬μš©μ„ μœ„ν•œ κ°„λ‹¨ν•œ Guide!

    1. null 이 μ•„λ‹Œ κ°μ²΄μ—μ„œ λžŒλ‹€ μ‹€ν–‰ν•  λ•Œ : let

    2. 둜컬 λ²”μœ„μ—μ„œ λ³€μˆ˜λ‘œ ν‘œν˜„μ‹ ν•„μš”ν•  λ•Œ : let

    3. 객체 ꡬ성할 λ•Œ : apply

    4. 객체 κ΅¬μ„±ν•˜κ³  및 κ²°κ³Ό 계산할 λ•Œ : run

    5. ν‘œν˜„μ‹μ΄ ν•„μš”ν•œ μ‹€ν–‰ λ¬Έ : λΉ„ν™•μž₯ run

    6. μΆ”κ°€νš¨κ³Ό : also

    7. 객체에 λŒ€ν•œ ν•¨μˆ˜ 호좜 κ·Έλ£Ήν™” : with

     

    πŸͺ„ 1. apply : 객체 ꡬ성할 λ•Œ 

    inline fun <T> T.apply(block: T.() -> Unit): T

    context object - receiver(this) 둜 μ‚¬μš©ν•  수 μžˆλ‹€. ( T.() λŠ” νŒŒλΌλ―Έν„°κ°€ μ—†μ–΄μ„œ this 만 전달 )

    return - 객체 자체

     

    μ˜ˆμ‹œ)

    // apply λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ„ λ•Œ
    val person = Person()
    person.name = "yura"
    person.job = "developer"
    
    
    // apply 적용
    val person = Person().apply{
    	name = "yura"
    	job = "developler"
    }

     

    πŸͺ„ 2. run  : 객체 κ΅¬μ„±ν•˜κ³  및 κ²°κ³Ό 계산할 λ•Œ

    inline fun <T, R> T.run(block: T.() -> R): R

    context object - recevier(this) 둜 μ‚¬μš©ν•  수 μžˆλ‹€.  ( T.() λŠ” νŒŒλΌλ―Έν„°κ°€ μ—†μ–΄μ„œ this 만 전달 )

    return - λžŒλ‹€ κ²°κ³Ό κ°’

    val person = Person("yura", "developer", 25)
    // run 적용
    val nextAge = person.run{
    	age++
    }
    println(nextAge) //26

     

    πŸͺ„ 3. with : null 이 될 수 μ—†λŠ”(non-null) μˆ˜μ‹  객체이고 κ²°κ³Όκ°€ ν•„μš”ν•˜μ§€ μ•ŠλŠ” κ²½μš°μ— μ‚¬μš©ν•œλ‹€.

    inline fun <T, R> with(receiver: T, block: T.() -> R): R

    context object - recevier(this) 둜 μ‚¬μš©ν•  수 μžˆλ‹€. ( T.() λŠ” νŒŒλΌλ―Έν„°κ°€ μ—†μ–΄μ„œ this 만 전달 )

    return - λžŒλ‹€ κ²°κ³Ό κ°’

    val person = Person("yura", "developer")
    
    // with λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ„ λ•Œ
    println(person.name)
    println(person.job)
    
    
    // with 적용
    with(person) {
    	println(name)
    	println(job)
    }

     

    πŸͺ„ 4. also : μˆ˜μ‹  객체의 속성을 및 κΈ°λŠ₯을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  μ°Έμ‘°κ°€ ν•„μš”ν•œ μž‘μ—…μ— μ‚¬μš©

    inline fun <T> T.also(block: (T) -> Unit): T

    context object - 인자 ( it )

    return - 객체 그자체

    val person = Person("yura", "developer")
    
    val info = person.also{
    	println(it.name)
    }

     

    πŸͺ„ 5. let : 둜컬 λ²”μœ„μ—μ„œ λ³€μˆ˜λ‘œ ν‘œν˜„μ‹μ΄ ν•„μš”ν•  λ•Œ  or  null 이 아닐 λ•Œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•΄μ•Όν•  경우(?.) 

    inline fun <T, R> T.let(block: (T) -> R): R

    context object - 인자 ( it )

    return - λžŒλ‹€ κ²°κ³Όκ°’

    val person: Person? = Person("yura", "developer")
    val result = person?.let{
        "{$name is $job}"
    }
    
    println(result) //yura is developer

     

     

     

    https://kotlinlang.org/docs/scope-functions.html#functions

     

    Scope functions | Kotlin

     

    kotlinlang.org

     

    λ°˜μ‘ν˜•

    'Kotlin' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

    [Kotlin] Generic μ œλ„€λ¦­μ΄λž€?, variance : in, out  (0) 2023.06.08
Designed by Tistory.