코틀린에서 제공하는 여러 함수들 중 유용하게 사용할 수 있는 함수들이다.
let()
은 함수를 호출하는 객체를 이어지는 블록의 인자로 넘기고, 블록의 결과값을 반환한다.
fun<T, R> T.let(block: (T) -> R): R
함수를 호출한 객체를 인자로 받으므로, 이를 사용하여 다른 메소드를 실행하거나 연산을 수행해야 하는 경우 사용할 수 있다.
val padding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
16f, resources.displayMetrics).toInt()
setPadding(padding, 0, padding, 0)
위의 코드를 let()을 사용하여 간략하게 작성하면:
TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
16f, resources.displayMetrics).toInt().let { padding ->
setPadding(padding, 0, padding, 0)
}
var obj: String? = "Hello"
if (obj != null) {
println("null이 아니에요~")
}
obj?.let {
println("null이 아니에요~")
}
let()을 이용한 코드는 obj가 null이 아닐 경우 작업을 수행하는 코드이다.
apply()는 함수를 호출하는 객체를 이어지는 블록의 리시버로 전달하고, 객체 자체를 반환한다.
fun T.apply(block: T.() -> Unit): T
특정 객체를 생성하면서 함께 호출해야 하는 초기화 코드가 있는 경우 사용할 수 있다.
val param = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT).apply {
gravity = Gravity.CENTER_HORIZONTAL
weight = 1f
topMargin = 100
bottomMargin = 100
}
run() 함수는 인자가 없는 익명 함수처럼 동작하는 형태와 객체에서 호출하는 형태 두 가지가 있다.
인자가 없는 익명 함수처럼 사용하는 경우
어떤 값을 계산할 필요가 있거나 지역변수의 범위를 제한하기 위해 사용한다.
fun <R> run(block: () -> R): R
객체에서 run() 함수를 호출하는 경우
호출하는 객체를 이어지는 블록의 리시버로 전달하고, 블록의 결과값을 반환한다.
fun <T, R> T.run(block: T.() -> R): R
객체에서 이 함수를 호출하는 경우, 특정 객체의 메소드나 필드를 연속적으로 호출하거나 값을 할당할 때 사용한다.
supportActionBar?.run {
setDisplayHomeAsUpEnabled(true)
setHomeAsUpIndicator(R.drawable.ic_clear_white)
}
with() 함수는 인자로 받는 객체를 이어지는 블록의 리시버로 전달하며, 블록의 결과값을 반환한다.
fun <T, R> with(receiver: T, block: T.() -> R): R
run() 함수와 기능이 거의 동일하며, 리시버로 전달할 객체가 어디에 위치하는지만 다르다.
supportActionBar?.let {
with(it) {
setDisplayHomeAsUpEnabled(true)
setHomeAsUpIndicator(R.drawable.ic_clear_white)
}
}
코틀린의 범위 지정 함수인 let(), apply(), run(), with()는 코드의 가독성을 높이고, 불필요한 변수를 줄이며, 안전한 호출을 가능하게 한다. 각 함수의 특성을 이해하고 상황에 맞게 사용하는 것이 중요하다.