본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

run()에 대하여


run() 함수는 두 가지 형태로 사용 된다. 람다를 실행하고 그 결과값을 얻는 목적으로 사용하거나 객체의 멤버에 접근하기 위해 사용한다. run 함수의 매개변수에 함수 타입이 선언되어 있으므로 람다 함수를 전달해 사용하면 된다.


fun main(args: Array<String>) {
//아래 result1의 결과는 "ktko"
var result1: String = run {
"ktko"
}

//아래 result2의 결과는 30
var result2: Int = run {
10 + 20
}

var ktko1 = User("ktko", 31)
println("${ktko1.toString()}")

var ktko2 = ktko1.run {
name = "kkt"
age = 30
}

println("${ktko2.toString()}")
println("${ktko1.toString()}")
}

data class User(var name: String, var age: Int) {
fun sayHello() = println("Hello $name")
fun sayAge() = println("age = ${age}")
}


실행 결과


User(name=ktko, age=31)
kotlin.Unit
User(name=kkt, age=30)

run 함수의 반환값은 전달한 라마 함수의 반환값이다. 따라서 run 함수의 람다 함수의 마지막 줄이 반환값임을 알고 있어야 한다.ktko2 변수의 값은 그래서 Unit이 된다.


apply()에 대하여


apply는 run과 비교하여 반환하는 값의 차이가 있다. run 함수는 전달받은 람다 함수의 반환값을 그대로 반환하지만 apply는 apply함수를 적용한 객체를 반환한다.

아래 예제에서 User객체를 apply를 적용하였더니 User객체가 ktko2변수에 적용됨을 알 수 있다. 또한 변수명만 다를 뿐 같은 객체임을 알 수 있다.(println을 보면 알 수 있다.)


fun main(args: Array<String>) {
var ktko1 = User("ktko", 31)

println("${ktko1.toString()}")

var ktko2 = ktko1.apply {
name = "kkt"
age = 30
}

println("${ktko1.toString()}")
println("${ktko2.toString()}")

}

data class User(var name: String, var age: Int) {
fun sayHello() = println("Hello $name")
fun sayAge() = println("age = ${age}")
}


실행 결과


User(name=ktko, age=31)
User(name=kkt, age=30)
User(name=kkt, age=30)


let()에 대하여 


let() 함수는 자신을 호출한 객체를 매개변수로 전달받은 람다 함수에 매개 변수로 전달하는 함수이다. 그리고 람다 함수의 반환값을 let()함수의 반환값으로 그대로 전달해 준다.


fun main(args: Array<String>) {
var ktko1 = User("ktko", 31)
testLetFunction(ktko1)
}

fun testLetFunction(user: User) {
println("${user.name}:::${user.age}")
}

data class User(var name: String, var age: Int) {
fun sayHello() = println("Hello $name")
fun sayAge() = println("age = ${age}")
}


 실행 결과


ktko:::31


위의 예제를 let()을 사용하여 쉽고 간결하게 만들 수 있다.


fun main(args: Array<String>) {
var ktko1 = User("ktko", 31)
ktko1.let{ user -> testLetFunction(user)}
ktko1.let{ testLetFunction(it)}
User("ktko", 31).let{ testLetFunction(it)}
}


let함수는 짧께 이용하기 위한 변수 선언을 줄이고자 할 때 사용된다.(잘 모르겠지만 나는 잘 안 쓸듯 하다..)


with()에 대하여


with() 함수는 run()과 사용 목적이 유사하다. 한 객체의 멤버에 반복해서 접근할 때 객체명을 일일히 명시하지 않고 멤버에 바로 접근하려는 용도이다. run과의 차이점이라면 run은 자신을 호출한 객체를 이용하지만 with 함수는 매개변수로 지정한 객체를 이용한다.


fun main(args: Array<String>) {
var ktko = User("ktko", 31)
println("${ktko.toString()}")

var ktko1 = ktko.run {
name = "kkt"
sayHello()
}
println("${ktko.toString()}")
println("${ktko1.toString()}")

var ktko2 = with(ktko) {
name = "ktko"
age = 31
}
println("${ktko.toString()}")
println("${ktko2.toString()}")
}

data class User(var name: String, var age: Int) {
fun sayHello() = println("Hello $name")
fun sayAge() = println("age = ${age}")
}


실행 결과


User(name=ktko, age=31)
Hello kkt
User(name=kkt, age=31)
kotlin.Unit
User(name=ktko, age=31)
kotlin.Unit