참조: https://proandroiddev.com/kotlin-scope-and-extension-functions-b35925ec96b7
계속 이해가 안됐는데, 저 글을 읽으니 이해가 간다.

let
nullable. 이건 다들 잘 알고 있을 듯
nullable?.let { Log.i("###", "not null") }
apply
생성한 object의 property를 바꿀 때
val textView = TextView(this) .apply { text = "hello" }
also
생성한 object와 무관한 코드 호출
val textView = TextView(this) .also { Log.i("###", "text view created") }
also에는 ?.let{}
의 else 에 해당하는 부분을 사용할 수도 있다.
var name: String? = null name?.let { Log.i("###", "not null") } ?: also { Log.e("###", "null") }
with
해당 object의 여러 작업 실행
with(service) { connect(); sendData(data); disconnect() }
run
위의 것들로 다 커버가 되니 사용하지 말라고 한다. 하지만 클래스 생성 후 also 에서 새로운 작업을 해도 리턴되는 클래스 타입은 생성된 클래스인데, run을 사용하면 run 안에서 만들어진 내용이 리턴된다.