Kotlin 고유의 표준함수 (let, also, apply, with, run, …)

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

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다