TIL 230816 - Scope Functions

장재용·2023년 8월 15일

TIL

목록 보기
21/32

Scope Functions

객체를 사용할 때 객체 내부에 임시로 Scope를 만들어 편리한 작성을 도와주는 Kotlin 표준 라이브러리
이 Scope 내에서는 객체 이름을 직접 사용하지 않고 it, this를 사용해 접근 가능하다.

1. let

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

T는 수신 객체를 의미
block: 내부는 람다함수 소스코드

let은 수신객체(T)를 람다의 파라미터로 전달
let은 수신객체가 it이다.

    var result = strNum?.let {
        // 중괄호 안에서는 it으로 활용함
        Integer.parseInt(it)
    }

2. with

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

with는 이미 생성된 객체에 일괄적인 작업을 하는데 유용하다.
this를 이용해 객체 그 자체를 참조하기에 this를 생략할 수 있다.
수신객체 자체를 람다의 수신객체로 전달

with(hyeon9mak) {
    this.isCool = true
    this.isAwesome = true
    this.koreanName = “현구막"
}

3. also

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

수신객체를 람다의 파라미터로 전달
it으로 자기 객체를 전달하고 객체를 반환한다.
also는 추가적인 작업을 수행할때 주로 사용한다.

apply와 유사한데 also는 객체를 파라미터로 전달하기에 it으로 참조하고
apply는 넘겨주지 않기에 this를 이용해 참조한다.

people.first()
    .also {
        println("이메일 길이: ${it.email.length}")
        println("현재 나이: ${it.age}")
    }.increaseAge()

4. apply

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

객체 생성시점에 초기화할 때 주로 사용된다.
수신 객체 자체를 람다의 수신객체로 전달
this를 사용

val hyeon9mak = Person(
    email = "jinha3507@gmail.com",
    age = 28,
).apply { name = "현구막" }

5. run

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

객체를 생성하거나 사용하는 시점에 다양한 작업을 수행시킨 후 결과를 반환받고 싶을 때 사용한다.

위와 같이 단독으로 사용하는 버전과 extension func으로 사용하는 버전이 있는데 주로 후자가 사용된다.
extension func은 객체를 생성하는 시점에 사용가능하기에 객체를 변수로 할당할 필요 없이 원하는 값만 바로 반환받을 수 있다.

val person = Person.withDefaultName()
val nameDoubleLength = person.run { name.length * 2 }

val nameDoubleLength = Person.withDefaultName()
    .run { name.length * 2 }

참고 블로그
https://hyeon9mak.github.io/using-kotlin-scope-function-correctly/

profile
enjoy_error_message!

0개의 댓글