다른 언어들이 튜링 머신을 기초로 한 사고방식을 가진다면, 함수형 프로그래밍은 수학(Mathematics)의 사고방식과 표현 방식을 가진다고 볼 수 있다. 우리는 중학생 때 다음과 같은 함수 \(f(x)\)를 배웠다.
$$ y = f(x), {x \in \mathbb{N}, y \in \mathbb{N} } $$ $$ x \mapsto y $$ 너무 오랜만에 봐서 생소할 수도 있다. 하지만 기본적으로 어떤 \(x\)를 어떤 \(f\)에 넣으면 \(y\)가 나온다. 이런 정도만 기억하면 된다. 함수 \(f\)의 형태는 아주 간단한 형태부터 아주 복잡한 형태까지 다양하다. 함수에 대한 좀 더 자세한 사항은 함수(Function)란?에서 다루도록 하겠다.
함수형 프로그래밍은 수학적인 표현 식을 많이 차용하였기 때문에, 일반 C 또는 Java를 배웠던 프로그래머에게는 문법이나 패러다임이 조금 생소할 수 있다. 더욱이 오랫동안 객체 지향 프로그래밍에 익숙해 있던 사람에게는 함수형 프로그램을 익히는 것이 쉽지 않을 것이다. 하지만 프로그래밍을 처음 배우는 상황이라면, 약간의 수학적 지식으로 가장 쉽게 배울 수 있는 언어가 함수형 프로그래밍이라고 생각한다. 우리가 사용하는 언어(verbal language)에 비유해보자. 영어를 배우는 데는 한국어를 오랫동안 사용했던 어른보다 몇 살 안 된 꼬마가 훨씬 빠르고 쉽게 배운다. 이는 어른이 아이들보다 지적 능력이 낮아서가 아니라, 언어의 패러다임을 바꾸는 것이 그만큼 어렵기 때문이다. 어른들은 그나마 언어 패러다임이 비슷하고 같은 어족(language family)에 속하는 일본어를 배울 때 좀 더 쉽다. C++에 익숙한 사람이 Java를 금방 배우는 것이랑 비슷하다. 얼마 전 패러다임을 바꾸는 것이 얼마나 어려운 일인지 알 수 있는 동영상을 하나 보게 되어 소개하고자 한다.
우리가 일상생활에서 타는 자전거 이야기이다. 단지 핸들의 조작 방향을 반대로 바꾸어 놓았다. 그 사실을 충분히 인지하고 있고, 자전거를 조작하는 법도 너무나 당연히 알고 있기 때문에 곧 쉽게 탈 수 있을 것으로 생각했다. 그런데 이 사람이 이 자전거를 탈 수 있을 때까지 XXX나 걸렸다. (동영상에서 직접 확인하기 바란다) 이 사람은 똑같은 일을 아들에게도 시켰다. 놀랍게도 그 아들은 YYY만에 그 자전거를 탈 수 있게 되었다. 이 사람이 다시 원래 정상인 자전거를 타려고 했을 때의 일도 놀랍다. 결론은,
Knowledge is not understanding.
C++의 문법을 알고 있어도, C처럼 프로그래밍할 수 있고, Java의 문법을 알고 있다고, 모두 객체 지향 프로그래밍을 하는 것이 아니다. 그래도 함수형 프로그래밍 언어들은 함수형 프로그래밍의 패러다임을 벗어나 프로그래밍하는 것을 아주 힘들게 만들어 놓아서, 어찌 되었든 이 패러다임을 익히는 것이 편하다.
최근에는 계속해서 새로운 프로그래밍 언어가 등장하고 있고, 언제 또 새로운 패러다임이 등장할지 모르는 일이다. 그래서 새로운 언어를 배우고, 새로운 패러다임에 적응하는 능력이 어느 때보다 중요해지는 시대가 되었다. 함수형 프로그램을 익히는 일은 이런 연습을 하기에 아주 좋은 도전이다. 앞으로 Haskell
을 배우면서 함수형 프로그램에 대한 감을 익혀보자.
나는 대학교 수업시간에 위와 같은 책을 배운 적이 있다. (마법사 책이라고도 불린다) 프로그래밍의 이해(Principles of Programming)이라는 과목이었고, 내 전공이 아닌 전산학과 과목이었다. 처음 개설되는 과목이었기 때문에 과목에 대한 정보도 전혀 없었다. 1학년 필수 과목에서 C언어를 배운지 몇 달 안 되어, 프로그래밍에 대한 호기심이 많아 겁도 없이 2학년 타과 전공과목을 신청해서 들었다. 표지에 있는 lambda 기호가 아주 인상적이었다. 이 책에서는 Lisp 계열의 Scheme이라는 언어를 사용한다. 일종의 함수형 언어다. (나는 Scheme이 함수형 언어인지 최근에 알았다) 프로그래밍 언어를 배우기 시작한 지 몇 달 안 돼서 이런 수업을 접했던 게 오히려 행운이었던 것 같다. 자전거 동영상에서 그 아들과 비슷한 상황이라고 볼 수 있지 않을까? 이미 C/C++/Java에 익숙해져 있는 전산과 학생들에 비해서 학점도 좋게 받았다. 그래도 지금은 시간이 너무 오래 지나서 Scheme에는 괄호가 너무 많았다는 기억밖에 안 남았다. ㅜㅜ 어쨌든 나는 이 과목을 수강한 이후 프로그래밍을 배울 때 사고의 깊이 면에서 많은 도움이 되었다. 당시에 MIT에서 컴퓨터 기초 과목으로 이 책을 사용한다고 들었는데, 지금도 여전히 그러는지는 모르겠다. 프로그래밍의 기초를 배우는데 아주 좋은 책이라고 생각한다. 시간이 흘러 내가 대학원 생활을 하는데 MIT에서 만든 mpb라는 프로그램을 사용할 일이 있었다. (일종의 미분방정식을 푸는 프로그램이다) 근데 그 프로그램이 Scheme을 기반으로 만들어져 있었고, 나는 훨씬 쉽게 적응할 수 있었다.