본문 바로가기
Kotlin

[깡샘의 코틀린 프로그래밍] 정리 13 - 고차 함수

by 들풀민들레 2018. 3. 2.

본 글은 [깡샘의 코틀린 프로그래밍 - 루비페이퍼] 의 내용을 발췌한 것입니다.

좀더 자세한 내용은 책을 통해 확인해 주세요.

 

 

 

13장. 고차함수와 인라인 함수

 

13.1.1. 고차 함수란?

 

고차 함수(High-Order Function, 고계 함수라고도 합니다)란, 매개변수로 함수를 전달받거나 함수를 반환하는 함수를 말합니다. 일반적인 함수는 매개변수와 반환값이 데이터입니다

 

01 fun normalFun(x1: Int, x2: Int): Int{

02   return x1 + x2

03 }

 

위의 소스는 일반 함수의 정의법입니다. Int 타입인 두 개의 매개변수를 전달받고 함수의 실행 결과로 Int 타입의 데이터를 반환합니다. 매개변수와 반환값이 데이터입니다. 그런데 고차 함수는 매개변수와 반환에 함수를 이용할 수 있는 특징이 있습니다

 

01 fun hoFun(x1: Int, argFun: (Int) -> Int){

02   val result = argFun(10)

03   println("x1 : $x1, someFun1 : $result")

04 }

05

06 hoFun(10, {x -> x * x })

 

위의 소스에서는 fun 예약어와 hoFun이라는 함수명 그리고 ( ) 안에 매개변수, { } 안에 함수 내용을 선언했습니다. 일반 함수 선언과 같습니다. 그런데 매개변수 부분이 일반 함수와 차이가 있습니다. 두 개의 매개변수 중 하나는 x1: Int로 작성하여 정수 데이터로 선언했는데, 두 번째 매개변수는 argFun: (Int) -> Int로 선언했습니다. 매개변수로 함수를 받고자 함수 타입을 선언한 것입니다.

 

코틀린에서는 일반적으로 데이터 타입을 선언할 때 x1: Int 형태로 콜론( : )을 기준으로 왼쪽에 변수명과 오른쪽에 타입을 명시합니다. argFun: (Int) -> Int 코드는 일반적인 데이터 타입 선언과 같은 형태로 함수 타입을 선언한 것인데 콜론 오른쪽이 타입입니다. (Int) -> Int이므로 Int 타입 매개변수 하나와 반환값이 Int 타입인 함수라는 의미입니다. 즉, 이 타입에 맞는 함수를 매개변수로 받을 수 있다는 선언 입니다. 또한, 콜론 왼쪽은 이 타입으로 대입받은 함수를 argFun이라는 이름으로 이용하겠다는 의미입니다.

 

이처럼 매개변수로 함수를 대입받는 함수를 고차 함수라 합니다. 앞의 소스 06번 줄에서 고차 함수를 호출하면서 두 개의 인수를 전달했습니다. 첫 번째 인수는 숫자 데이터이며 두 번째 인수는 함수입니다. hoFun( ) 함수가 두 번째 매개변수를 함수 타입으로 선언했으므로 해당 타입에 맞추어 함수를 전달했는데, 이때 람다 함수를 이용했습니다.

 

위의 고차 함수 선언과 호출을 좀 더 명료하게 그림으로 설명하면 다음과 같습니다

 

 

결국, 고차 함수 내에서 매개변수로 함수 타입을 선언하고 고차 함수를 호출하는 곳에서 람다 함수를 전달하는 구조입니다. 이처럼 매개변수로 함수를 전달받거나 함수를 반환하면 해당 함수를 고차 함수라 하는데, 고차 함수를 이용하기 위한 몇 가지 기법을 살펴보겠습니다