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"})에서 ( )는 생략이 됩니다. 이것 역시 람다식에 의해서 가능한 것입니다.
마치며
업데이트
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 |
'프로그래밍 > Kotlin' 카테고리의 다른 글
코틀린(Kotlin) 리시버가 있는 함수 리터럴 (0) | 2018.01.05 |
---|---|
코틀린 익명 함수 (Anonymous Function) (0) | 2018.01.02 |
코틀린 Lambda Expression Syntax (0) | 2017.12.21 |
코틀린 Higher-Order Functions #1 (0) | 2017.12.20 |
코틀린(Kotlin) Control Flow #2 (0) | 2017.12.19 |
코틀린(Kotlin) Control Flow #1 (0) | 2017.12.17 |
코틀린(Kotlin) 확장(Extension) #2 (0) | 2017.12.16 |