본문 바로가기
Android/Kotlin

[Kotlin] Higher-Order Function, Lambda(고차 함수와 람다)

by Dani K 2021. 9. 7.

 

Higher-Order Function

고차 함수(Higher-Order Function)는 Functional Programming을 할 때 많이 사용한다.

아래 중 하나 이상을 만족하면 고차 함수로 볼 수 있다.

 

•  함수를 인자로 받는다.

•  함수를 결과로 반환한다.

 

Java 8 ver.에서 람다를 발표하기 이전에는 함수를 매개변수로 전달하기 위해 해당 함수가 선언된 인터페이스를 구현한 클래스를 정의하고 객체를 생성하여 그 객체를 매개변수로 전달하는 방법을 주로 사용했다.

 

Java에서 많이 봤던 setOnclickListner 같은 콜백 함수가 고차 함수에 속한다.

 

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    }
});

 

Lambda Expression

 

 

 

람다 함수는 중괄호({ }) 안에 매개변수와 함수 내용을 선언하는 함수로 아래 규칙에 따라 정의한다.

 

•  람다 함수는 항상 { }으로 감싸서 표현해야 한다.

•  { } 안에 -> 표시가 있으며 -> 왼쪽은 매개변수, 오른쪽은 함수 내용이다.

•  매개변수 타입을 선언해야 하며 추론할 수 있을 때는 생략할 수 있다.

•  함수의 반환값은 함수 내용의 마지막 표현식이다.

 

람다식의 기본 구문 형태이다.

 

val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }

 

위의 예제 코드에서 생략 가능한 코드를 모두 생략한다면 아래의 형식이 된다.

 

val sum = { x, y -> x + y }

 

예)

 

fun sum(a: Int, b: Int, div: (Int, Int) -> Int){
    return a + b + div(20, 10)
}

fun main(){
    val result = sum(1, 2, {x, y -> x / y})
    println("result = $result")
}

// result = 5

 

고차 함수에서는 람다식의 형식 ex) (Int, Int) -> Int 을 반드시 명시해야 하며,

고차 함수에 명시된 형식과 동일한 형식의 람다식만 전달할 수 있다.

 

 

댓글