[Kotlin] Scope Functions

Chloe Choi·2021년 5월 18일
1

Kotlin

목록 보기
8/11

Scope Functions

코틀린 표준 라이브러리는 Object context 내에서 코드 블록 실행 목적의 여러 함수(apply, also, let, with, run)를 제공함
객체에서 이 함수를 사용하면 임시범위가 형성되며 이름 없이 객체에 접근할 수 있음!

위 다섯 가지 함수는

  • Context object 전달방식
  • Return value
    에 따라 구분됨!


아주 대표적인 표

  • Context object -> receiver로 암시적 전달 / argument로 명시적 전달
  • Return value -> 전달받은 수신객체 / 코드블록의 수행결과
    값을 가질 수 있다!

apply

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

Context object

receiver(this)

Return value

itself(context object)

👉

receiver 객체 멤버에 대한 연산을 하고 코드블럭에 대한 결과를 리턴하지 않아도 되는 경우
ex. 객체의 초기화
👩‍💻 apply the following assignments to the object

also

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

Context object

argument(it)

Return value

itself(context object)

👉

context object를 매개변수로 받아 일부 작업을 수행하는 데 사용
속성/함수가 아닌 객체 자체에 접근이 필요한 경우에 유용! (it을 사용해 접근해야하니까~)
ex. 객체의 사이트이펙트 확인
👩‍💻 and also do the following with the object

let

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

Context object

argument(it)

Return value

lambda result

👉

한 개 이상 펑션의 결과를 call chain에 invoke할 때 사용
지정된 값이 null이 아닌 경우에 코드를 실행해야 하는 경우
단일 지역변수의 범위를 제한하는 경우 -> 새로운 변수를 context object로 정의해(it이 아닌 다른 이름을 붙여줄수도!) 더 읽기 쉽게 함

with

** 확장함수가 아님!

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

Context object

argument(it)

Return value

lambda result

👉

Non-Nullable 수신 객체이고 결과가 필요하지 않은 경우
👩‍💻 with this object, do the following

run

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

Context object

available as a receiver(this)

Return value

lambda result

👉

with랑 비슷한데, let처럼 context object의 확장함수로 동작하는 점이 다름
따라서, 람다식이 object 초기화와 연산을 포함하고 그 결과값을 리턴하는 경우에 유용함
ex. 어떤 값을 계산할 필요가 있거나 여러개의 지역변수의 범위를 제한할 때, 매개변수로 전달된 명시적 수신객체를 암시적 수신객체로 변환할 때
+) non-extension function으로도 사용할 수 있음 -> 객체화 해 여러번 실행하도록 할 수 있음

ref.

https://kotlinlang.org/docs/scope-functions.html#also

profile
똑딱똑딱

0개의 댓글