[Kotlin] Scope Function

kldaji·2021년 9월 5일
0

서론

이번 포스팅에서는 let, also, with, run, apply 와 같은 scope functionusage convention 에 대해 알아볼 것이다.

본론

Context Object

본격적으로 Scope Function 에 대해 알아가기 앞서 Context Object 라는 this (lambda receiver) 와 it(lambda argument) 에 대해 짚고 넘어가고자 한다.
먼저 thisrun, with, apply 함수에 쓰이며, 주로 객체의 속성이나 메서드에 접근할 때 사용되고 생략이 가능하다.
itlet, also 함수에 쓰이며, 주로 함수 호출의 인자로 쓰인다.

also

public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }

also 함수는 "너 할일해. 난 그냥 반환할께." 라는 의미의 동작을 하는 함수로 "and also do the following with the object." 의 의미로 해석하는게 이해해 도움이 될 수 있을 것이다.

let

public inline fun <T, R> T.let(block: (T) -> R): R { ... return block(this) }

let 함수는 "너가 한일은 결과와 함께 반환해." 라는 의미의 동작을 하는 함수로 연속적으로 함수를 호출하는 call chain 에 유용하게 사용되어 진다. 또한 non-null 값에 대해서만 실행할 수 있는 환경을 제공해주고, it 대신에 개발자가 직접 name 을 지정해줌으로써 코드의 가독성을 높일 수 있다.

with

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

with 함수는 "난 단독으로 실행되 반환하는 녀석이지" 라는 의미의 동작을 하는 함수로 반환값 없이 사용할 때에는 "with this object, do the following." 의 의미로 이해하는게 좀 더 쉽게 이해할 수 있다. 반환값이 있을 때에는 주로 수신자로 들어오는 인자에 대한 설명에 사용된다.

run

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

run 함수는 "그냥 실행하고 결과를 반환" 이라는 의미의 동작을 하는 함수로 with 함수와 거의 동일한 동작을 하지만, let 의 기능 또한 내포하고 있다. 주로 initializationcomputation 을 동시에 실행할 때 사용된다. run 함수는 non-extension function 으로도 쓰이는데 여러 줄의 코드 실행 시에 사용된다.

apply

public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }

apply 함수는 "널 확장 시켜놓고 난 반환한다." 라는 의미의 동작을 하는 함수로 주로 수신자 객체의 member 에 접근할 때 사용된다. "apply the following assignments to the object." 의 의미로 쉽게 이해할 수 있다.

결론

추가적으로 takeIf, takeUnless 에 대해 간략히 살펴보자.

public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T?
  = if (predicate(this)) this else null

위의 코드에서 쉽게 파악할 수 있듯이 takeIf 의 경우 lambda 식이 true 이면 수신자 객체를 반환하고 false 이면 null 을 반환한다. (takeUnless 는 반대 동작이다.)

이처럼 코틀린의 Scope Function 에 대해 알아보았는데, 이해를 돕기 위한 예시는 아래 공식 홈페이지에서 참고하는 것을 추천한다. 필자는 해당 함수들에 usage 를 중점적으로 다루고자 했고 실제 사용에 대해서는 좀 더 연습이 필요하다는 것을 느끼게 되었다.

오늘은 코틀린의 Scope Function 에 대해 알게되었으니 오늘도 필자는 성장했다.

Reference

Kotlin Scoping Function

profile
다양한 관점에서 다양한 방법으로 문제 해결을 지향하는 안드로이드 개발자 입니다.

0개의 댓글