6월 18일 - 범위지정함수

Yullgiii·2024년 6월 18일
0
post-thumbnail

범위 지정 함수

코틀린에서 제공하는 여러 함수들 중 유용하게 사용할 수 있는 함수들이다.

let()

let()은 함수를 호출하는 객체를 이어지는 블록의 인자로 넘기고, 블록의 결과값을 반환한다.

fun<T, R> T.let(block: (T) -> R): R

사용 예

함수를 호출한 객체를 인자로 받으므로, 이를 사용하여 다른 메소드를 실행하거나 연산을 수행해야 하는 경우 사용할 수 있다.

예제 1: 불필요한 선언 방지

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)
}

예제 2: Null 유효성 검사 대체

var obj: String? = "Hello"

if (obj != null) {
    println("null이 아니에요~")
}

obj?.let {
    println("null이 아니에요~")
}

let()을 이용한 코드는 obj가 null이 아닐 경우 작업을 수행하는 코드이다.

apply()

apply()는 함수를 호출하는 객체를 이어지는 블록의 리시버로 전달하고, 객체 자체를 반환한다.

fun T.apply(block: T.() -> Unit): T

사용 예

특정 객체를 생성하면서 함께 호출해야 하는 초기화 코드가 있는 경우 사용할 수 있다.

예제: LayoutParams 초기화

val param = LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.WRAP_CONTENT).apply {
    gravity = Gravity.CENTER_HORIZONTAL
    weight = 1f
    topMargin = 100
    bottomMargin = 100
}

run()

run() 함수는 인자가 없는 익명 함수처럼 동작하는 형태와 객체에서 호출하는 형태 두 가지가 있다.

인자가 없는 익명 함수처럼 사용하는 경우
어떤 값을 계산할 필요가 있거나 지역변수의 범위를 제한하기 위해 사용한다.

fun <R> run(block: () -> R): R

객체에서 run() 함수를 호출하는 경우
호출하는 객체를 이어지는 블록의 리시버로 전달하고, 블록의 결과값을 반환한다.

fun <T, R> T.run(block: T.() -> R): R

사용 예

객체에서 이 함수를 호출하는 경우, 특정 객체의 메소드나 필드를 연속적으로 호출하거나 값을 할당할 때 사용한다.

예제: ActionBar 속성 변경

supportActionBar?.run {
    setDisplayHomeAsUpEnabled(true)
    setHomeAsUpIndicator(R.drawable.ic_clear_white)
}

with()

with() 함수는 인자로 받는 객체를 이어지는 블록의 리시버로 전달하며, 블록의 결과값을 반환한다.

fun <T, R> with(receiver: T, block: T.() -> R): R

사용 예

run() 함수와 기능이 거의 동일하며, 리시버로 전달할 객체가 어디에 위치하는지만 다르다.

예제: ActionBar 속성 변경

supportActionBar?.let {
    with(it) {
        setDisplayHomeAsUpEnabled(true)
        setHomeAsUpIndicator(R.drawable.ic_clear_white)
    }
}

So...

코틀린의 범위 지정 함수인 let(), apply(), run(), with()는 코드의 가독성을 높이고, 불필요한 변수를 줄이며, 안전한 호출을 가능하게 한다. 각 함수의 특성을 이해하고 상황에 맞게 사용하는 것이 중요하다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글