본문 바로가기

Kotlin

Kotlin Scope Function(apply, with, let, also, run)

728x90

Scope Function은 코드를 읽기 쉽게 만들어주는 것에 강점을 지니고 있습니다.

 

property

자바의 private String x을 코틀린에선 프로퍼티라고 합니다. val 프로퍼티, var 프로퍼티가 있습니다.

 

Function literal with receiver

receiver는 메시지 수신자에 해당합니다. 즉, 해당 메소드를 가지는 인스턴스로 코드에서 this, it 등을 통해 함수 내에서 자기자신 의미한다고 생각하면 됩니다.   

Literal은 코드 수준에서의 최소화된 값의 표기라고 볼 수 있습니다. 즉, 정수 53등을 나타내는 것이죠.

 

종합하자면, 리시버를 가진 함수 리터널이란 말 그대로 리시버를 포함하고 있는 람다 또는 익명 함수 형식을 뜻한다는 것 입니다.

 

fun main(args: Array<String>) {
    100.gon {
        print(it)
    }
    100.gon2 {
        print(this)
    }
}
fun Int.gon(block: (it: Int) -> Unit) = block(this)
fun Int.gon2(block: Int.() -> Unit) = block()

 

 

apply

객체의 확장 함수이고, 블럭 함수를 Literal Function Receiver로 받기 때문에 this를 통해 내부에서 객체에 접근이 가능하며 this는 생략이 가능합니다.

반환값으로 자기자신을 반환하므로 객체 프로퍼티에 접근이 가능하고 반환값이 자기 자신이기 때문에 주로 객체를 초기화할 때 사용됩니다.

 

val peter = Person().apply {
    // apply 블록에선 오직 프로퍼티만 사용합니다!
    name = "Peter"
    age = 18
}

 

Also

T(객체)가 파라미터로 전달되며, 람다의 입력값으로 전달받고 it으로 접근이 가능, 반환은 해당 객체를 반환합니다. 주로 유효성 확인, 디버깅 용도로 사용

 

let

람다로 전달된 값이 null이면 실행하지않고, null 아니면 실행하는 것이죠. 

전달받은 객체의 상대를 변경할 수 있습니다

블럭 내부의 코드값이 반환됩니다.

 

with

with는 주로 전달받은 객체의 함수를 여러 개 호출할 때 그룹화하는 용도로 활용된다.반복되는 코드를 줄이는 용도 등으로 쓰일 수 있다.

 

run

객체를 초기화하고 바로 값을 계산할 필요가 있거나 여러 개의 지역변수 범위를 제한할 때 사용하며, 이 함수는 어떤 객체를 생성하기 위한 명령문을 블럭 안에 묶음으로써 가독성을 높이는 역할을 한다.