인스턴스를 생성하자마자 인스턴스의 속성과 함수를 apply 스코프 안에서 참조연산자 없이 사용가능하게 해준다.
자신을 다시 반환하기 때문에 주로 객체의 초기화에 사용한다.
fun main() {
var a = Book("알고리즘",20000).apply{
name = "[할인가]" + name
discount()
}
/* var a = Book("알고리즘",20000)
* a.name = "[할인가]" + name
* a.discount */
}
class Book(var name: String, var price: Int){
fun discount(){
price -= 2000
}
}
run
스코프 안에서 참조연산자 없이 속성과 함수를 사용할 수 있는 점은 apply와 같지만 run은 람다함수처럼 마지막 구문에 결과값을 반환한다. 이미 객체가 생성 되어 있을 때 주로 사용한다.
var b = a.run{
println(a.price)
a.name // a의 이름은 반환되어 b에 할당됨
}
run을 이용한 출력
a.run{
println("상품명:${name}, 가격:${price}원")
}
with
run과 동일하지만 인스턴스를 참조연산자대신 패러미터로 받음
a.run{} // == with(a){}
also / let
기능적인 면 apply = also, run = let
하지만 패러미터로 인스턴스를 넘긴것처럼 it을 통해 인스턴스를 사용한다.
이것은 scope 바깥에 중복되어 있는 동일한 변수나 함수명의 혼란을 방지하기 위함이다.
fun main() {
var price = 10000
var a = Book("알고리즘",20000).apply{
name = "[할인가]" + name
discount()
}
a.run{
println("상품명:${name}, 가격:${price}원")
}
a.let{
println("상품명:${it.name}, 가격:${it.price}원")
}
}
class Book(var name: String, var price: Int){
fun discount(){
price -= 2000
}
}
main에서 동일한이름의 price란 변수를 만들면 run으로 실행했을 때, 저 변수를 우선순위로 받아들여 10000을 출력하고,