[Kotlin] apply, with, let, also, run 사용

언어마다 각자 특색의 lamda 함수가 있다. 이번 글에서는 5개의 lamda 함수가 kotlin에서 어떻게 사용되는지 알아보자

정의

inline fun <T, R> with(receiver: T, block: T.() -> R): R {
    return receiver.block()
}
inline fun <T> T.also(block: (T) -> Unit): T {
    block(this)
    return this
}
inline fun <T> T.apply(block: T.() -> Unit): T {
    block()
    return this
}
inline fun <T, R> T.let(block: (T) -> R): R {
    return block(this)
}
inline fun <T, R> T.run(block: T.() -> R): R {
    return block()
}

정의에서 보면 5개 함수가 거의 비슷한것을 알 수 있다. 그럼 실제 사용 예제를 통해 사용하는 경우에 대해 알아보자. 아래 다룰 내용은 kotlin 오피셜에서 권장하는 내용이다.

apply

함수 내부에서 수신 결체에 대하여 수정해야 할 경우에 사용

val peter = Person().apply {
    name = "Pet"
    age = 19
}

also

수신 격체를 변경하지 않고 내용만 사용할 때 주로 사용합니다. 예를 들어 print 혹은 객체 속성 체크 등등 있습니다.

class Book(author: Person) {
    val author = author.also {
      requireNotNull(it.age)
      print(it.name)
    }
}

let

null 값이 아닌경우 실행할 코드가 있을경우 많이 사용한다.

getNullablePerson()?.let {
    promote(it)
}

with

결과가 필요하지 않을경우 사용한다. 즉 수신 객체를 사용만 할 경우

val person: Person = getPerson()
with(person) {
    print(name)
    print(age)
}

run

계산에 필요한 값들을 임시로 사용하고 사용범위를 제한하려고 할때 사용된다.

val inserted: Boolean = run {
    val person: Person = getPerson()
    val personDao: PersonDao = getPersonDao()
    personDao.insert(person)
}

여기까지 kotlin의 람다식의 사용법에 대해 알아 보았는데요. 정리는 했지만 체감은 되지 않네요. 추후 프로젝트 적용 시에 다시 한번 정리하는걸로 합시다.

 

reference:

https://medium.com/@limgyumin/%EC%BD%94%ED%8B%80%EB%A6%B0-%EC%9D%98-apply-with-let-also-run-%EC%9D%80-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%EA%B0%80-4a517292df29

 

코틀린 의 apply, with, let, also, run 은 언제 사용하는가?

원문 : “Kotlin Scoping Functions apply vs. with, let, also, and run”

medium.com