[Kotlin] Scope Function

wujin·2024년 7월 17일

Kotlin의 Scope Function란?

  • Kotlin의 Scope Function은 객체의 컨텍스트 내에서 특정 작업을 수행할 수 있게 해주는 고유한 함수
  • 코드를 더 간결하게 하고 가독성을 높이며, 명확한 의도로 코드 블록을 실행
  • 그들 중 일부는 람다 표현식이 제공되고, 임시 스코프가 형성된다.
  • 객체의 이름을 사용하지 않고 객체에 접근이 가능
FunctionObject referenceReturn valueIs extension function
letitLambda resultYes
runthisLambda resultYes
run-Lambda resultNo: called without the context object
withthisLambda resultNo: takes the context object as an argument
applythisObject referenceYes
alsoitObject referenceYes

추가 설명

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

1. let

  • 객체를 생성하거나 사용하는 시점에 다양한 작업을 수행
  • 주로 nullable 객체를 처리하거나 특정 연산을 임시로 수행하고 싶을 때
  • 블록 내에서 객체를 it로 참조하며, 블록의 결과값을 반환
val str: String? = "Hello, World!"
val length = str?.let {
    println(it) // "Hello, World!" 출력
    it.length   // 블록의 결과: 13
}

2. run

inline fun <R> run(block: () -> R): R
inline fun <T, R> T.run(block: T.() -> R): R
  • 객체를 생성하거나 사용하는 시점에서 여러 작업을 순차적으로 수행시킨 후 결과를 반환
  • 블록 내에서 객체를 this로 참조하며, 블록의 결과값을 반환
val result = "Hello".run {
    println(this) // "Hello"를 출력
    length        // 블록의 결과: 5
}

3. with

inline fun <T, R> with(receiver: T, block: T.() -> R): R
  • 객체를 인자로 받아 여러 연산을 수행
  • run과 유사하지만, 확장 함수가 아니며 객체를 직접 인자로 받음
  • 블록 내에서 객체를 this로 참조하며, 블록의 결과값을 반환
val person = Person("John", 25)
val info = with(person) {
	name = "kopring"
    age = "24"
	"Name: $name, Age: $age"
}
// info = "Name: kopring, Age: 24"

4. apply

inline fun <T> T.apply(block: T.() -> Unit): T
  • 객체에 무언가를 적용하려 할때 사용
  • 코드 블록이 모두 수행된 후 인스턴스가 할당되기 때문에 apply는 객체 생성 시점에서 초기화를 할 때 유용
  • 블록 내에서 객체를 this로 참조하며, 블록 실행 후 객체 자체를 반환
val person = Person().apply {
	name = "John"
    age = 25
}
// person은 설정된 객체 자체이다.

5. also

inline fun <T> T.also(block: (T) -> Unit): T
  • 객체에게 명령을 내리기 직전에 추가적인 작업을 함께 수행시키고 싶은 경우 사용
  • 주로 디버깅, 로그 출력 등을 추가할 때 사용
  • 블록 내에서 객체를 it로 참조하며, 블록 실행 후 객체 자체를 반환
val str = "Hello".also {
    println(it) // "Hello"를 출력
}

참고 자료

https://hyeon9mak.github.io/using-kotlin-scope-function-correctly/

0개의 댓글