❮
[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은 리턴 값이 필요없거나 변수에 람다 결과식을 할당하거나 하는 경우에 사용한다.