코틀린은 수신 객체를 명시하지 않고 람다의 본문 안에서 다른 객체의 메소드를 호출할 수 있게 하는 기능을 지원한다 → 수신 객체 지정 람다 (=범위 지정 함수)
각 함수들은 비슷 비슷하게 보이기에 헷갈리기 마련이지만, 다행히 ‘Kotlin’ 공식 문서에서 각 람다마다 사용하기 좋은 상황들을 제시하고 있다.
apply, with, let, also, run에 대해 알아보자
먼저 각 함수들의 구현과 특징, 사용 예제 및 사용처에 대해 알아보자
public inline fun <T> T.apply(block: T.() -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
return this
}
수신 객체에 대한 확장 함수 형태이며, 파라미터는 객체 지정 람다 block
이다.
⇒ 수신 객체의 확장 함수(암시적 전달)
⇒ 수신 객체를 람다에 암시적 전달
람다 내부에서 this
키워드를 통해 수신 객체에 접근 가능 → 생략 가능
반환 값은 수신 객체
<aside> 💡 수신 객체 람다 내부에서 수신 객체의 함수를 사용하지 않고, 프로퍼티만 사용/수정하며, 수신 객체 자신을 다시 반환 하려는 경우에 사용 ⇒ 객체의 초기화
</aside>
사용 예제
val adam = Person("Adam").apply {
age = 32
city = "London"
}
println(adam)
public inline fun <T, R> T.run(block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
수신 객체에 대한 확장 함수 형태이며, 파라미터는 객체 지정 람다 block
이다.
⇒ 수신 객체의 확장 함수(암시적 전달)
⇒ 수신 객체를 람다에 암시적 전달
람다 내부에서 this
키워드를 통해 수신 객체에 접근 가능 → 생략 가능
반환 값은 람다 식의 본문에 있는 식의 마지막 값(람다의 결과)이다.