Lambda 함수
함수의 이름이 없는 익명함수(anonymous function)이라고 합니다.
{매개변수 → 실행 코드(몸체)}
위 함수의 구조와 같이 람다(익명)함수는 중괄호 내에 실행문을 입력합니다.
다음은 간단한 예로 문자열을 출력하는 함수입니다.
이 함수를 실행하기 위해서는 함수다음에 인수를 전달하기 위한 ()를 같이 나타내야 합니다.
다음은 전달하는 인수가 별도로 존재하지 않는 경우입니다.
{println("Hello")}()
Hello
Hello
람다함수 역시 개체이므로 변수에 저장할 수 있습니다.
이 경우 변수명은 함수이름과 같은 역할을 합니다.
그러므로 객체를 호출할 경우 함수와 같이 적용해야 합니다. 즉, 변수명()
val swim={println("swim \n")}
swim()
swim
swim()
swim
다음은 매개변수가 존재하는 경우입니다.
var dirty = 20
val waterFilter = {dirty: Int -> dirty/2}
waterFilter(dirty)
10
val waterFilter = {dirty: Int -> dirty/2}
waterFilter(dirty)
10
위 람다는 함수를 간단하게 표현하는 방법으로 나타낼 수 있습니다.
fun waterFilter(dirty:Int) = dirty+10
waterFilter(dirty)
30
waterFilter(dirty)
30
람다 함수는 실제로 고차함수(함수를 인수로 취하는 모든 함수)를 사용할 때 강력합니다.
fun updateDirty(dirty: Int, operation: (Int)->Int):Int{
return operation(dirty)
}
updateDirty(dirty){dirty -> dirty+50}
70
return operation(dirty)
}
updateDirty(dirty){dirty -> dirty+50}
70
고차 함수(Higher-Order Functions)
일반적으로 함수는 매개변수와 반환값이 데이터인데 반해고차 함수(고계도 함수)는 전달받는 매개변수나 반환물이 함수인 경우입니다.
즉, 다음 중 하나를 만족하는 함수를 의미합니다.
1) 함수를 매개변수(파라미터)로 전달 받는 함수
2) 함수를 리턴(반환)하는 함수
2) 함수를 리턴(반환)하는 함수
다음은 함수에 인수로 문자열을 받아 그 문자열의 길이를 반환하는 함수로서
매개변수를 람다함수를 받는 경우입니다.
이 함수는 람다함수를 매개변수로 받기 때문에
그 함수의 적용은 길이를 반환하는데에 고정되지 않습니다.
fun stringMapper(str:String, result:(String)->Int):Int{
return result(str)
}
println(stringMapper("Android", {input-> input.length}))
7
println(stringMapper("Android", {input-> input.length*input.length}))
49
return result(str)
}
println(stringMapper("Android", {input-> input.length}))
7
println(stringMapper("Android", {input-> input.length*input.length}))
49
다음은 정수와 람다함수를 매개변수로 받아 인수인 정수에 다른 함수를 적용하는 것입니다.
fun numFun(x1: Int, argFun: (Int) -> Int){
val result = argFun(x1)
println("x1 : $x1, someFun1 : $result")
}
numFun(7,{x -> x*x*x})
x1 : 7, someFun1 : 343
numFun(7, {x -> (x*x)/10})
x1 : 7, someFun1 : 4
val result = argFun(x1)
println("x1 : $x1, someFun1 : $result")
}
numFun(7,{x -> x*x*x})
x1 : 7, someFun1 : 343
numFun(7, {x -> (x*x)/10})
x1 : 7, someFun1 : 4
함수내에 함수를 매개변수로 받은 것입니다.
즉, 함수내에 내포된 함수를 하나더 생성한 것입니다.
이 경우 내포한 함수 역시 매개변수가 필요합니다.
위의 두 경우 내포된 함수에 전달한 다른 매개변수를 사용합니다.
매개변수로 사용된 람다함수의 결과를 다르게 할 수 있으므로
하나의 함수에서 다양한 결과를 생성하게 할 수 있습니다.
댓글
댓글 쓰기