고차함수란 함수를 인스턴스처럼 취급하여 다른 함수의 파라미터로 또는 결과값으로 반환받을 수 있는 형태
kotlin 에서는 모든 함수를 고차함수로 표현 가능
fun a(str: String) {
println("$str 함수 a")
}
fun b(function: (String)->Unit) {
function("b가 호출한 ")
}
fun main() {
b(::a) // "b가 호출한 함수 a" 출력
}
function: (String)->Unit : 파라미터로 들어온 함수 function은 String을 매개변수로 가지고 아무것도 반환하지 않는다.(Unit)
val c: (String)->Unit = {str -> println("$str 람다함수")}
b(c) // "b가 호출한 람다함수" 출력
타입 추론을 활용하여 위 코드는 아래와 같이 축약할 수 있다
val c = {str:String -> println("$str 람다함수")}
파라미터가 1개라면 it을 사용하여 나타낼 수 있다
val c: (String)->Unit = {println("$it 람다함수")}
람다함수를 구성하는 라인이 여러 줄이라면, 가장 마지막 코드가 반환된다
val cal: (Int, Int)->Int = { a, b ->
println(a)
println(b)
a + b // 반환
}
println(cal(1, 2)) // 1 2 3 출력
class Book(var name: String, var price: Int) {
fun discount() {
price -= 2000
}
}
var book1 = Book("book title", 10000).apply{
name = "[세일중] " + name
discount()
}
// name: [세일중] book title, price: 8000
println("name: ${book1.name}, price: ${book1.price}")
apply 내의 코드들이 수행된 이후에 인스턴스가 새로 생성되어 반환한다
var book1 = Book("book title", 10000).apply{
name = "[세일중] " + name
discount()
}
var bookCost = book1.run {
println("name: ${book1.name}, price: ${book1.price}")
price + 2000 // 반환
}
println("원가는 $bookCost 입니다.") // 원가는 10000 입니다.
book1.run {...}
with(a) {...}
also는 apply, let은 run과 동일한 기능을 수행하지만 also와 let은 it을 통해 스코프내의 변수를 사용할 수 있다.
var price = 5000
var book2 = Book("book title2", 10000)
var book1 = Book("book title", 10000).apply{
name = "[세일중] " + name
discount()
}
book1.run {
// name: [세일중] book title, price: 5000
// main 함수의 price의 우선순위가 더 높기 때문
println("name: ${name}, price: ${price}")
price + 2000
}
위와 같이 price 변수의 값이 중복되면서 우선시 되는 상황에서 우선순위에 따라 의도한 결과와 다르게 동작 할 수 있다.
book1.let {
println("name: ${it.name}, price: ${it.price}")
price + 2000
}
따라서 also / let과 함께 it을 사용하면 변수명의 중복으로 인해 발생하는 문제를 해결할 수 있다.