Kotlin, 고차함수와 람다함수

Yebali·2021년 8월 13일
0

약간의_Kotlin

목록 보기
7/19

고차함수

함수를 마치 클래스에서 만들어 낸 '인스턴스'처럼 취급하는 방법.
함수를 파라미터로 전달 할 수 있도 물론 반환 값도 받을 수 있다.

fun a (str:String) {
    println("$str 함수 a")
}

// 'Unit'의 의미는 반환하는 값이 없다는 의미
fun b (function: (String) -> Unit) {
    function("b가 호출한") //"b가 호출한"의 값이 함수 a에 전달되는 꼴
}

fun main() {
	b(::a)
}

함수를 파라미터로 전달 할 때에는 ':: + 함수명'의 형태로 전달한다.
b함수에 파라미터로 전달된 '::a'는 함수 a가 파라미터로 전달되었다는 의미이다.

람다 함수

파라미터로 전달할 함수를 굳이 이름까지 붙여주는 정성이 필요할까?
위의 a함수를 람다함수로 만들어 같은 동작을 하는 코드를 만들어보자.

fun a (str:String) {
    println("$str 함수 a")
}

fun b (function: (String) -> Unit) {
    function("b가 호출한") //"b가 호출한"의 값이 함수 a에 전달되는 꼴
}

fun main() {
    // (String)->Unit는 c가 람다 함수 타입임을 나타냄
    var c:(String)->Unit = {str:String -> println("$str 람다함수")} 
     
    b(::a)
    b(c)
}

참고로 타입 추론기능을 통해 아래의 코드를 좀 더 간단하게 구현 할 수 있다.

var c:(String)->Unit = {str:String -> println("$str 람다함수")}

  • var c:(String)->Unit = {str -> println("$str 람다함수")}
    OR
  • var c = {str:String -> println("$str 람다함수")}

람다 함수의 몇가지 특징을 더 알아보면

  1. 람다 함수의 구문이 여러줄이고 반환 값이 있는 경우에는
    마지막 구문의 값이 반환된다.
val calculate: (Int, Int) -> Int = {a, b ->
    println(a)
    println(b)
    a+b // a + b 값이 반환된다.
}
  1. 파라미터가 없는 람다함수는 실행할 구문들만 나열하면 된다.
val a:() -> Unit = {println("파라미터가 없어요")}
  1. 파라미터가 하나밖에 없다면 'it'키워드로 사용이 가능하다.
val c:(String) -> Unit = {println("$it 람다함수")}
profile
머리에 다 안들어가서 글로 적는 중

0개의 댓글