[책] 함수형 사고
얼마 전 간만에 리디북스나 한번 충전 해야겠다 싶어서 3일날 충전 후 충동적으로 구매한 책, 함수형 사고를 쉬엄 쉬엄 읽다가 오늘 한번에 몰아서 빡 읽어버렸다.
함수형 프로그래밍에 대한 열망은 임백준님의 폴리글랏 프로그래밍 추천에서 비롯되었다. 임백준님은 여러 가지 패러다임을 흡수하여 적재적소에 사용하여야 된다고 설파하셨고, 결국 그런 트랜드로 흘러갈 것임을 직감했다. 실제로 내가 자주 사용하는 언어인 C#, C++에서 주력으로 추가했던 기능들도 모두 함수형 프로그래밍에 연관된 것들이기도 했고.
이 책을 읽기 전, 나는 함수형 프로그래밍에 대한 막연한 환상 같은 것을 품고 있었다. 함수의 불변성 같은 것이 정말 철저하게 지켜지는 패러다임이겠지? 상태를 가지는 클래스를 함수형 프로그래밍은 대체 어떤 식으로 구현하는 것일까? 만약 불변성이 반드시 지켜져야 한다면 클로저는 어떻게 설명할 수 있는 것인가? 등등. 여러 질문꺼리를 안고 이 책을 펼쳤다.
결론. 이 책도 역시 완전한 함수형 프로그래밍에 대한 책이 아니었다. 생각해보면 ‘함수형 사고’라는 제목에서부터 예견된 일이었다. 객체 지향의 사고로 완전히 박혀버린 머리를 함수형으로 사고를 할 수 있게 길러주겠다는 포부였다. 뭐, 덕분에 다행히 더 재밌고 즐겁게 읽을 수 있었지만.
이 책은 기존의 해결법을 제시하며 점진적으로 함수형으로 그 객체 지향 해결법을 변화시키는 식으로 함수형 사고를 할 수 있도록 도와준다. 자바 8에서부터 그루비, 스칼라로 천천히 코드를 확인시켜가며 나아간다. 그렇게 익혀가는 것이 필터, 맵, 폴드/리듀스 같은 중첩할 수 있는 기능들에서부터 일급 함수, 클로저, 커링 / 부분 적용(c++의 std::bind 기능이다.), 쉽게 적용하는 꼬리재귀, 메모이제이션(동적 프로그래밍을 언어가 지원), 게으른 평가 등을 가르쳐준다. 커링이나 메모이제이션같은 신선한 기능들도 있었지만 결국 대부분은 내가 사용하던 기능이었기에 뭔가 조금은 김이 빠졌으나, 이 책의 진가는 뒷부분에 있었다.
이 책의 뒷부분은 전형적인 디자인 패턴들을 함수형으로 어떤 식으로 만드는 것이 좋은가, 객체 지향의 디자인 패턴과 함수형의 디자인 패턴의 비교 후 어떤 게 어떤 상황에 좋은가를 설명해주고 있었다. 굉장히 흥미로운 챕터였음. 그리고 객체 지향 외의 다른 패러다임과의 결합(예는 메타 프로그래밍이었다. 메타 프로그래밍과 함수형은 직교(서로 영향을 끼치지 않는다)라고 한다.)도 보여줌으로써 이 책이 지향하는 바를 확실히 보여줬다.
다 보고 나니 음, 뭔가. 조금은 더 자신이 생기고 시야가 넓어진 느낌. 단지 느낌만이 아니길 빌어보자. 재미있었다.