[code]
fun main() {
// Apply: 객체를 생성함과 동시에 연속된 작업이 필요할 경우 사용
// – 생성된 객체가 자동 리턴된다.
var a = Book(“코틀린”, 10000).apply {
name = “[초특가]” + name
discount()
}
println(a)
// Run:
// 스코프로 사용하기 위한 기능
// 클래스의 경우: 이미 생성된 객체에 연속된 작업이 필요할 경우 사용
// – 객체자신이 파라미터 자동으로 전달된다.
// 객체없이 사용할 경우: 익명함수처럼 사용할 수 있다.
// 마지막줄이 리턴값이다. Unit 가능
var c = a.run {
println(“이름: ” + name + “, 가격: ” + price)
// a // 리턴값
}
println(c)
// With: Run 과 동일하나 파라미터를 사용자가 직접 설정할 수 있다
// 설명 생략
// Let: Run 의 문제점을 해결
// run에서는 호출하는 스코프에 객체의 변수와 동일한 것이 있다면
// 호출하는 스코프에 것이 우선시 되기 때문에 혼동이 일어난다.
// 이때 명시적으로 it을 사용하여 처리 할 수 있는 기능
var price = 5000
a.let {
println(“이름: ” + it.name + “, 가격: ” + price) // 5000 이 나온다
println(“이름: ” + it.name + “, 가격: ” + it.price) // 8000 이 나온다
}
// Also: Apply 의 문제점을 해결
// let과 같은 용도. 설명 생략
}
class Book(var name: String, var price: Int) {
fun discount() {
price -= 2000
}
}
[/code]