스코프 함수에 대해 알아보자
Scope function(let, with, run, apply, also)
를 이용하게 되면 일시적으로 Scope가 생기고 이 범위 안에서는 전달된 객체를 it
or this
라는 Context Object에 접근하게 된다.
with, also, run, apply, let
의 스코프 함수는 동일한 역할을 수행하지만 차이점이 존재한다.
매개변수 block: T.() -> R
에서 ->
를 기준으로 우측에 있는 값(R) 은 함수의 반환값을 뜻한다. 람다 함수는 return을 명시하지 않고 맨 마지막 값이 반환값을 뜻한다.
따라서, run() 함수도 block 반환하는 값과 동일한 자료형 R 을 반환하기에 block이 반환하는 값을 얻을 수 있다.
run() 함수는 람다 함수의 맨 마지막 값이 반환 값이 된다.
fun main (args : Array<String>){
val result = User().run {
printName()
printAge()
age = 30
"Run Return Result"
}
println("Result: $result")
}
class User{
var name : String = "jms8732"
var age : Int = 10
fun printName(){
println("Name: $name")
}
fun printAge(){
println("Age: $age")
}
}
간단한 run() 에 관련된 예제이다.
코드를 돌려보면 알 수 있듯 Result은 "Run Return Result"를 출력한다.
반환값을 보면 run() 함수와 다르게 객체 (this) 자체를 반환하는 것을 알 수 있다.
fun main(args : Array<String>){
val result = User().apply {
printAge()
printName()
age = 20
}
println("Result: $result")
}
result는 User 객체인 것을 확인할 수 있다.
fun main(args : Array<String>){
val user = User()
val result = with(user){
printAge()
printName()
3 + 4
}
println("Result: $result")
}
Result의 값은 7이 출력되는 것을 알 수 있다.
run() 함수처럼 람다 함수의 결과값을 반환하지만 Context를 참조하기 위해 this 대신 it을 사용한다.
fun main(args: Array<String>) {
val result = User().apply {
age = 25
name = "james"
}.let {
letPrintlnTest(it)
letPrintlnTest1(it)
3 + 4
}
println("Result: $result")
}
fun letPrintlnTest(user: User) {
println("User info: ${user.name}, ${user.age}")
}
fun letPrintlnTest1(user : User){
println("User info1: ${user.name}, ${user.age}")
}
let() 함수를 사용하는 방법을 살펴보면 객체를 설정한다기 보다는 객체를 사용한다는 것에 초점이 있는 느낌이 들었다.
fun main(args : Array<String>){
val user = User().also {
it.printAge()
it.printName()
}
println("User: $user")
}