빠르게 살펴보기
고차 함수에 대해 좀 더 직관적으로 알 수 있도록 예제를 몇 개 더 살펴보겠습니다. 파라미터가 없는 경우는 다음과 같이 쉽게 구현할 수 있습니다.
fun main(args: Array<String>) {
getName({setCommon()})
}
fun setCommon() : String {
return "My name is "
}
fun getName(body: () -> String) {
println(body())
}
My name is
아직 이름을 가져오지 못했습니다. 이제 common 문장에 고유한 이름을 추가할 수 있도록 파라미터를 하나 추가해보겠습니다.
fun main(args: Array<String>) {
getName({name -> setCommon() + "$name"})
}
fun setCommon() : String {
return "My name is "
}
fun getName(body: (String) -> String) {
println(body("Park"))
}
My name is Park
파라미터를 추가한 후 getName()을 사용하는 방법을 보면 다소 생소합니다. 바로 람다 표현식(이하 람다식)을 사용해서 익숙한 모습이 아닙니다. 지금은 간략하게 람다식에 대해 다음의 설명 정도만 익혀두면 도움이 될 것입니다.
- 람다식은 중괄호 { }로 묶임
- 파라미터(타입 생략 가능)가 있는 경우 -> 전에 선언
- body는 -> 후에 선언
위 규칙을 보면 getName() 사용시에 선언한 부분이 이해가 됩니다. 파라미터가 있으므로 -> 전에 name이라는 이름으로 선언되어 있습니다. 파라미터가 String 타입으로 명백하니 타입은 생략 가능합니다. 그리고 -> 다음으로 body, 즉 함수가 선언되었습니다.
이제 파라미터가 두 개라도 끄덕없습니다. -> 전에 파라미터 두 개를 선언해주면 그만입니다.
fun main(args: Array<String>) {
getName({lastName, firstName -> setCommon() + "$firstName" + " $lastName"})
}
fun setCommon() : String {
return "My name is "
}
fun getName(body: (String, String) -> String) {
println(body("Park", "yeol"))
}
My name is yeol Park
이때 getName({lastName, firstName -> setCommon() + "$firstName" + " $lastName"})에서 ( )는 생략이 됩니다. 이것 역시 람다식에 의해서 가능한 것입니다.
퇴근 후 지속적으로 달려왔더니 조금 지쳐 내용이 짧습니다. (아무도 모르게 업데이트 될 수도 있습니다.) 다음에는 여러번 언급된 람다식이 뭔지 살펴보도록 하겠습니다.
파라미터로 넘어오는 함수(setCommon)가 파라미터를 가질 경우 그 함수(setCommon)에 넘겨줄 파라미터를 고차 함수(getName)의 파라미터로 받아왔습니다.
fun main(args: Array<String>) {
getName("yeol", "Park", {a, b -> setCommon(a, b)})
}
fun setCommon(firstName: String, lastName: String) : String {
return "My name is $firstName $lastName"
}
fun getName(firstName: String , lastName: String, body: (String , String) -> String) {
println(body(firstName, lastName))
}
My name is yeol Park