본문 바로가기

프로그래밍 언어/코틀린_쌩초보를 위한 기초

쌩초보를 위한 기초_12_함수의 진화B

함수형 프로그래밍(Functional Programming)

 고차 함수(Higher-Order Function)

먼저 고차 함수를 설명하기 전에 함수형 프로그래밍에 대해 알아본다.

이전 글에서 코틀린은 객체 지향 프로그래밍 뿐만 아니라 함수형 프로그래밍을 추구한다고 했다.

함수형 프로그래밍의 목표는 같은 인자(argument)를 넣으면 항상 같은 결과를 반환하는 것이다.

한마디로 에러가 나지 않는 완전한 함수를 추구하는 것이다.

 

함수형 프로그래밍을 완성하기 위해서는 함수가 다른 객체들을 마음껏 통제할 수 있어야 하고

또한 함수를 어디에서나 활용할 수 있어야 진정한 함수형 프로그래밍을 구현할 수 있다.

 

함수를 매개변수로 사용할 수도 있고

함수를 통째로 반환(전달)할 수도 있고

변수에 함수를 넣을 수도 있어야 한다.

 

이런 수준 높은 함수(고차함수)를 구현하기 위해 만들어 놓은 기능이 여러 가지 있는데

여기서는 초보에 맞게 2가지만 간단히 살펴본다.

 

람다 표현 (lambda expression)

함수 참조 (function reference)

 

람다 표현은 익명(이름없는) 함수 타입’이라고 한다.

이름이 없고 형식(Type)이 함수 형태를 가지고 있다는 뜻이다.

함수의 형태가 화살표를 사용하는 람다 대수에서 유래했다고 해서 붙여진 이름이라 한다.

한자 '들입'자와 비슷하게 생긴  람다 기호는 옛날에 재미있게 했던 게임인 'Half Life'의 주인공 가슴에 선명하게 새겨져 있다.

 

람다 표현의 정의 형태는 아래와 같다.

 

{인자 -> 실행 코드} : { x, y -> x + y }

또는

(인자) -> 인자 : (Int, Int) -> Int

 

고차함수의 예

 

어떻게 사용한 것이 고차함수인지 예를 들어 본다.

 

1. 덧셈 함수를 만든다.

fun add(x: Int, y: Int) = x + y

 

함수 이름은 더하다(add)로 하는 것이 좋겠다.

두 수를 더하므로 매개변수도 2개이고 변수타입은 Int(정수)로 한다.

덧셈식을 한줄(oneliner)함수로 간단하게 표현하기 위해 =로 바로 연결한다.

한줄함수는 앞 글에서 설명했다.

 

2. main()함수 안에 변수(addResult)를 만들고

add함수로 계산값을 전달받아 변수(addResult)에 저장한다.

 

 

3. 더하기 결과(AddResult)를 출력해서 확인해 보자.

 

 

4. 이번에는 곱셈 함수를 만든다.

더하기 함수 아래에 만들자.

fun multiply(x: Int, y: Int) = x * y

 

함수 이름은 곱하다(multiply)로 한다.

매개변수 개수와 변수타입은 add함수와 같다.

 

5. main()함수 안에 변수(mulRes)를 만들고

이번에는 계산값으로 전달받을 매개변수에 add함수를 사용한다.

 

 

곱하기 결과(MultiplyResult)도 추가해서 출력 해보자.

 

 

방금 만들어 본 코드의 핵심은

변수 mulResult에 넣을 값으로 multiply함수를 사용했다는 것과

그 함수의 결과값을 반환받을 매개변수에 또 add함수를 넣었다는 것이다.

변수에 함수를 넣고 함수에 또 함수를 넣는 이런 방식이 고차함수이다.

 

초보의 입장에서는 고차함수를 사용해서 좋은 점이 무엇인지 또는 어떤 경우에 사용하지는 모르더라도 이 정도의 개념 정도만 파악하면 될 것 같다.

 

다음 글에서는 고차함수의 또 다른 예를 알아본다.

끝.