ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] 고차 함수
    Kotiln 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
    반응형

    댓글

Designed by Tistory.