Coding Memo

Kotlin 고차 함수 / 람다 함수 본문

Language/Kotlin

Kotlin 고차 함수 / 람다 함수

minttea25 2020. 12. 31. 18:15

코틀린은 함수형 프로그래밍 언어이기도 하다.


고차 함수 (High Order Function)

 

고차 함수의 간단한 정의: 하나 이상의 함수를 인수로 취하거나 함수를 결과로 반환하는 함수 (출처: wikipedia)

 

인자로 함수를 넘겨줄 때에는 인자로 사용할 함수 앞에 '::' (클론 2개)를 붙여서 사용한다.

 

인자에 함수를 넣을 때는 넣는 함수의 인자의 자료형과 반환 값의 타입을 작성해야한다.

 

' 함수이름 : (인자1 타입, 인자2 타입, ... ) -> 반환 타입 '

 

 

 

다음의 예시는 인자로 함수를 넘겨준 예시이다.

fun main() {
    fun2(::fun1, 3)
}
fun fun1 (n1: Int, n2: Int) : Int {
    println("fun1")
    println("$n1, $n2")

    return n1 + n2
}
fun fun2 (f1: (Int, Int) -> Int, num: Int) {
    println("fun2")
    println(f1(10, 20) * num)
}

고차함수 예시 출력 결과

fun2를 호출하는데에 fun1을 인자로 사용하기 위해 앞에 클론 2개( :: )를 넣었다.

fun2 함수는 함수 1개와 정수 값 1개를 인자로 받는 함수로 그 함수의 결과값과 인자로 받은 정수 값의 곱을 출력하는 함수이다.

여기서 'f1' 은 변수 이름처럼 사용하면 된다. 인자로 받은 함수 이름을 'f1'으로 사용하겠다는 의미이다.

 

참고: Unit, Java에서의 void 타입과 같은 타입인 것 같다. 반환 타입이 없을 때는 Unit을 사용하면 된다.


람다 함수 (Lambda Function)

 

익명 함수(Anonymous Function)를 지칭한다.

위의 고차함수 예시에서 fun1 함수는 굳이 함수이름까지 붙여서 사용할 필요가 없어 보인다.

사실 println() 구문은 호출 순서를 확인하기 위해 넣은 것이고 단순히 n1 + n2 를 반환하는 함수이다.

 

타입 이름 : (인자1 타입, 인자2 타입, ... ) -> 반환 타입 = { 실행할 구문 }

 

마치 변수에 함수를 할당하는 것처럼 보인다.

함수를 따로 생성해서 그 함수를 인자로 넘겨줄때와 다르게 클론을 붙일 필요가 없다.

만약 반환 타입이 있다면(=반환 타입이 Unit이 아니라면) 실행할 구문에서 마지막 구문이 return문이 된다.

 

fun main() {
    val t : (String) -> Unit = { println(it)}
    t("Test")

    val a : (Int, Int) -> Int = { n1 : Int, n2 : Int -> n1 + n2}
    fun2(a, 3)
}

fun fun2 (f1: (Int, Int) -> Int, num: Int) {
    println(f1(10, 20) * num)
}

람다 함수 예시 출력 결과

2개를 예시로 했다.

t에서 인자가 String 타입 하나밖에 없으므로 {}에서 it으로 대체할 수 있다. 

t에서 return 타입이 Unit 이므로 따로 반환하는 값이 없다.

 

a에서 return 타입이 Int 이므로 n1 + n2 구문이 return 구문이 된다.

a가 람다 함수 형식으로 되있으므로 fun2(a, 3) 에서 단순히 고차 함수일 때와 다르게 클론을 붙이지 않았다.

 

'Language > Kotlin' 카테고리의 다른 글

Kotlin 스코프 함수  (0) 2021.01.02
Kotlin 인터페이스  (0) 2021.01.02
Kotlin 클래스  (0) 2020.12.30
Kotlin 접근 제어자  (0) 2020.12.30
Kotlin 조건문/반복문  (0) 2020.12.30