[Kotlin]코틀린 기본 개념 정리-1.apply, also, let, run, with

코틀린의 apply, also, let, run, with

메소드 정의

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// apply
inline fun <T> T.apply(block: T.() -> Unit): T {
block()
return this
}
// also
inline fun <T> T.also(block: (T) -> Unit): T {
block(this)
return this
}
// let
inline fun <T, R> T.let(block: (T) -> R): R {
return block(this)
}
// run
inline fun <T, R> T.run(block: T.() -> R): R {
return block()
}
// with
inline fun <T, R> with(receiver: T, block: T.() -> R): R {
return receiver.block()
}

with, also, apply, let, run 은 아래의 3 가지 차이점 중 1 가지가 서로 다릅니다.

  • 범위 지정 함수 의 호출시에 수신 객체가 매개 변수로 명시적으로 전달되거나 수신 객체의 확장 함수로 암시적 수신 객체 로 전달된다.
  • 범위 지정 함수 의 수신 객체 지정 람다 에 전달되는 수신 객체가 명시적 매개 변수 로 전달 되거나 수신 객체의 확장 함수로 암시적 수신 객체로 코드 블록 내부로 전달 된다.
  • 범위 지정 함수의 결과로 수신 객체를 그대로 반환하거나 수신 객체 지정 람다 의 실행 결과를 반환한다.

각 메서드 설명

apply

수신 객체 람다 내부에서 수신 객체의 함수를 사용하지 않고 수신 객체 자신을 다시 반환 하려는 경우에 apply 를 사용합니다.
수신 객체 의 프로퍼티 만을 사용하는 대표적인 경우가 객체의 초기화 이며, 이곳에 apply 를 사용합니다.

also

수신 객체 람다가 전달된 수신 객체를 전혀 사용 하지 않거나 수신 객체의 속성을 변경하지 않고 사용하는 경우 also 를 사용합니다.
also 는 apply 와 마찬가지로 수신 객체를 반환 하므로 블록 함수가 다른 값을 반환 해야하는 경우에는 also 를 사용할수 없습니다.
예를 들자면, 객체의 사이드 이팩트를 확인하거나 수신 객체의 프로퍼티에 데이터를 할당하기 전에 해당 데이터의 유효성을 검사 할 때 매우 유용합니다.

let

수신 객체의 객체를 블록의 인자로 넘기고 블록의 결과값을 반환합니다.
null 체크 후 코드를 실행하거나 블록 내의 결과물을 반환하고 싶을경우,
단일 지역 변수의 범위를 제한하고 싶을 경우 사용됩니다.

run

어떤 값을 계산할 필요가 있거나 여러개의 지역 변수의 범위를 제한하려면 run 을 사용합니다.
매개 변수로 전달된 명시적 수신객체 를 암시적 수신 객체로 변환 할때 run ()을 사용할수 있습니다.

with

안전한 호출(?.)을 지원하지 않고 Non-nullable (Null 이 될수 없는) 수신 객체 이고 결과가 필요하지 않은 경우에만 with 를 사용합니다.