{λλ€ ν¨μμ μ¬μ©ν λ§€κ°λ³μ -> λ°νν μ}
* μλ£νμ μΆλ‘ ν μ μκ² μ¨μΌ ννλλ€!
π λ°ν μλ£νμ΄ μλ κ²½μ°: () -> Unit
π λ§€κ°λ³μκ° νλμΈ κ²½μ°: (Int)->Int**
val greet: () -> Unit = {println("Hello")} //λ°νκ°λ, μΈμλ μλ κ²½μ°: μ€λ₯Έμͺ½μ νμ΄νX
π λλ€μ μμ λλ€μμ΄ μλ κ²½μ°**
val nestedLambda: ()->()->Unit = { { println("nested")} }
//μ€κ΄νΈ λκ°!
ν¨μ μ체μ λ°νμ ν¨μλ‘ μ€ μ μμ
: ν¨μκ° μΈμλ‘ μ λ¬λλ κ²½μ°: λλ€μ ν¨μλ κ°μΌλ‘ μ²λ¦¬λμ΄ κ·Έ μ¦μ ν¨μκ° μνλ νμ κ°μ΄ μ λ¬λλ€!
fun main(){
val result = callByValue(lambda())// 1οΈβ£ λλ€μ ν¨μλ₯Ό νΈμΆ!
println(result)//5οΈβ£ result κ°
}
fun callByValue(b: Boolean): Boolean{//3οΈβ£ b = μΌλ° λ³μ μλ£νμΌλ‘ μ μΈλ λ§€κ°λ³μ
println("callByValue func")
return b//4οΈβ£
}
val lambda: () -> Boolean = {//λλ€ ννμμ΄ λμ€μ΄λ©΄
println("lambda func")
true//2οΈβ£ λ§μ§λ§ ννμ λ¬Έμ₯μ κ²°κ³Όκ° λ°ν!
}
fun main(){
val result = callByName(otherLambda)//1οΈβ£ λλ€μ μ΄λ¦λ§ μ¬μ©ν κ²½μ° () νμ μμ
println(result)//4οΈβ£ result
}
fun callByName(b: () -> Boolean): Boolean{//λ³μ bλ λλ€μ!!
println("callByName func")
return b()// 2οΈβ£
}
val otherLambda: () -> Boolean = {//κ°λ§ λ€μ΄κ°λκ² μλλΌ, μ΄ λ΄μ©μ΄ λ€ λ€μ΄κ°
println("otherLamda func")
true//3οΈβ£
}
: λλ€μμΌλλ§ ν¨μμ μΈμλ‘ μ¬μ©ν μ μλ€.
fun sum(x: Int, y: Int) = x+y
funcParam(3,2,sum) //μ€λ₯!!//sumμ΄ λλ€μμ΄ μλκΈ° λλ¬Έ!!!
=> funcParam(3,2,::sum) //μ°Έμ‘°λ°©μ!λ΄λΆμ μΌλ‘ λλ€μμ λ§€μΉν΄μ κ°μ Έμ΄
fun funcParam(a: Int, b: Int, c: (Int, Int) -> Int): Int{
return c(a,b)
}
//λ§€κ°λ³μ aκ° νλ μλ λλ€μ ν¨μ
oneParam({a-> "Hello $a"})
oneParam{a-> "Hello $a"}
oneParam{"Hello $it"}//μμμ κ°μ Έμ¨ λ³μ νλ(λκ°μΌκ²½μ° λ체X)
fun oneParam(out: (String) -> String){
println(out("OneParam"))
}
//λ§€κ°λ³μκ° 2κ°
moreParam{a,b -> "Hello $a $b"}
fun moreParam(out:(String, String)-> String){
println(out("One Param", "Two Param"))
}
/////////////
moreParam{_,b -> "Hello $b"}
//첫λ²μ§Έ λ¬Έμμ΄μ μ¬μ©μν΄
//μΈμμ ν¨κ» μ¬μ©νλ κ²½μ°
//μΌλ° λ§€κ°λ³μμ λλ€μ λ§€κ°λ³μλ₯Ό κ°μ΄ μ¬μ©
withArgs("Arg1","Arg2",{a,b -> "Hello $a $b"})
//withArgs()μ λ§μ§λ§ μΈμ(out)κ° λλ€μμΈ κ²½μ° () λΆλ¦¬ κ°λ₯
withArgs("Arg1","Arg2") {a,b -> "Hello $a $b"}
fun withArgs(a: String, b: String, out:(String, String)->String){//a,b,out(λλ€μ)
println(out(a,b))
}
-ν¨μκ° μ΄λ¦μ΄ μλ κ²!
fun (x: Int, y: Int): Int = x+y//=={return x+y}
val add: (Int, Int) -> Int = fun(x,y) = x+y//μ΅λͺ
ν¨μλ₯Ό μ¬μ©ν add μ μΈ
//μμμ μΌλ‘ μ¬μ©ν λ μ μ©ν¨!
val result = add(10,2) //ν¨μμ²λΌ 보μ΄μ§λ§, μ²λ¦¬λ κ²°κ³Ό 리ν΄ν κ°μ λ΄κ³ μλ λ³μ!!
val add = fun(x: Int, y: Int) = x+y
val add = {x: Int, y: Int -> x+y}
//μμ²λΌ μ΅λͺ ν¨μμ μ΅λͺ ν¨μ μ€ νλμΈ λλ€μμ λ§€μ° ν‘μ¬νλ€!
: ν¨μκ° νΈμΆλλ κ³³μ λ΄μ©μ λͺ¨λ 볡μ¬!
-ν¨μμ λΆκΈ° μμ΄ μ²λ¦¬ -> μ±λ₯ μ¦κ°!
-μ½λκ° λ³΅μ¬λμ΄ λ€μ΄κ°κΈ° λλ¬Έμ λκ° λ΄μ©μ μ§§κ² μμ±νλ€
-μΈλΌμΈ ν¨μλ λλ€μ λ§€κ°λ³μλ₯Ό κ°μ§κ³ μλ ν¨μ ννλ₯Ό κΆμ₯νλ€.
inline ν¨μλ main ν¨μ λ΄μμ inlineν¨μ λ΄μ©μ΄ 볡μ¬λμ΄ κ·Έλλ‘ μ€νλλ€. λ°λ©΄ inlineμ μ§μ°κ³ μ€ννλ©΄ shortFunc()ν¨μλ₯Ό νΈμΆνμ¬ μ€νλλ€. [Kotlin - Show ByteCode - Decomplie] ν΄μ java μ½λλ‘ μ΄ μ°¨μ΄μ μ νμ€ν λ³Ό μ μλ€.
inline λΆλΆμ λ
ΈλμμΌλ‘ κ²½κ³ κ° λ¨λλ°,
Expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of functional types
μΈλΌμΈ ν¨μλ μ±λ₯μ μν₯μ μ£ΌκΈ° λλ¬Έμ, λλ€μ ν¨μλ₯Ό μ¬μ©ν΄μΌ λ μ’λ€λ λ΄μ©μ΄λ€.
Decompileν΄μ νμΈν΄λ³΄λ©΄, ν¨μλ₯Ό νΈμΆνλ κ²μ΄ μλ, λ΄μ©μ΄ mainν¨μ λ΄μ 볡μ¬λμ΄ λ€μ΄κ° μλ€!
μΈμκ° νλμΌ κ²½μ° λ¨μΆ κ°λ₯!
=> it μ¬μ©
shortFunc(5 ){println("a: $it")}
μλ κ°λ₯!!!!
-μΈλΌμΈ ν¨μμ λ¨μ
: μ½λκ° λ³΅μ¬λλ―λ‘ λ΄μ©μ΄ λ§μ ν¨μμ μ¬μ©νλ©΄ μ½λκ° λμ΄λλ€.
-noinline ν€μλ
: μΌλΆ λλ€μ ν¨μλ₯Ό μΈλΌμΈ λμ§ μκ² νκΈ° μν΄
inline fun sub(out1: () -> Unit, noinline out2: () -> Unit){
//out2λ 볡μ¬λλκ² μλλΌ κ·Έλλ‘ λ¨μμμ
//====================================
inline fun shortFunc(a: Int, noinline b: (Int)->Unit){
//λ°νκ°μ΄ μλ λλ€μ μΈμ b
println("Hello")
b(a) //no inline
}
fun main(){
//shortFunc(5,{a -> println("a: $a")})
shortFunc(5 ){println("a: $it")}
}
Function1μ΄ out.invokeλ₯Ό ν΅ν΄ aλ₯Ό νΈμΆνλλ°, mainν¨μμμ μ΄κ° κ·Έλλ‘ λ¨μμμ
//========================
-λΉμ§μλ°ν
" μ½νλ¦°μμλ μ΅λͺ ν¨μλ₯Ό μ’ λ£νκΈ° μν΄μ returnμ μ¬μ©ν μ μμ΅λλ€. μ΄λ νΉμ λ°νκ° μμ΄ returnλ§ μ¬μ©ν΄μΌ ν©λλ€. κ·Έλ λ€λ©΄ λλ€μ ν¨μλ₯Ό λΉ μ Έ λμ€λ €λ©΄ μ΄λ»κ² ν κΉμ? λλ€μ ν¨μλ₯Ό μΈμλ‘ μ¬μ©νλ ν¨μλ μλνμ§ μκ² λλ€μ ν¨μ λ°κΉ₯μ μλ ν¨μκ° κ°μ΄ λ°νλ λ²λ¦¬λλ° μ΄κ²μ λΉμ§μ λ°νμ΄λΌκ³ ν©λλ€. "
mainν¨μμμ shortFunc 리ν΄μ μ£Όλ©΄, ν΄λΉ bλ§ λΉ μ Έλκ°λ κ²μ΄ μλ, bμ shortFunc λͺ¨λ λΉ μ Έλκ°κ² λμ΄μ λ°μ Goodbyeκ° μΆλ ₯μ΄ μλλ€.
μ΄λ μ΄λ° λΉμ§μ λ°νμ κΈμ§νλ €λ©΄ crossinlineμ΄λΌλ ν€μλλ₯Ό λλ€μ ν¨μ μμ μ¬μ©ν΄ ν¨μμ λ³Έλ¬Έ λΈλ‘μμ returnμ΄ μ¬μ©λλ κ²μ κΈμ§ν μ μμ΅λλ€. crossinline ν€μλλ λΉμ§μ λ°νμ κΈμ§ν΄μΌ νλ λλ€μμ μ¬μ©ν©λλ€.
=> returnμ μ¬μ©ν μ μκ² λλ€.
-νμ₯ ν¨μ(extension function)
:ν΄λμ€μ λ©€λ² ν¨μλ₯Ό μΈλΆμμ λ μΆκ°ν μ μλ€.
fun νμ₯ λμ.ν¨μλͺ (λ§€κ°λ³μ, ...): λ°νκ° {
...
return κ°
}
ν΄λμ€μλ λ€μν ν¨μκ° μ μλμ΄ μμ΅λλ€. μ΄κ²μ ν΄λμ€μ λ©€λ² λ©μλλΌκ³ λ λΆλ¦½λλ€. κ·Έλ°λ° κΈ°μ‘΄ λ©€λ² λ©μλλ μλμ§λ§ λ΄κ° μνλ ν¨μλ₯Ό νλ λ ν¬ν¨μμΌ νμ₯νκ³ μΆμ λκ° μμ κ²μ λλ€. μ½νλ¦°μμλ μ΄μ²λΌ ν΄λμ€μ²λΌ νμλ‘ νλ λμμ ν¨μλ₯Ό λ μΆκ°ν μ μλ νμ₯ ν¨μ(extension function)λΌλ κ°λ μ μ 곡νκ³ μμ΅λλ€.
νμ₯ ν¨μλ₯Ό λ§λ€ λ λ§μΌ νμ₯νλ €λ λμμ λμΌν μ΄λ¦μ λ©€λ² ν¨μ νΉμ λ©μλκ° μ‘΄μ¬νλ€λ©΄ νμ νμ₯ ν¨μλ³΄λ€ λ©€λ² λ©μλκ° μ°μ μΌλ‘ νΈμΆλ©λλ€.
**νμ₯ν¨μ λΆλΆ μ± λ³΄κ³ λ€μ 곡λΆνκΈ°
-μ€μ ννλ²: ν΄λμ€μ λ©€λ² νΈμΆ μ μ¬μ©νλ μ (.)μ μλ΅νκ³ ν¨μ μ΄λ¦ λ€μ μκ΄νΈλ₯Ό μλ΅ν΄ μ§κ΄μ μΈ μ΄λ¦μ μ¬μ©ν μ μλ ννλ²
-쑰건
μ€μ ν¨μλ₯Ό μ΄μ©ν΄ μ°μ°μμ²λΌ μ¬μ©νκΈ°
//μ€μ ννλ²
val multi_infix = 3 multiply 10
println("multi_infix: $multi_infix")
val str1 = num.strPlus("Kotlin")//μΌλ° ννλ²
val str2 = num strPlus "Kotlin"//μ€μ ννλ²
-μκΈ° μμ μ λ€μ μ°Έμ‘°
-κ³μ νΈμΆνλ νΉμ§
-쑰건
-μ€νμ κ³μ μμ΄λ λ°©μμ΄ ν¨μκ° κ³μ μμμ§λ 꼬리λ₯Ό 무λ νν
-tailrec ν€μλλ₯Ό μ¬μ©ν΄ μ μΈ
fun main(){
val num = 5
println("Factorial : $num -> ${factorial(num)}")
}
tailrec fun factorial(n:Int, run: Int = 1): Long{
return if(n==1) run.toLong() else **factorial(n-1, run*n)**
}
=> μ€ν 곡κ°μ λλΉνμ§ μμλ λλ―λ‘, μΌλ° μ¬κ·ν¨μλ³΄λ€ ν¨μ¬ μμ ν μ½λκ° λλ€.
-ν¨μμ λΈλ‘({})
: μ§μ λ³μ
<-> μ μ λ³μ
-ν¨μμ λ²μ
1) μ΅μμ ν¨μ, μ§μ ν¨μ
fun main() { // μ΅μμ λ 벨μ ν¨μ
...
fun secondFunc(a: Int) { // μ§μ ν¨μ μ μΈ
...
}
userFunc(4) // μ¬μ©μ ν¨μ μ¬μ© - **μ μΈλΆμ μμΉμ μκ΄ μμ΄ μ¬μ©**
secondFunc(2) // μ§μ ν¨μ μ¬μ© - **μ μΈλΆκ° λ¨Όμ λμμΌ μ¬μ© κ°λ₯**
}
fun userFunc(counts: Int) { // μ¬μ©μκ° λ§λ μ΅μμ λ 벨μ ν¨μ μ μΈ
...
}