Kotiln

[Kotlin] 고차 함수

블린더르 2020. 6. 30. 14:53

고차 함수 정의

고차 함수 는 다른 함수를 인자로 받거나 함수를 반환하는 함수이다.

표준 라이브러리 함수인 filter 는 술어 함수를 인자로 받으므로 고차 함수이다.

함수 타입

함수 타입을 정의하려면 함수 파라미터의 타입을 괄호 안에 넣고 그 뒤에 화살표 -> 를 추가한 다음, 함수의 반환 타입을 지정한다.

(Int, String) -> Unit

함수 타입에서도 반환 타입을 nullable로 지정할 수 있다.

val canReturnNull: (Int) -> Int? = {null}

함수 타입 전체가 null이 되게 선언할 수도 있다.

val funOrNull: ((Int, Int) -> Int)? = null

함수 타입에서 파라미터 이름을 지정할 수도 있다.

fun performRequest(url: String, callback: (code:Int, content: String) -> Unit){
        callback(1, "abc");
};

performRequest("ab"){code, content -> 
    println(code);
    println(content);
}

>>> 1
>>> abc

함수 타입의 람다를 정의할 때 파라미터 이름이 꼭 함수 타입 선언의 파라미터 이름과 일치하지 않아도 된다.

performRequest("ab"){code, page -> 
    println(code);
    println(page);
}

인자로 받은 함수 호출

인자로 받은 함수를 호출하는 구문은 일반 함수를 호출하는 구문과 같다.

fun twoAndThree(operation: (Int, Int) -> Int){
    val result = operation(2, 3)
    println("result: $result")
}

>>> twoAndThree {a, b -> a + b}
>>> result: 5

자바에서 코틀린 함수 타입 사용

컴파일된 코드 안에서 함수 타입은 일반 인터페이스로 바뀐다.

각 인터페이스에 포함된 invoke 메소드를 호출하면 함수를 실행할 수 있다.

invoke 메소드에는 람다의 본문이 들어간다.

함수 타입을 사용하는 코틀린 함수를 자바에서도 쉽게 호출할 수 있다.

// 코틀린 선언
fun foo(bar: (Int) -> Int) {
    println(f(32))
}

// 자바
foo(number -> number + 1);
>> 43

// 자바 8 이전
foo(new Function1<Integer, Integer>(){
    @Override
    public Integer invoke(Integer bar) {
        System.out.println(bar);
        return bar + 1;
    }
}

디폴트 값을 지정한 함수 타입 파라미터

fun foo(bar: (f) -> String = {it.toString()}) {...}

nullable 함수 파라미터

fun foo(bar: ((f) -> String)? = null) {...}

함수를 반환하는 함수

fun foo() : (String) -> String {
    return {str -> "${str}foo"};
}

val func = foo()
println(func("abc"));
>>> abcfoo
반응형