코틀린 apply, let, run, with, also 차이점

이창민·2022년 8월 17일
0

코틀린을 사용한지 얼마 지나지 않았다면

let, run ,with, apply, also의 차이점을 잘 모를 수 있다.

이를 정리해보자..

data class Person(var name: String, var age: Int)

위 Person class는 앞으로 나올 예제 코드에서 공통으로 사용한다.

apply

public inline fun <T> T.apply(block: T.() -> Unit): T

apply는 T(수신 객체)의 프로퍼티를 지정할 수 있고 T를 반환합니다.
사용 예제를 보자..

val person = Person().apply {
	name = "LEE"
    age = 20
}

let

public inline fun <T, R> T.let(block: (T) -> R): R

let은 T(수신 객체)를 받아 작업을 한 후 R을 리턴한다.
사용 예제를 보자..

val p = Person("Lee", 20)
val str = person.let {
	it.name = "Kim"
    it.age = 30
    "$it.name is $it.age" // R
}

let은 null 값을 확인하고 사용할 수 있다.

val name = person?. let { it. name } ?: "Null Name"

let 블럭은 null 값이 들어올 수 없기에 위와 같이 elvis 연산자와 같이 사용하여 유용하게 사용할 수 있다.

run

public inline fun <T,R> T.run(block: T() -> R): R

run은 apply와 같이 동작하지만 T(수신 객체를) 리턴하지 않고, run 블록의 마지막 라인을 return 합니다. let과의 차이점은 it을 사용하지 않습니다.
사용 예제를 보자..

val p = Person("LEE", 20)
val world = p.run {
	name = "HELLO"
    "WORLD"
}

run 은 T 없이 사용 가능합니다.

val world = run {
	p.name = "HELLO"
    "WORLD"
}

with

public inline fun <T, R> with(receiver: T, block: T.() -> R): R

with는 run과 마찬가지로 수신객체를 작업한 후 마지막 라인을 return 합니다.
run과의 차이점은 수신 객체를 파라미터로 받습니다.

이런 이유로 run을 사용하는 것이 깔끔해 run을 주로 사용합니다.

val p = Person("LEE", 20)
val world = with(p) {
	println(name)
    println(age)
	"HELLO"	
}

also

public inline fun <T> T.also(block: (T) -> Unit): T

also는 T(수신 객체)의 확장함수이고, apply와 마찬가지로 T를 반환합니다.
also는 블럭 함수로 T를 받아서 it으로 프로퍼티에 접근할 수 있습니다.

val person = Person().also {
	it.name = "LEE"
    it.age = 20
}

참고자료

https://kotlinworld.com/255
https://blog.yena.io/studynote/2020/04/15/Kotlin-Scope-Functions.html

profile
android 를 공부해보아요

0개의 댓글