본문 바로가기
2학년 2학기/모바일 소프트웨어 - 코틀린

고차함수(1) - 선언과 사용

by print_soo 2024. 10. 10.

고차함수란?

일급 함수이면서 일급객체를 사용할 수 있는 것이다. 일급 함수란 함수가 변수 역할을 하는 것이고, 일급 객체란 함수의 실 인자로 사용할 수 있으며, 함수의 반환 값으로도 사용할 수 있는 것이다.

 

 

 

일반 함수와 고차함수의 차이

// 일반 함수
fun multiply(a: Int, b: Int): Int {
    return a * b
}

 

일반 함수는 위와 같이 변수만 인자로 받아서 그 변수들을 통해 연산을 해서 값을 반환한다.

 

 

fun multiply(a: Int, b: Int, hfunc:(Int, Int) -> Int): Int {
    return hfunc(a, b)
}

 

하지만 고차함수는 함수를 인자로 받을 수 있다. 즉, 인자로 전달 받은 함수와 전달 받은 변수의 값들을 이용해서 값을 반환한다. 따라서, 매번 다른 함수를 인자로 전달한다면 매번 다른 연산을 통해서 값을 반환할 수 있다.

 

 


 

고차함수를 사용하는 방법

// 기본적인 선언 방식

fun 고차함수명(변수1: 변수타입, 변수2: 변수타입, 함수명: (입력 타입1, 입력 타입2) -> 반환 타입): 고차함수 반환타입 {
    return 함수명(변수1, 변수2)
}

 

 

 

사용 방법 1 

//고차함수
fun multiply(a: Int, b: Int, hfunc:(Int, Int) -> Int): Int {
    return hfunc(a, b)
}

//전달할 함수
fun myPureFunc(p:Int, q:Int): Int = p * q

fun main() {
    //고차함수 사용
    val result = multiply(2, 3, ::myPureFunc)
    println(result) //6
}

 

 

이렇게 ::을 사용해서 고차함수에 인자값으로 함수를 전달할 수 있다.

 


사용 방법 2 

//전달할 함수
fun myPureFunc(p:Int, q:Int): Int = p * q

fun main() {
    //고차함수 사용
    val tmp = ::myPureFunc
    println(tmp(2, 3)) //6
}

 

 

또 다른 방식으로는 변수에 전달할 인자::와 함께 사용해서 저장하면 해당 변수는 고차함수를 참조하게 된다. 따라서 변수를 고차함수처럼 사용할 수 있다.

 

 


 

함수의 타입들

 

(Int, Int) -> Int

: Int타입의 변수 2 개를 입력으로 받고, Int타입 1개를 출력하는 것

 

(Int) -> Unit

: Int타입의 변수 1 개를 입력으로 받고, 출력값은 없는

 

() -> Int

: 입력을 받지 않고, Int타입 1개를 출력하는 것

 

(Int, Int) -> Int?

: Int타입의 변수 두개를 입력으로 받고, Int타입 1개를 출력하거나 null 값을 출력하는 것

 

((Int, Int) -> Int)?

: Int타입의 변수 두개를 입력으로 받고, Int타입 1개를 출력할 수 있지만 / 아무 함수도 전달 받지 않을 수 있는 것