let
호출하는 객체의 값을 block에 전달하고 block의 결과값을 반환
fun <T, R> T.let(block: (T) -> R): R
사용 예
한번쓰고 나서 사용하지 않을 변수가 있을 때 let을 사용하면 불필요한 선언을 방지해준다.
val test = Test()
setTest(test)
//let 사용
Test().let{
setTest(it)
}
safe-calls 와 결합하여 null check에 사용할 수 있다.
var obj:String? = null
if(obj != null){
...
}
//let 사용 obj가 null이 아닐경우 실행
obj?.let{
...
}
apply
함수를 호출하는 객체를 이어지는 block의 리시버를 전달하고, 객체자체를 반환
리시버란?
이어지는 block 내에서 메서드 및 속성에 바로 접근할 수 있는 객체
fun <T> T.apply(block: T.() -> Unit): T
사용 예
특정 객체를 생성하면서 함께 초기화를 해야하는 작업이 있을 경우
val param = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT)
param.gravity = Gravity.CENTER_HORIZONTAL
param.weight = 1f
param.topMargin = 100
param.bottomMargin = 100
//apply 적용
val param = LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.WRAP_CONTENT).apply{
gravity = Gravity.CENTER_HORIZONTAL
weight = 1f
topMargin = 100
bottomMargin = 100
}
Run
run은 인자가 없이 호출되는 형태와 객체에서 호출하는 형태 2가지가 있습니다.
1.
fun <R> run(block: () -> R): R
객체없이 run을 호출하면 익명함수처럼 동작하게 만들수 있습니다. 이어지는 block 내에서 처리할 작업들을 넣을 수 있으며, 함수처럼 값을 반환하거나 Unit을 반환할수 있습니다.
2.
fun <T, R> T.run(block: T.() -> R): R
apply와 동작이 매우 비슷하지만, apply는 새로운 생성이 생성되는 시점에서 연속된 접근이 있을 때이지만 run은 이미 생성된 객체에 연속된 작업이 있을 때 사용됩니다.
2의 사용 예
override fun onCreate(savedInstanceState: Bundle?) {
supportActionBar?.run{
setDisplayHomeAsUpEnabled(true)
setHomeAsUpIndicator(R.drawable.ic_clear_white)
}
}
run 함수도 safe-calls와 결합하여 사용할 수 있습니다.
with
with은 run과 동작이 거의 유사하며 리시버의 위치만 다릅니다.
fun <T, R> with(receiver: T, block: T.() -> R): R
run함수는 편리하게 사용되기 위해 let과 with을 합쳐놓은 상태로 보면 됩니다.
supportActionBar?let{
with(it){
setDisplayHomeAsUpEnabled(true)
setHomeAsUpIndicator(R.drawable.ic_clear_white)
}
}
반응형
'Language > kotlin' 카테고리의 다른 글
[Kotlin] Enum의 새로운 values Function 등장, entries (0) | 2024.05.05 |
---|---|
[Kotlin] 데이터 표현을 위한 Data Object (0) | 2024.03.26 |
[Kotlin] Singleton (0) | 2020.06.01 |
[Kotlin] - 기본문법 2 (0) | 2020.02.10 |
[Kotlin] Kotlin을 왜 배워야 할까요? (0) | 2020.02.10 |