개발을 하다 보면 특정 객체에 있는 함수를 연속해서 사용하거나, 다른 함수의 인자로 전달하기 위해 변수를 선언하고 이를 다른 곳에서는 사용하지 않는 경우가 있습니다. 코틀린에서는 이러한 경우 유용하게 사용할 수 있는 함수를 표준 라이브러리를 통해 제공합니다.
fun <T, R> T.let(bloock: (T) -> R):R
let() 함수를 사용하면 불필요한 변수 선언을 방지할 수 있습니다. 커스텀 뷰를 작성하다 보면 길이를 계산 값을 변수에 저장해 두고, 이를 함수 호출 시 인자로 전달하는 경우가 흔합니다.
람다식의 인자가 한 개일 경우, 인자 이름을 생략하고 it을 사용하여 코드를 간략하게 할 수 있습니다
fun doSomething(message:String){
//인자로 받은 message가 널이 아닌 경우에만 토스트로 메시지로 표싷합니다.
message?.let{
Toast.makeText(this, it, Toast.LENGTH_SHORT).show()
}
}
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.bottomMargain = 100
apply() 함수를 사용하면 이를 다음과 같이 바꿀 수 있습니다.
apply() 함수에 이어지는 블록에 param 객체를 리시버로 전달하므로, 객체 이름없이 직접 해당 객체 내부의 속성에 접근 가능합니다.
val param = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT).apply{
gravity = Gravity.CENTER_HORIZONTAL
weight = 1f
topMargin = 100
bottomMargain = 100
}
fun <R> run (block: () -> R):R
fun <T,R> T.run(block: T.() -> R): R
override fun onCreate(savedInstanceState: Bundle?) {
...
supportActionBar?.run {
setDisplayHomeAsUpEnabled(true)
setHomeAsUpIndicator(R.drawable.ic_clear_white)
}
...
}
fun <T,R> with(receiver: T, block: T.() -> R):R
인자로 받은 객체 receiver를 이어지는 함수형 인자 block의 리시버로 전달하며, blcok 함수의 결과를 반환합니다.
with() 함수는 let(), apply() 함수와 다르게 이 함수에서 사용할 객체를 매개변수를 통해 받습니다.
fun mainpulate(messageView: TextView){
// 인자로 받은 messageView의 여러 속성을 변경합니다.
with(messageView){
text = "Hello, World"
gravity = Gravity.CENTER_HORIZONTAL
}
}
출처