brunch

You can make anything
by writing

C.S.Lewis

by 서준수 Dec 21. 2017

코틀린 Higher-Order Functions #2

빠르게 살펴보기

Higher-Order Functions 리뷰



 고차 함수에 대해 좀 더 직관적으로 알 수 있도록 예제를 몇 개 더 살펴보겠습니다. 파라미터가 없는 경우는 다음과 같이 쉽게 구현할 수 있습니다.       


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 


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari