이번 포스팅에서는 let
, also
, with
, run
, apply
와 같은 scope function
의 usage convention
에 대해 알아볼 것이다.
본격적으로 Scope Function
에 대해 알아가기 앞서 Context Object
라는 this
(lambda
receiver) 와 it
(lambda
argument) 에 대해 짚고 넘어가고자 한다.
먼저 this
는 run
, with
, apply
함수에 쓰이며, 주로 객체의 속성이나 메서드에 접근할 때 사용되고 생략이 가능하다.
it
은 let
, 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
의 기능 또한 내포하고 있다. 주로 initialization
과 computation
을 동시에 실행할 때 사용된다. 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
에 대해 알게되었으니 오늘도 필자는 성장했다.