본문 바로가기

Programming Project/FunctionalProgrammingPrinciples in Scala

Lecture 2.1 - Higher-Order Functions (Functional Programming Principles in Scala / Coursera 강의 정리)


투명한 기부를 하고싶다면 이 링크로 와보세요! 🥰 (클릭!)

바이낸스(₿) 수수료 평생 20% 할인받는 링크로 가입하기! 🔥 (클릭!)

이 글에서는 functional programming에서 중요한 개념을 다른다.

High order(고차) 함수는 함수를 인수로 전달하거나 결과로 반환할 수 있다.

 

함수형 언어에 대한 한가지 특별한 점은 함수형 언어는 함수를 1급 객체로 여긴다는 것이다. 이 말은, 다른 값 처럼 함수는 파라미터로 넘겨질 수 있고, result로 반환될 수도 있다는 말이다. 이것을 통해 프로그램을 작성할 수 있는 유연한 방법이 제공된다.

함수를 매개 변수로 가져오는 함수 또는 반환하는 함수는 고차 함수(high order function)라고 불린다. 이는 일차 함수(first order function)과 반대되는 말이다.

 

예시를 보자. a와 b 사이의 모든 정수를 합한다고 가정하자.

sumInts는 범위를 입력으로 받아서 그 구간의 범위를 더하는 재귀함수이다.

그리고 이 함수를 조금 바꾸어서, cube(세제곱)를 합하는 함수로 바꾸는 것을 생각 해 보자. 기존과 로직이 동일하지만 전에 a를 사용하던 곳에서 a의 세제곱을 반환한다. 그렇지 않으면 sumInts와 동일한 것이 된다. 이 때, sumCubes는 재귀적 호출이다.

 

혹은, cube 대신 factorial의 합을 구해보자. 위의 sumFactorials는 cube를 계산한 곳에서 factorial을 계산한다는 것을 제외하고는 정확하게 일치하는 것이다. 여기에서, 위를 보면 시그마 등의 표기법을 통해서 수학에서 이를 표현하고 있는데 프로그래밍에서도 이렇게 쓸 수 있지 않을까 하는 생각을 해볼 수 있다. 우리는 공통 패턴을 단일 메서드로 뽑아낼 수 있을까?

 

 

int 형의 매개변수를 받고 int 타입을 반환하는 파라미터 f와 int a,b를 입력으로 받는 함수 sum을 정의 해 보자. 그리고 함수들을 통해서 위에서 살펴본 세가지 정의를 일반화할 수 있게 된다. 여기서 새로운 것은 sum 함수를 정의하는 패턴을 f를 매개 변수로 사용하며 재사용함으로써 함수의 재사용성을 크게 높여주었다는 점이다.

 

위에서 새로 나온 것 중 하나는 function type이다. 타입 A와 B에 대해 A=>B로 표현된다.

이전 예제를 살펴보면, 우리는 sumInts, sumCubes, sumFactorials에 대한 정의를 성공적으로 줄였다. 그치만 디테일한 부분에서 성가신 부분이 있다. 여기에서 다루는 모든 작은보조 함수들의 이름을 지정해주어야 하기 때문이다.

함수를 매개 변수를 전달하는것은 때떄로 많은 보조 함수들을 만들게 하며, 이는 소모적이다.

위의 def str = "abc"를 통해 print하는 것을 살펴보면, 위와 같이 출력하게 할 수 있지만 println("abc")를 통해 바로 출력하는 것이 더 편하다. 여기에서 string이 상수이기 때문인데, 우리 언어에서는 함수가 중요하기 때문에 함수를 위한 상수를 도입하는것을 생각 해 보아야 한다.

이 상수는 이름이 없기 때문에 익명 함수라고 불린다.

 

익명 함수는 위와 같이 적는다. 세제곱을 수행하는 함수는 위와 같이 쓸 수 있다.

이 때, x는 파라미터라고 하고 x*x*x는 함수의 body라고 한다. 

파라미터가 많은 경우 콤마로 구분하여 쓸 수  있다.

n개의 파라미터 x1~xn과 body E가 있는 익명 함수가 있다고 해 보자. 항상 이것은 def f(파라미터) = body 로 표현이 가능하다. 따라서 위 파란색 줄 두 줄은 같은 기능을 한다고 볼 수 있다.

그러므로 우리는 (기존에 있는 기능을 쉽게 쓰는 것이기 때문에) 익명 함수를 위한 syntatic sugar가 있다고 볼 수 있다.

 

 

익명 함수를 통해 위와 같이 코드를 짧게 만들 수 있다.

 

아래와 같은 Exercise를 보며 활용에 대해 살펴보자.