❮
[Kotlin] Scope Functions - let, run, with, apply, also
20200301
공식 문서
객체의 context 안에서 코드 블록을 실행하는 함수.
5개가 조금씩 다르다.
이런 자바 코드가 있다.
StringBuilder builder = new StringBuilder();
builder.append("content: ");
builder.append(builder.getClass().getCanonicalName());
out.println(builder.toString()); // content: java.lang.StringBuilder
코틀린으로 똑같은 일을 하는 코드를 작성해보자.
Also
StringBuilder().also {
it.append("content: ")
it.append(it.javaClass.canonicalName)
}.print() // content: java.lang.StringBuilder
Apply
StringBuilder().apply {
append("content:")
append(javaClass.canonicalName)
}.print() // content: java.lang.StringBuilder
let
StringBuilder().let {
it.append("content: ")
it.append(it.javaClass.canonicalName)
}.print()
run
StringBuilder().run {
append("content: ")
append(javaClass.canonicalName)
}.print()
with
with(StringBuilder()) {
append("content: ")
append(javaClass.canonicalName)
}.print()
함수 | context 객체 레퍼런스 | 리턴 값 | Is extension function |
let | it | Lambda result | Yes |
run | this | Lambda result | Yes |
run | - | Lambda result | No: 객체 없이 동작 |
with | this | Lambda result | No: 객체를 매개변수로 넣는다. |
apply | this | Context object | Yes |
also | it | Context object | Yes |
- Executing a lambda on non-null objects:
let
- Introducing an expression as a variable in local scope:
let
- Object configuration:
apply
- Object configuration and computing the result:
run
- Running statements where an expression is required: non-extension
run
- Grouping function calls on an object:
with
객체 레퍼런스 : this 또는 it
람다 안에서 실제 레퍼런스 이름을 대신하는 대명사. this(람다 리시버) 또는 it(람다 매개변수) 형태가 된다.
this는 객체 함수나 속성을 다룰 때 주로 사용한다.
it 은 함수 호출에서 인수로 주로 사용된다.
리턴 값 : context 객체 또는 람다
apply 와 also 는 context 객체 자체를 리턴하기 때문에 체인 콜이 가능하다.
let, run, with은 리턴 값이 필요없거나 변수에 람다 결과식을 할당하거나 하는 경우에 사용한다.