일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 안드로이드
- 부스트코스에이스
- 막내의막무가내 안드로이드 에러 해결
- 막내의막무가내
- Fragment
- 안드로이드 sunflower
- 안드로이드 Sunflower 스터디
- 막내의막무가내 안드로이드 코틀린
- 막무가내
- 막내의막무가내 일상
- 막내의막무가내 rxjava
- 부스트코스
- 막내의막무가내 SQL
- 주엽역 생활맥주
- 막내의막무가내 코틀린 안드로이드
- 막내의 막무가내
- 막내의 막무가내 알고리즘
- 프로그래머스 알고리즘
- 막내의막무가내 안드로이드
- 막내의막무가내 알고리즘
- 2022년 6월 일상
- 막내의막무가내 코볼 COBOL
- 막내의막무가내 프로그래밍
- 주택가 잠실새내
- flutter network call
- 막내의막무가내 코틀린
- 막내의막무가내 목표 및 회고
- 막내의막무가내 플러터
- 막내의막무가내 플러터 flutter
- 프래그먼트
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[안드로이드] 코틀린 범위 지정 함수, 고차 함수 (let, apply, with, run) 본문
[안드로이드] 코틀린 범위 지정 함수, 고차 함수 (let, apply, with, run)
막무가내막내 2019. 11. 20. 00:55
[2021-04-13 업데이트]
출처 :커니의 코틀린(강추!)
밑 링크에 예제를 좀 더 자세히 포스팅 했습니다. 참고해주세요 :)
https://youngest-programming.tistory.com/578
let()
fun <T,R> T.let(block: (T) -> R) : R
이 함수를 호출하는 객체를 이어지는 함수형 인자 block의 인자로 전달하며, block 함수의 결과를 반환한다.
ex)
fun letEx(str : String?){
if(null != str){
println(str)
}
}
=>
fun letEx(str : String?){
str?.let{
print(it)
}
}
이 함수를 호출한 객체를 이어지는 함수 블록이 인자로 전달됩니다. 이 함수를 사용하면 불필요한 변수 선언을 방지할 수 있습니다.
apply()
fun<T> T.apply(block: T.() -> Unit): T
이 함수를 호출하는 객체를 이어지는 함수형 인자 block의 리시버로 전달하며, 함수의 호출한 객체를 반환합니다.
ex)
val param = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT)
param.weight = 1f
param.padding = 16
=>
val param = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT).apply{
weight = 1f
padding = 16
}
이 함수를 호출한 객체를, 이어지는 함수 블록의 리시버로 전달합니다. 함수를 호출한 객체를 함수형 인자 블록의 리시버로 전달하므로, 이 블록 내에서는 해당 객체 내의 프로퍼티나 함수를 직접 호출 할 수 있습니다. 따라서 객체 이름을 일일이 명시하지 않아도 되므로 코드를 간략하게 만드는데 큰 도움이 됩니다.
with()
fun<T,R> with(receiver: T, block: T.() -> R):R
인자로 받은 객체 receiver를 이어지는 함수형 인자 block의 리시버로 전달하며, block 함수의 결과를 반환한다.
ex)
fun exWith(textView : TextView){
with(textView){
text = "Change Text"
gravity = Gravity.CENTER
}
}
인자로 받은 객체를 이어지는 함수 블록의 리시버로 전달합니다. let(), apply() 함수와 달리 이 함수에서 사용할 객체를 매개변수를 통해 받습니다. 따라서 안전한 호출을 사용하여 인자로 전달되는 객체가 널 값이 아닌 경우 함수의 호출 자체를 막는 방법을 사용할 수 없으므로 널 값이 아닌 것으로 확인된 객체에 이 함수를 사용하는 것을 권장합니다.
val animal: Animal = Person("Lion", "5")
with(animal) {
println(type) //animal.type
print;n(age) //animal.age
}
run()
fun <R> run(block:() -> R): R
함수형 인자 block을 호출하고 그 결과를 반환한다.
ex)
val sum = {
//블록 내부 선언한 값들은 외부에 노출되지 않는다.
val a = 3
val b = 5
//계산된 값을 반환해서 sum에 저장된다.
a + b
}
인자가 없는 익명 함수처럼 사용하는 형태와 객체에서 호출하는 형태를 제공합니다.
전자의 경우 복잡한 계산을 위해 여러 임시 변수가 필요할 때 유용하게 사용할 수 있습니다. 왜냐하면 run() 함수 내부에서 선언되는 변수들은 블록 외부에 노출되지 않으므로 변수 선언 영역을 확실하게 분리가 가능합니다.
후자의 경우는 with()함수와 유사한 목적으로 사용할 수 있습니다. run() 함수는 안전한 호출을 사용할 수 있으므로 널 값일 수 있는 객체의 속성이나 함수에 연속적으로 접근해야 할 때 사용합니다.
P.S
제가 이해하기 쉬웠던 예제입니다.
댓글과 공감은 큰 힘이 됩니다. 감사합니다. !!
'안드로이드 > 코틀린 & 아키텍처 & Recent' 카테고리의 다른 글
[안드로이드] Kotlin Architecture Components (안드로이드 코틀린 아키텍처 구성요소) (1) | 2020.02.22 |
---|---|
[안드로이드] Kotlin - Databinding, LiveData, viewModel (0) | 2020.02.16 |
[안드로이드] json to kotlin data class ( json을 코틀린 data class 로 변환해주는 플러그인) (2) | 2020.01.25 |
[안드로이드] 코틀린 스트림 함수 정리 (0) | 2019.11.20 |
[안드로이드] MVP 디자인패턴 정리 및 예제 (0) | 2019.08.23 |