Android(Kotlin)

Android Kotlin - let, with, run, apply, also

개복치 개발자 2021. 8. 16. 16:13

 매번 공부해야지 하다가 거의 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://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

 

https://blog.yena.io/studynote/2020/04/15/Kotlin-Scope-Functions.html

 

[Kotlin] 코틀린 let, with, run, apply, also 차이 비교 정리

let, with, run, apply, also 코틀린에는 이렇게 생긴 확장함수들이 있다. 객체를 사용할 때 명령문들을 블럭{} 으로 묶어서 간결하게 사용할 수 있게 해주는 함수들이다. 문제는 서로 비슷비슷해서 헷

blog.yena.io

 

'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