Android Kotlin Scope functions

사용 언어: Kotlin 1.9.20
사용 버전: Kotlin Playground

안드로이드 코틀린 Scope functions를 알아보겠습니다.

Scope(스코프) 함수들은 코틀린 기본 라이브러리에 들어있는 순전히 블록을 실행하기 위해 만들어진 함수들입니다.
이 scope 안에서는 object(객체) 이름 없이 접근할 수 있습니다.
5개의 scope 함수가 있습니다.
let, run, with, apply, also가 있습니다.


출처:
https://kotlinlang.org/docs/scope-functions.html


이 다섯 가지 함수들은 기본적으로 블록을 실행하는 공통점이 있지만, 내부에서 어떻게 object를 사용 가능한지와 어떠한 값을 반환하는지 등의 동작이 다릅니다.






간단하게 줄여서 설명하면 이렇습니다.





• null이 아닌 값을 실행하려면 let

• 로컬 범위에서 변수로 표현식을 소개할 때 let

• Object의 세부 설정 apply

• Object의 세부 설정 및 결과를 계산할 때 run

• 표현식이 필요한 곳에서 문을 실행할 때 non-extension run

• 추가적인 효과가 필요할 때 also

• 한 Object에서 여러 함수를 부를 때 with





위의 let, apply, run, also, with는 this와 it으로 해당 context object를 참조할 수 있는데요.

this는 lambda receiver이고, it은 lambda argument입니다.



this는 생략이 가능하고 바로 method나 property를 사용할 수 있습니다.

그래서 외부의 함수인지 변수인지 구분하기 어렵기 때문에 될 수 있으면 Lambda(람다) 안에는 object와 관련된 작업을 하는 게 좋습니다.






it은 lambda argument(전달 인자)입니다. 그래서 object가 함수의 인자로 사용되거나 많은 변수를 다룰 때 사용하면 좋습니다.






세부적으로 각 함수들을 들여다봅시다.



let입니다.

it으로 다루고 lambda result를 반환합니다.









let 적용 전과 적용 후입니다. 따로 변수를 하나 더 만들 필요가 없습니다.







또한, let의 다른 기능으로는 safe call operator와 함께 사용할 때, not null로 다룰 수 있게 합니다.







with입니다.

context object를 this로 사용 가능하고 lambda result를 반환합니다.

with에는 반환값을 사용할 필요 없는 함수들을 부르는 것을 추천합니다.











run입니다.

this로 context object를 사용하고 lambda result를 반환합니다.

run은 with와 비슷하지만 확장 함수라는 점에서 다릅니다.

run은 object를 초기화하고 계산하여 반환할 때 사용하면 좋습니다.










또한, run을 확장 함수가 아니게 사용할 수 있습니다. 이때는 context object를 전달받지 않습니다. 하지만 lambda result를 여전히 반환합니다. code block을 실행하고 반환 값을 계산할 때 사용합니다.








apply입니다.

context object를 this로 사용하고, object 자신을 반환합니다.

코드 블록에서 값을 반환하지 않고 단지 object member들을 다룰 때 사용하면 좋습니다.

대부분의 사용 사례는 object의 설정을 바꿀 때입니다.









복잡한 사용을 위해 apply 안에 apply을 사용할 수도 있습니다.





also입니다.

context object를 it으로 다루고, object 자체를 반환합니다.

context object를 argument로 사용해야 하는 작업을 하는데 유용합니다.

보통 context object의 properties와 함수를 사용하기보다는 object 자체를 사용하는 용도로 사용됩니다.

또는 밖의 this와 중복되는 this 사용을 피하기 위해 사용합니다.









마지막으로 takeIf와 takeUnless를 알아보고 마치겠습니다.

object의 상태를 확인할 때 사용합니다.

TakeIf는 predicate가 참이면 object를 반환하고 아니면 null을 반환합니다. 그래서 하나의 object를 위한 함수입니다.


takeUnless는 TakeIf의 반대입니다. takeUnless는 predicate가 참이면 null을 반환하고, 아니면 object를 반환합니다.

그리고 lambda 내부의 object는 it으로 사용 가능합니다.








아래는 예시입니다.





takeIf와 let을 함께 사용한 예시입니다.

아래는 takeIf를 사용하지 않은 예시입니다.






끝.


카테고리: Android


댓글

이 블로그의 인기 게시물

Python OpenCV 빈 화면 만들기

Python urllib.parse.quote()

Python bytes.fromhex()

Android AVD Ram size change

Forensics .pyc 파일 .py로 복구하기

Android Minimum touch target size

KiCad 시작하기 7 (FreeRoute 사용하기 2)

Android Notification with Full Screen

C++ OpenCV 모폴로지 침식, 팽창

KiCad 시작하기 2 (PCB 만들기)