다시 고등학생이 된 기분입니다. let, also, with 등 매우 기초적인 영어 단어를 외우는 기분인데요. 원래는 표준함수로 불리지만 Kotlin에서 고유하게 제공하므로 고유의 표준함수라는 제목을 붙였습니다. 이 함수들을 사용하여 코드를 좀더 최적화 시켜줄 수 있으며 불필요한 코딩량을 줄일 수 있습니다.
let
예제 코드는 다음과 같습니다.
data class WHAT(val name: String, val age: Int)
fun main() {
println("Case 1")
var w: WHAT? = null
val v = w?.let {
println(it)
} ?: "Known"
println(v)
println("Case 2")
var W: WHAT? = WHAT("Dip2K", 43)
val V = W?.let {
println(it)
} ?: "Known"
println(V)
}
결과는 다음과 같다.
Case 1
Known
Case 2
WHAT(name=Dip2K, age=43)
kotlin.Unit
let은 받은 객체(w)를 람다 함수 내부에서 it으로 받아 사용할 수 있습니다. 반환값은 람다 함수의 가장 마지막 코드의 반환값이 됩니다.
also
예제 코드는 다음과 같습니다.
data class WHAT(val name: String, val age: Int)
fun main() {
println("Case 1")
var w: WHAT? = null
val v = w?.also {
println(it)
} ?: "Known"
println(v)
println("Case 2")
var W: WHAT? = WHAT("Dip2K", 43)
val V = W?.also {
println(it)
} ?: "Known"
println(V)
}
결과는 다음과 같다.
Case 1
Known
Case 2
WHAT(name=Dip2K, age=43)
WHAT(name=Dip2K, age=43)
also 함수는 받은 객체를 it으로 받아 사용할 수 있으며, 받은 객체를 그대로 그대로 반환합니다.
apply
예제 코드는 다음과 같습니다.
data class WHAT(var name: String, var age: Int)
fun main() {
val w = WHAT("Jackass", 16)
val r = w.apply {
name = "Dip2K"
age = 43
}
println(w)
println(r)
}
결과는 다음과 같다.
WHAT(name=Dip2K, age=43)
WHAT(name=Dip2K, age=43)
apply는 받은 객체를 람다 함수 내부에서 it이 아닌 this로 처리합니다. 받은 객체를 그대로 반환합니다.
with
예제 코드는 다음과 같습니다.
package with
data class WHAT(var name: String, var age: Int)
fun main() {
val w = WHAT("Jackass", 16)
val r = w?.let {
with(it) {
name = "Dip2K"
age = 43
"Good day!"
}
}
println(w)
println(r)
}
결과는 다음과 같다.
WHAT(name=Dip2K, age=43)
Good day!
with 함수는 인자로 받은 객체를 람다 함수 안에서 this로 사용할 수 있습니다. 반환값은 람다 함수를 구성하는 가장 마지막 코드입니다.
run
예제 코드는 다음과 같습니다.
data class WHAT(var name: String, var age: Int)
fun main() {
val v = run {
val w = WHAT("Jackass", 16)
w
}
println(v)
val vv = v.run {
name = "Dip2K"
age = 43
"Good day !"
}
println(v)
println(vv)
}
결과는 다음과 같다.
WHAT(name=Jackass, age=16)
WHAT(name=Dip2K, age=43)
Good day !
run은 객체를 전달받지 않고 독립적으로 실행하는 경우와 개체를 전달받아 처리하는 경우로 구분됩니다. 객체를 전달받아 처리하는 경우 전달받은 객체를 람다 함수 내부에서 this로 받아 사용할 수 있습니다. 반환값은 람다 함수의 마지막 코드입니다.
use
예제 코드는 다음과 같습니다.
import java.io.File
fun main() {
val f = File("d:/a.txt")
f.bufferedWriter().use {
it.appendln("Hello, GIS Developer.")
it.append("Good Day !")
}
}
use 함수는 전달 받은 객체를 it으로 람다 함수 내부에서 사용하며, 람다 함수 종료시 close 함수를 자동으로 호출해 줍니다.
takeIf, takeUnless
예제 코드는 다음과 같습니다.
data class WHAT(var name: String, var age: Int)
fun main() {
val w = WHAT("Jackass", 16)
val v = w?.takeIf { it.age < 20 }
//val v = w?.takeUnless { it.age >= 20 } <- 위의 코드와 동일함
println(v)
var r = v?.apply {
name = "Dip2K"
}
println(r)
}
결과는 다음과 같다.
WHAT(name=Jackass, age=16)
WHAT(name=Dip2K, age=16)
takeIf 함수는 받은 객체를 람다 함수 내부에서 it으로 처리하며, 반환값이 true일때 받은 객체를 반환하고, false일때 null을 반환합니다.
measureTimeMillis
예제 코드는 다음과 같습니다.
import kotlin.system.measureTimeMillis
fun main() {
val time = measureTimeMillis {
Thread.sleep(10000)
}
println(time)
}
결과는 다음과 같다.
10000
measureTimeMillis은 어떤 코드를 실행하는데 소요되는 시간을 측정하는데 사용됩니다.