아이템 15: 리시버를 명시적으로 참조하라에서 나온 용어
otlin에서 apply, with, run 함수는 객체의 컨텍스트 내에서 코드를 실행하기 위해 사용되는 스코프 함수다. 각 함수는 약간의 차이가 있으며, 특정 상황에 따라 적절하게 사용할 수 있다.
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 함수는 객체의 초기화나 결과가 필요한 작업을 수행할 때 유용하다. 이 함수는 apply와 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
}
fun main() {
val result = run {
val name = "Alice"
val age = 25
val city = "San Francisco"
"Data collected successfully"
}
println(result) // Data collected successfully
}
위 두 예제에서 run 함수는 블록을 실행하고, 블록의 결과를 반환한다.
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 객체의 프로퍼티를 변경하고, 블록의 결과를 반환한다.
함수 | 리시버 객체 | 반환값 | 주 사용 용도 |
---|---|---|---|
apply | this | 리시버 객체 | 객체 설정 및 초기화 |
with | 인자로 전달됨 | 블록의 결과 | 특정 객체에서 여러 작업을 수행 |
run | this 또는 없음 | 블록의 결과 | 객체 설정 및 초기화, 특정 작업의 결과가 필요한 경우 |