매번 공부해야지 하다가 거의 1년 미룬 let, with, run, apply, also에 대해서 알아보겠습니다.
구글 공식 문서나, 예제들을 찾아보다 보면 저 위의 친구들을 자주 만나게 되는데, 이 것들이 뭔지 대충은 알겠는데 설명해보라고 하면 뭐였지.. 라는 상황이 나옵니다. 사실 정리해도 잘 모르겠긴 합니다.
그래서 한번 알아보겠습니다. 맨 밑의 블로그 2개를 많이 참고했습니다.
일단 5개의 함수 정의부터 보겠습니다.
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()
}
이것만 보면 전혀 이해가 가지 않습니다.
그러면 실제 활용 예제와 보는게 가장 이해가 빠르겠죠?
하나씩 살펴보겠습니다.
저는 안드로이드 스튜디오에서 실습을 진행해봤습니다.
우선 data class 하나 만들어 줬구요
1. Let
fun <T, R> T.let(block: (T) -> R): R
이 친구를 살펴보면, 자기 자신을 받아서 블럭 함수의 반환값 R을 반환합니다.
실습 한번 코드로 한번 볼까요?
2. with
fun <T, R> with(receiver: T, block: T.() -> R): R
with의 경우, non-null 객체를 사용하고, 블럭의 return값이 필요하지 않을 때 사용합니다.
3. run
fun <T, R> T.run(block: T.() -> R): R
non-null 일 때 사용할 수 있고, 어떤 값을 계산할 필요가 있거나, 여러 개의 지역변수 범위를 제한할 때 사용합니다.
4. apply
fun <T> T.apply(block: T.() -> Unit): T
run과 유사하지만, 블럭에서 return 값을 받지 않으며 자기 자신을 반환합니다.
5. also
fun <T> T.also(block: (T) -> Unit): T
also는 객체의 데이터 유효성을 확인하거나, 디버그 로깅 등 부가적인 목적으로 사용할 때 적합합니다.
- 참조
https://blog.yena.io/studynote/2020/04/15/Kotlin-Scope-Functions.html
'Android(Kotlin)' 카테고리의 다른 글
Android ViewBinding VS DataBinding (0) | 2021.08.18 |
---|---|
Kotlin lambda (0) | 2021.08.16 |
Kotlin 제네릭(Generic) (1) | 2021.08.16 |
Kotlin 반복문과, 이터레이터(Iterator) (0) | 2021.08.16 |
Android Activity 생명주기(Life Cycle) (0) | 2021.08.12 |