package days01
fun main(){
// fun testFunction1(){
// println("testFunction1")
// }
// val testFunction2=testFunction1 // error
// 자바스크립트에서 가능했던 선언적 함수의 직접 변수 저장은 불가능함
// 아래와 같이 익명함수 저장은 가능함
// 익명함수 생성
val t1=fun(x1:Int, x2:Int): Int{
return x1*x2
}
var a1=t1(20,30)
println("a1:$a1")
var t2=t1 // 변수에 저장된 함수의 몸체는 다른 변수에도 저장이 가능
var a2=t2(30,40)
println("a2:$a2")
// 1. 변수가 저장된 익명함수를 전달인수로 전달
testFunc1(t1, 100, 200)
println()
// 2. 전달인수로 직접 익명함수를 써줌
testFunc1(fun(x1:Int, x2:Int): Int{return x1-x2}, 300, 400)
println()
// 3. 전달인수로 람다함수의 몸체를 전달.
// :매개변수가 헤더(원형)이므로 몸체를 보내서 자연스럽게 저장되도록 함
testFunc1({x1:Int, x2:Int -> x1+x2}, 500, 600)
// 전달인수와 매개변수의 조합문 t3:(Int, Int) -> Int={x1:Int, x2:Int ->x1+x2}와 같음
}
// 함수의 몸체가 전달되어서 호출되는 함수는 매개변수도
// 그 함수의 몸체를 받을 수 있는 변수로 준비되어야 함
// 아래의 매개변수 t3는 함수를 저장할 수 있는 매개변수
// 함수의 매개변수에 람다함수의 원형(헤더)부분을 전달도니 함수에 맞게 써서 전달&저장되도록 함
fun testFunc1(t3:(Int, Int)->Int, a1:Int, a2:Int):Unit{
var a3 = t3(a1, a2)
println("a3:$a3")
}