람다 함수
람다 함수는 코틀린뿐만 아니라 많은 프로그래밍 언어에서 제공하는 익명 함수 정의 기법입니다.
코틀린으로 프로그램을 작성하다 보면 람다 함수를 많이 쓰는데, 이는 코틀린에서 고차 함수를 지원하기 때문입니다.
일반 함수는 fun키워드로 선언합니다. 그렇지만 람다 함수는 fun키워드를 이용하지 않으며 함수 이름이 없습니다.
{ 매개변수 -> 함수 본문 }
- 람다 함수는 {} 로 표현합니다.
- {} 안에 화살표(->)가 있으며 화살표 왼쪽은 매개변수, 오른쪽은 함수 본문입니다.
- 함수의 반환 값은 함수 본문의 마지막 표현식입니다.
val sum = { no1:Int,no2:Int -> no1 + no2 }
print(sum(2,5)) //7
람다 함수는 이름이 없으므로 함수명으로 호출할 수 없습니다. 그래서 보통은 람다 함수를 위 소스처럼 변수에 대입하여 사용합니다.
print({ no1:Int,no2:Int -> no1 + no2 }(1,2)) //3
위 소스는 람다 함수를 선언하자마자 함수를 사용하고 싶을 때 쓸 수 있는 방법입니다. 중괄호 뒤에 소괄호로 호출해주면 됩니다.
{ 함수 본문 }
람다 함수에 매개변수가 없을 경우 매개변수 부분을 비워두면 됩니다. 화살표까지 생략 가능합니다.
//val some = { no : Int -> println(no) }
val some : (Int) -> Unit = {println(it)}
//val some = {println(it)} // 오류! 해당 매개변수 타입을 식별할수 없음
some(10) //10
위 소스 1번째 줄과 2번째 줄은 같은 역할을 하는 람다 함수입니다. 2번째 줄의 it은 매개변수 키워드를 생략하고 매개변수 대신 사용할 수 있습니다. 단 해당 키워드를 사용하는 것은 매개변수의 타입을 식별할 수 있을 때만 사용 가능합니다.
함수 타입과 고차 함수
변수는 타입을 가지며 타입을 유추할 수 있을 때를 제외하고는 생략할 수 없습니다. 그래서 변수에 함수를 대입하려면 변수를 함수 타입으로 선언해야 합니다. 함수 타입이란 함수를 선언할 때 나타내는 매개변수와 반환 타입을 말합니다.
typealias MyType = (Int,Int) -> Boolean
fun main(){
//val some : MyType = {no1:Int,no2:Int -> no1 > no2}
val some : MyType = {no1,no2 -> no1 > no2}
print(some(10,5))
}
함수 타입이 너무 길고 자주 쓰일 때 하나의 별칭으로 선언할 수 있습니다. 그것이 typealias입니다. typealias는 타입의 별칭을 선언하는 키워드로, 함수 타입뿐만 아니라 데이터 타입을 선언할 때도 사용합니다. 매개변수의 타입을 유추할 수 있다면 매개변수의 타입 또한 생략할 수 있습니다.
fun hofFun(arg:(Int)->Boolean):() -> String{
val result = if(arg(10)){
"valid"
}else{
"invalid"
}
return {"hofFun result:$result"}
}
fun main(){
val result = hofFun({no-> no>0})
println(result()) //hofFun result:valid
}
고차 함수란 함수를 매개변수로 전달받거나 반환하는 함수를 의미합니다.