Effective Kotlin - apply, run, with에 대해서

JINHO LEE·2024년 7월 1일
0

아이템 15: 리시버를 명시적으로 참조하라에서 나온 용어

otlin에서 apply, with, run 함수는 객체의 컨텍스트 내에서 코드를 실행하기 위해 사용되는 스코프 함수다. 각 함수는 약간의 차이가 있으며, 특정 상황에 따라 적절하게 사용할 수 있다.

apply 함수

apply 함수는 주어진 객체를 초기화하거나 설정할 때 유용하다. 이 함수는 객체의 컨텍스트 내에서 코드를 실행하고, 객체 자신을 반환한다.

특징

  • 리시버 객체의 컨텍스트에서 블록을 실행한다.
  • 블록의 결과가 아닌 리시버 객체 자신을 반환한다.

예시

data class Person(var name: String, var age: Int, var city: String)

fun main() {
    val person = Person("John", 30, "New York").apply {
        name = "Alice"
        age = 25
        city = "San Francisco"
    }

    println(person)  // Person(name=Alice, age=25, city=San Francisco)
}

위 예제에서 apply 함수는 Person 객체의 프로퍼티를 설정하고, 변경된 객체를 반환한다.

run 함수

run 함수는 객체의 초기화나 결과가 필요한 작업을 수행할 때 유용하다. 이 함수는 apply와 with의 결합처럼 동작한다. 블록을 실행하고, 블록의 결과를 반환한다.

특징

두 가지 형태로 사용 가능:

  1. 리시버 객체의 확장 함수로 사용.
  2. 인자로 전달된 블록을 실행.

예시

  1. 리시버 객체의 확장 함수로 사용
data class Person(var name: String, var age: Int, var city: String)

fun main() {
    val person = Person("John", 30, "New York")

    val result = with(person) {
        name = "Alice"
        age = 25
        city = "San Francisco"
        "Person updated successfully"
    }

    println(person)  // Person(name=Alice, age=25, city=San Francisco)
    println(result)  // Person updated successfully
}
  1. 인자로 전달된 블록을 실행
fun main() {
    val result = run {
        val name = "Alice"
        val age = 25
        val city = "San Francisco"
        "Data collected successfully"
    }

    println(result)  // Data collected successfully
}

위 두 예제에서 run 함수는 블록을 실행하고, 블록의 결과를 반환한다.

with 함수

특징

  • 리시버 객체를 첫 번째 인자로 받는다.
  • 블록의 결과를 반환한다.

예시

data class Person(var name: String, var age: Int, var city: String)

fun main() {
    val person = Person("John", 30, "New York")

    val result = with(person) {
        name = "Alice"
        age = 25
        city = "San Francisco"
        "Person updated successfully"
    }

    println(person)  // Person(name=Alice, age=25, city=San Francisco)
    println(result)  // Person updated successfully
}

위 예제에서 with 함수는 Person 객체의 프로퍼티를 변경하고, 블록의 결과를 반환한다.

종합 비교

함수리시버 객체반환값주 사용 용도
applythis리시버 객체객체 설정 및 초기화
with인자로 전달됨블록의 결과특정 객체에서 여러 작업을 수행
runthis 또는 없음블록의 결과객체 설정 및 초기화, 특정 작업의 결과가 필요한 경우

결론

  • apply는 객체를 설정하고 객체 자체를 반환할 때 사용한다.
  • with는 특정 객체에 대해 여러 작업을 수행하고, 블록의 결과를 반환할 때 사용한다.
  • run은 객체 설정과 특정 작업의 결과가 필요한 경우, 혹은 특정 블록을 실행하고 그 결과를 반환할 때 사용한다.
    이들 스코프 함수를 적절하게 활용하면 코드를 더 간결하고 가독성 있게 작성할 수 있다.

0개의 댓글