다시 고등학생이 된 기분입니다. 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은 어떤 코드를 실행하는데 소요되는 시간을 측정하는데 사용됩니다.