고차 함수

Minsuk Jang·2021년 8월 17일
0

코틀린

목록 보기
1/4
post-thumbnail

🤔 고차함수란?

매개변수로 함수를 전달받거나 함수를 반환하는 함수이다.

👉 함수를 전달받는 경우

//함수를 전달받는 예시
fun main(args: Array<String>) {
    println(example(10,{ x -> x * x }))
}

fun example(args: Int, argFun: (Int) -> Int): Int {
    return argFun(args)
}

example 함수의 두번째 인자는 함수를 받고자 함수 타입으로 선언한 모습이다. 코틀린은 [변수명 : 타입] 으로 작성하기에 example의 함수의 두번째 인자는 [argFun(변수명)] : [(Int) -> Int (타입)] 로 생각하면 이해하기가 쉽다.

이어서 컬렉션 타입에서 자주 사용하는 filter와 forEach를 보자.

//filter와 forEach의 예제 코드
fun main(args: Array<String>) {
    arrayOf(1,2,3,4,5).filter({
        it < 3
    }).forEach({
        println(it)
    })
}
  1. filter 함수 원형

  2. forEach 함수 원형

filter와 forEach 함수에 람다 함수 {it<3} 와 {println(it)} 를 매개변수로 사용했다.
고차함수의 매개변수로 함수 타입일 경우 ()를 생략할 수 있다. 즉, 위의 코드를 아래와 같이 수정할 수 있다.

//고차함수의 인자인 함수를 넣었을 경우, ()가 생략 가능하다.
fun main(args: Array<String>) {
    arrayOf(1,2,3,4,5).filter{
        it < 3
    }.forEach{
        println(it)
    }
}

뿐만 아니라, 고차함수의 마지막 인자가 함수 타입일 경우에도 () 밖으로 빼서 작성할 수 있다. 단, 여러 개의 함수 인자일 경우, 마지막의 하나만 가능하다.

//()를 빼서도 작성이 가능하다. 
fun main(args: Array<String>) {
    example1(3,{x : Int -> x * x}, {x : Int -> x < 10})
    example1(3,{x : Int -> x * x}) {x : Int -> x < 10}
}


fun example1(args : Int, argFun1 : (Int) -> Int, argFun2 : (Int) -> Boolean){
    println(argFun1(args))
    println(argFun2(args))
}

코틀린에서 함수의 인자에 기본값을 설정할 수 있듯이, 고차함수의 함수 인자에도 기본값을 설정할 수 있다.

//기본값이 설정된 고차 함수
fun main(args: Array<String>) {
    example2(10,{x : Int -> x+ x})
    example2(10, {x: Int -> x + x}, {x : Int -> x/ x})
}


fun example2(args : Int, argFun1 : (Int) -> Int , argFun2 : (Int) -> Int = {x : Int -> x * x}){
    println(argFun1(args))
    println(argFun2(args))
}

👉 고차함수의 함수를 반환하는 경우

//함수를 반환하는 예
fun main(args: Array<String>) {
    val function = calculate("+")(3,4)
    println(function)
}

fun calculate(str: String): (Int, Int) -> Int {
    return when (str) {
        "+" -> { x, y -> x + y }
        "-" -> { x, y -> x - y }
        "*" -> { x, y -> x * y }
        else -> { x, y -> x / y }
    }
}

위의 예시의 calculate함수는 반환값이 함수이다. 따라서, main에서 calculate함수에 "+"를 매개변수로 넣으면 {x,y -> x+y} 람다함수를 반환되고 반환된 함수에 (3,4) 인자를 넣어 계산한 값이 function변수에 할당되게 된다.

👍 참조

profile
Positive Thinking

0개의 댓글