이미 알고있는 함수형 프로그래밍 01

Written on December 19, 2016

지난 몇주간 머릿속으로 구상만 하던 글감이다. 글로 잘 옮길 수 있을지 모르겠지만 최대한 노력해보자.


개발자라면 이제 함수형 프로그래밍에 대해 한 번은 들어봤을 것이다.
자바 개발자라면 JAVA8에서 함수형 프로그래밍이 도입되었다는 걸 알테고, 자바스크립트 개발자라면 자바스크립트는 원래 함수형이었다고 생각할지도 모르고, 파이선 개발자라면 함수형이 좋다는건 아는데 파이선에서 함수형으로 개발을 한다면 어떻게 해야할지 깜깜할 것이다.
리스프 진영이라면 이미 함수형에 익숙할테고, 하스켈 개발자라면 함수형이란 단어에 진저리난 상태일지도 모르고, 오카멜 개발자라면 함수형 그 다음을 생각하고 있을지 모른다.
어쨌든 함수형 프로그래밍이라는 단어는 개발자들 사이에서 널리 쓰이고 있다.

그런데 함수형 프로그래밍의 정의가 무엇인지 물으면, 사람들의 의견이 분분한 것 같다.
함수형 프로그래밍의 정의에 대해서 어떤 사람은 순수함수를 쓰는게 함수형 프로그래밍이라고 말한다(일단 순수함수라는 단어도 직관적이지 않다. 순수한 함수는 뭐고 순수하지 않은 함수는 뭔가? 처음 접하는 사람에게 의문을 더하는 정의이다).
어떤 사람은 불변형(immutable) 자료형을 쓰는 거라고(불변형이 뭐지?), 어떤 사람은 람다함수/익명함수를 쓰는거라고 말한다(람다는 또 뭐람).
어떤 사람은 map, reduce같은 고차함수(…)를 쓰는거라고, 어떤 사람은 1급함수(그럼 2급도 있나?)라고, 어떤 사람은 커링(currying)을 쓰는거라고 말할지도 모른다.

이 정도까지 들으면 나같은 함수형 프로그래밍 초급자는, 도대체 이놈의 함수형이 뭐가 좋길래 이 수많은 용어의 벽을 넘고 넘어서 써야만 하는가라고 묻기 십상이다.
C/C++/C#/JAVA/PYTHON 으로 여태까지 잘 살아왔고 다 만들어 왔는데, 도대체 왜! 함수형 프로그래밍을 해야한단 말인가? 뭐가 좋아서?
이거 배우느니 걍 하던거 더 잘하는게 낫겠다..라고 생각할 정도이다.

심지어 무엇이 진정한 함수형 프로그래밍인지에 대한 논란도 있어 보인다.
지난번에 어떤 글에서 “map, reduce를 쓴다고 함수형 프로그래밍을 하고있는게 아니다”라는 말을 읽었던 적이 있다.
이 말이 맞고 틀리고를 떠나서, 함수형 프로그래밍의 ‘진정성’의 이야기까지 나오고 있다는 점에서 무슨 철학 논쟁인가 싶다.

이쯤되면 함수형 프로그래밍은 소수만 아는 밀교적인 구결, 비전에 가까워 보인다. 특히 나처럼 수학에 문외한인 사람은, ‘람다함수’가 나오는 순간 뇌가 멈추는 것 같다.
누가 가르쳐주는 사람 없이 함수형이 좋다는 이야기만 들었을때, 도대체 이 수많은 전문용어의 벽들을 넘어서 언제 함수형 프로그래밍을 이해할 수 있을까라는 의문이 드는건 당연하다.

좋긴 좋다는데, 그럼 어떻게 내 코드에 적용해야 함수형 프로그래밍의 좋은 점을 느낄 수 있을까? 어떻게 하면 그 비밀스런 혜택을 나도 받을 수 있을까? 아니 함수형 프로그래밍이 도대체 뭐지?

이런 생각이 드는 사람들을 위해 몇편의 글을 써보려 한다.
제목은 “이미 알고있는 함수형 프로그래밍”으로 정했다.
왜냐하면, 우리는 이미 함수형 프로그래밍의 기본을 알고있기 때문이다! 짜잔! 놀랍게도 사실이다.

이 글은 여러분이 이미 알고있는 함수형 프로그래밍의 지식을, 여러분이 알고있다고 스스로 깨닫게 만드려고 한다.
나는 여러분이 이미 함수형 프로그래밍을 알고있다고 믿는다. 말하자면 플라톤스러운 ‘상기’인데, 표현도 플라톤 스러운 방법으로 가려다가 필력 부족으로 그만두기로 한다.

다만 유일한 조건이 있는데, 중학교 정규 수학과정을 이수해야 한다는 점이다. 안타깝게도 초등학생은 이해하기 어려울 것이며, 중학교 수학성적이 바닥이시라면 까다로울 수 있다. 하지만 일단 한국 의무교육을 믿고 글을 써 보고자 한다.

그럼 이제부터 여러분이 이미 알고있는 함수형 프로그래밍을 깨달아보자!