Kotlin

[Kotlin] Scope Function : apply, run, with, also, let 정리

μœ λž„λΌ- 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

 

λ°˜μ‘ν˜•