Hyeyeon blog

[Android] Kotlin - Higher-order Function 본문

개발/Android

[Android] Kotlin - Higher-order Function

Hyeyeon.P 2019. 1. 30. 14:03
반응형

# 함수형 프로그래밍

: 함수의 응용을 강조하는 프로그래밍 패러다임

# 함수형 인터페이스

: 추상 메서드 1개를 가진 인터페이스

# 람다식 (Lambda Expression)

  • 람다 함수(Lambda function), 익명 함수(Anonymous function)를 지칭하는 용어
  • 프로그래밍에서 식별 값 없이 실행할 수 있는 함수 표현 방법
  • 함수형 인터페이스를 사용하여 람다식을 사용
  • 객체 생성 없이 함수를 호출 하듯 바로 사용

# 함수 타입 (Function Type)

: 함수를 저장할 수 있는 변수 타입

# 함수 리터럴 (Function Literal)

  • 함수를 나타내는 리터럴
  • 보통 '고차 함수'를 위해 사용된다.
  • (Int) -> Unit은 매개변수가 Int 타입이고 반환 타입이 Unit인 함수를 저장할 수 있는 타입이다. (이 부분이 '함수 리터럴' 이다.)
  • line6의 number: Int는 함수 리터럴의 매개변수를 나타낸다. '->'를 경계로 매개변수와 함수 내용이 분리된다.
    1. * 만약 매개변수가 없는 함수 리터럴을 만들고 싶다면, 'number: Int ->' 부분 없이 함수의 내용만 나오면 된다.
  • 함수 리터럴은 return을 적지 않는다. 마지막 라인에 a+10을 적으면, a+10이 반환 값이 된다.
  • val instantFunc: (Int) -> Unit
    instantFunc = {number: Int -> 
        println("Hello $number")
    }
    
    instantFunc(33)
    

  • 일반적으로는 ()로 바로 함수를 호출하지만, 변수가 Nullable일 때는 invoke를 통해서 호출하는 편이 instantFunc?.invoke(33)과 같이 쓸 수 있으므로 Null 처리를 하기 편해진다.
  • val instantFunc: ((Int) -> Unit)?
    ...
    instantFunc?.invoke(33)
    

#고차 함수 (Higher-order Function)

  • 인수를 함수로 받거나, 함수를 반환하는 함수
  • 만약 고차 함수의 매개 변수가 여러 개이고, 함수 타입의 매개 변수가 맨 마지막에 온다면, 일반 인수들만 소괄호로 감사고, 함수 리터럴은 바깥으로 뺄 수 있다.
    1. ※ [초보자를 위한 코틀린 200제] 에서 발췌한 예제 코드 입니다.
      (1) ()->Unit 타입의 함수를 인수로 받는 고차 함수 decorate()를 선언
      (2) task 매개변수가 가리키는 함수를 호출하고 있다.
      (3) decorate 함수에 함수 리터럴 인수로 전달하고 있다.
    fun decorate(task: () -> Unit){
        println("===작업 시작===")
        task()
        println("===작업 종료===")
    }
    
    fun main(args: Array){
        decorate({
            val a = 10; val b = 5
            println("$a + $b = ${a+b}")
        })
        decorate({
            println("some"); println("tasks")
        })
    }
  • 실행 결과
  • ===작업 시작===
    10 + 5 = 15
    ===작업 종료===
    ===작업 시작===
    some
    tasks
    ===작업 종료===
    


[참고 및 출처]

[Function Type vs Function literal vs Lambda expression vs Anonymous Function]

[자바 함수형 인터페이스와 람다식 1편]

[초보자를 위한 코틀린 200제]

728x90
Comments