코틀린 표준 라이브러리는 객체의 context
내에서 코드 블록을 실행하는 것을 목적으로 하는 몇 가지 함수들이 있다. 객체에서 이러한 함수들을 호출하게 되면 임시 범위가 된다.
fun <T> T.apply(block: T.() -> Unit): T
apply
는 T 를 수신기로 사용하고 반환값이 자기 자신인 T 다. 또한 apply
는 블럭 함수의 입력을 람다 리시버로 받았기 때문에 블럭 안에서 객체의 property
를 호출할 때 it
이나 this
를 사용하지 않아도 된다.
//apply 를 사용하는 경우
val adam = Person("Adam").apply {
age = 32
city = "London"
}
println(adam)
//apply 를 사용하지 않는 경우
val adam = Person()
adam.age = 32
adam.city = "London"
apply
는 객체의 함수를 사용하지 않고 자기 자신을 다시 반환할 때 사용되기 때문에 주로 객체의 초기화나 변경 할 때 사용한다.
fun <T,R> with(receiver: T, block: T.() -> R): R
with
은 객체가 인수로 전달되고 람다 내부에서 수신기로 사용할 수 있다.
//예제1
val numbers = mutableListOf("one", "two", "three")
with(numbers) {
println("'with' is called with argument $this")
println("It contains $size elements")
}
예제1
에서 with
으로 numbers
를 받으면 바로 리스트에 접근할 수 있게 된다.with
은 non-null 객체를 사용하고 블럭의 반환값이 필요하지 않을 때 사용된다.
fun <T, R> T.let(block: (T) -> R): R
let
은 T
의 확장함수이며 객체를 it
으로 사용할 수 있고 반환값은 람다 식의 결과다.
//Person(name, age)
val person = Person("", 0)
val resultIt = person.let {
it.name = "han"
it.age = 25
it //(T) -> R 에서 반환값이 R을 나타낸다.
}
val resultStr = person.let {
it.name = "kwan"
it.age = 24
"{$name is $age}" //(T) -> R 에서 반환값이 R을 나타낸다.
}
println("$resultIt") //Person(name=han, age=25)
println("$resultStr") //kwan is 24
let
함수를 사용해서 위와 같이 객체의 상태를 변경할 수 있다.
val name = person?.let { it.name} ?: "이름없음"
let
은 T?.let { }
형태로 블럭 안을 non-null 인지 확인할 수 있으므로 아주 유용하다. 객체를 선언할 때는 ?:
를 사용하여서 null이라면 초기화를 시켜줄 수 있다.
fun <T> T.also(block: (T) -> Unit): T
also
는 T
의 확장함수이며 객체를 it
으로 사용할 수 있다. 반환값은 객체 자체다.
val numbers = mutableListOf("one", "two", "three")
numbers
.also {
println("The list elements before adding new one: $it")
}
.add("four")
also
는 객체의 속성을 전혀 사용하지 않거나 변경하지 않고 사용하는 경우에 사용된다.
fun <T, R> T.run(block: T.() -> R): R
run
은 객체를 수신기로 사용할 수 있으며 반환값을 람다식의 결과다.
val person = Person("han" , 25)
val nextAge = person.run{
age++
}
println($nextAge)
// 26
run
은 값을 계산할 때나 여러 개의 지역변수 범위를 제한할 때 사용한다.
참고자료: