범위 지정 함수(let, apply, with, run, also)

|

범위 지정 함수

범위 지정 함수는 중괄호({ })로 묶여 있는 부분에 전체적으로 적용되는 함수이며, 코틀린에서는 let, apply, with, run, also 등과 같은 함수들을 제공하고 있습니다.

이 함수들은 전부 비슷한 기능을 하며, 사용법 또한 비슷합니다.


let

let은 함수를 호출한 객체를 이어지는 블록의 매개변수로 전달하는 역할을 합니다.

함수의 정의는 다음과 같이 되어 있습니다.

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


예를 들면 다음과 같은 코드를 작성할 수 있습니다.

fun sample(message:String) {
    message.let {
        Log.i("message: $it")
    }
}

message라는 매개변수를 let으로 다음 블럭에 넘기고, 그 안에서는 it 키워드를 이용해서 message를 사용할 수 있습니다.

다음과 같이 ? 키워드와 같이 사용해서 Null Check 용도로도 사용할 수 있습니다.

fun sample(message:String?) {
    message?.let {
        Log.i("message: $it")
    }
}


apply

applylet과 사용법은 비슷하지만 블럭으로 넘긴 매개변수가 it이 아니라 this라는 점에서 차이가 있습니다.

함수의 정의는 다음과 같습니다.

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


private val timelineGuideLinePaint = Paint()

timelineGuideLinePaint.apply {
    color = context.getColor(R.color.colorTimelineGuideLine)
    style = Paint.Style.STROKE
    pathEffect = DashPathEffect(floatArrayOf(20F, 10F), 20F)
    strokeWidth = 1f
}


with

withapply와 비슷한 용도로 사용됩니다. 다만, with는 인자를 가지며, 해당 인자를 다음 함수 블럭으로 전달합니다.

함수 정의는 다음과 같습니다.

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


fun sample() {
    with(textView) {
        text = "hello, snowdeer"
    }
}


run

run 함수는 인자없이 사용하는 익명 함수처럼 사용하는 방법과 객체에서 호출하는 형태를 제공하고 있습니다.

함수 정의는 다음과 같습니다.

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

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


val result = run {
    val a = getResult(100, 50)
    val b = getResult(1000, 2000)
    
    a + b
}

fun printName(person: Person) = person.run {
    print("${person.name}")
}

run 내부에서 선언되는 변수들은 블록 외부에 노출되지 않기 때문에 변수 영역을 명확하게 분리할 수 있습니다