‘함수형’으로 코드를 짜는 것은 설계 트레이드오프, 재사용할 수 있는 여러 빌딩블록, 그리고 다른 여러 가지의 통찰력과 연결된다.

스칼라나 클로저에 관심이 없고, 지금 사용하는 언어로 앞으로 평생 개발해도 상관없다고 생각하더라도, 언어는 당신 발밑에서 점점 함수형으로 바뀔 것이다. 사용하는 언어에 나중에 함수형 패러다임이 도입되었을 때(이것은 필연이다) 잘 사용하려면, 지금 배워야 한다. 이제 왜 모든 언어가 점차적으로 함수형이 되어가는지를 알아보자.

1.1 패러다임 전환

명령형 프로그래밍을 하다 보면 효율을 높이기 위해서 여러 작업을 한 루프에 넣음으로써, 작업들을 복잡하게 하는 경우가 종종 있다. 함수형 프로그래밍에서는 map()이나 filter() 같은 고계함수를 통해 추상화의 단계를 높여서 문제를 더욱 명료하게 볼 수 있다.

1.2 언어 트렌드에 발맞추기

주요 언어들이 변화하는 것을 보면, 모두 다 함수형 기능을 더하고 있다. 그루비는 계속해서 메모이제이션 같은 고급 기능을 포함한 함수형 기능을 추가해왔다. 마침내 자바8에 람다 블록이 도입되었듯, 자바조차도 함수형 기능이 추가되기 시작했다. 그리고 가장 보편화된 언어라고 할 수 있는 자바스크립트에는 이미 많은 함수형 기능이 들어 있다.

1.3 언어/런타임에 제어를 양도하기

시간이 갈수록 개발자는 지루한 일들을 언어나 런타임에 점점 더 맡기게 된다. 애플리케이션을 만들면서 직접 메모리를 제어하지 않는다는 것을 조금도 후회하지 않는다. 그런 일에 무관심 해졌기 때문에 좀 더 중요한 문제들에 집중할 수 있다. 자바가 메모리 관리 작업을 쉽게 해줬다면, 함수형 프로그래밍 언어는 다른 빌딩블록들을 고수준 추상적 개념으로 대체해준다.

1.4 간결함

객체지향 프로그래밍은 움직이는 부분을 캡슐화하여 코드 이해를 돕고, 함수형 프로그래밍은 움직이는 부분을 최소화하여 코드 이해를 돕는다. - 마이클 페더스

객체지향 프로그래밍(OOP) 구조에 대해 생각해보라. 캡슐화, 스코핑, 가시성 등의 메커니즘은 상태(state) 변화를 누가 볼 수 있는지에 대한 세밀한 제어를 위해 존재한다. 상태에 스레드까지 곁들이면 골칫덩이는 더욱 커진다. 이렇나 메커니즘이 바로 페더스가 말하는 ‘움직이는 부분’을 아예 제거하는 데 주력한다. 언어가 오류가 발생하기 쉬운 기능을 적게 노출하면 개발자가 오류를 만들 가능성이 줄어든다는 이론에 따른 것이다.

OOP의 세계에서는 고유한 자료구조를 작성하는 것을 권장한다. 그 자료구조에 특정 동작을 메서드의 형태로 부착해서 말이다. 함수형 프로그래밍 언어는 같은 방식으로 재사용을 달성하려 하지 않고, 최적화된 동작으로 몇몇 자료구조(list, set, map)를 이용하는 방식의 재사용을 선호한다. 개발자가 이런 방법을 잘 사용하려면, 특정 용도로 정의된 방법에 자료구조와 고계함수를 함께 넣어야 한다.

함수형 개발자는 적은 수의 자료구조와 그것들을 잘 이해하기 위한 최적화된 방법을 만들기를 선호한다. 객체지향형 개발자는 항상 새로운 자료구조와 그것에 부착된 메서드를 만든다. 클래스와 통신 메시지를 만드는 것이 지배적인 객체지향 패러다임이다. 모든 자료구조를 캡슐화하면 메서드 수준의 재사용보다는 큰 프레임워크 스타일의 재사용을 선호하게 된다. 함수형 프로그래밍 구조는 세부적인 단계에서 쉽게 코드를 재사용할 수 있게 한다.

자바를 사용할 때는 null 때문에 문제가 많이 발생한다. null은 제대로 된 리턴 값인가, 아니면 값이 없다는 뜻인가? 스칼라를 포함한 많은 함수형 언어는 Option 클래스를 사용하여 이런 모호함을 피한다. Option 클래스는 리턴 값이 없음을 표현하는 None과 리턴 값을 포함하는 Some을 포함한다.

Reference

함수형 사고