코틀린을 사용한지 얼마 지나지 않았다면
let, run ,with, apply, also의 차이점을 잘 모를 수 있다.
이를 정리해보자..
data class Person(var name: String, var age: Int)
위 Person class는 앞으로 나올 예제 코드에서 공통으로 사용한다.
public inline fun <T> T.apply(block: T.() -> Unit): T
apply는 T(수신 객체)의 프로퍼티를 지정할 수 있고 T를 반환합니다.
사용 예제를 보자..
val person = Person().apply {
name = "LEE"
age = 20
}
public inline fun <T, R> T.let(block: (T) -> R): R
let은 T(수신 객체)를 받아 작업을 한 후 R을 리턴한다.
사용 예제를 보자..
val p = Person("Lee", 20)
val str = person.let {
it.name = "Kim"
it.age = 30
"$it.name is $it.age" // R
}
let은 null 값을 확인하고 사용할 수 있다.
val name = person?. let { it. name } ?: "Null Name"
let 블럭은 null 값이 들어올 수 없기에 위와 같이 elvis 연산자와 같이 사용하여 유용하게 사용할 수 있다.
public inline fun <T,R> T.run(block: T() -> R): R
run은 apply와 같이 동작하지만 T(수신 객체를) 리턴하지 않고, run 블록의 마지막 라인을 return 합니다. let과의 차이점은 it을 사용하지 않습니다.
사용 예제를 보자..
val p = Person("LEE", 20)
val world = p.run {
name = "HELLO"
"WORLD"
}
run 은 T 없이 사용 가능합니다.
val world = run {
p.name = "HELLO"
"WORLD"
}
public inline fun <T, R> with(receiver: T, block: T.() -> R): R
with는 run과 마찬가지로 수신객체를 작업한 후 마지막 라인을 return 합니다.
run과의 차이점은 수신 객체를 파라미터로 받습니다.
이런 이유로 run을 사용하는 것이 깔끔해 run을 주로 사용합니다.
val p = Person("LEE", 20)
val world = with(p) {
println(name)
println(age)
"HELLO"
}
public inline fun <T> T.also(block: (T) -> Unit): T
also는 T(수신 객체)의 확장함수이고, apply와 마찬가지로 T를 반환합니다.
also는 블럭 함수로 T를 받아서 it으로 프로퍼티에 접근할 수 있습니다.
val person = Person().also {
it.name = "LEE"
it.age = 20
}
https://kotlinworld.com/255
https://blog.yena.io/studynote/2020/04/15/Kotlin-Scope-Functions.html