가끔 함수형 프로그래밍을 공부한다, 함수형 패러다임은 어렵다는 글이 보임. 내 지식 수준이 얕아설지는 모르겠지만 난 함수형이라는 단어가 어렵게 느껴지지는 않기에 내 나름의 설명을 시도해봄.


객체 지향 개념은 보통 알고 계실 거임. 난 이걸 프로그램 조립의 기본 단위를 객체로 본다고 해석함. 메서드나 표현식이 아니라 객체고, 프로그램을 수정할 때 맨 먼저 생각해야 하는 게 메서드의 수정이 아니라 클래스를 새로 만들어야 하나? 부터 시작하는 거라고 봄. 보통 귀찮아서 그러진 않지만.

위 관점에서 보면 함수형을 생각하기 쉬워짐. 함수 지향이라고 하면 당연히 함수를 프로그램 조립의 기본 단위로 보는 거라고 생각할 수 있음.
여기서 함수는 수학의 순수 함수를 말함. 즉 동일한 입력에 대해 항상 동일한 출력을 보장하는 예측하기 쉬운 함수를 의미함. C의 함수는 가령 사용자의 입력 등에 따라 결과값이 달라질 수 있기 때문에 여기서 말하는 함수가 아닐 때가 있음.

이제 함수형 프로그래밍 언어의 정의를 생각해 보면 '순수 함수를 프로그램 조립의 기본 단위로 삼고 순수 함수 조립 위주의 편의성을 강조한 언어'라고 볼 수 있음.


여기까지가 내가 생각하는 핵심이고 나머지는 부수적으로 딸려 나온다고 생각함. 보통 '함수형'으로 구글링해서 나오는 포스트들은 이 부수적 장점들을 주로 설명하는 것 같았음. 순수 함수를 구분해서 부수 효과를 격리하고, 덕분에 참조 투명성을 얻어서 함수의 1등 객체화와 느긋한 평가, 부수 효과의 명문화, 쉬운 병렬 프로그래밍을 달성하는 것 등등.

그런데 함정은 내가 방금 적은 것 중 함수형 프로그래밍의 장점이 아닌 것도 있다는 거임. 보통 하스켈의 장점과 혼동하곤 하는데 하스켈은 함수 지향 말고도 강 타입 시스템과 여러가지 선택이 들어간 결과라서 이걸로 함수형 프로그래밍의 장점을 설명하면 혼란이 올 수 밖에 없다고 생각함. 함수를 활용하더라도 어떻게 활용할지는 언어 나름이니까.

그러니 오롯한 함수 지향의 장점은 재사용 단위가 좀 더 잘게 쪼개지는 것까지만으로 볼 수 있음. 위에서 말한 다른 장점은 가능성이 열리는 정도라고 보면 됨. 이 가능성을 얼마나 실현해 줄지는 프로그래밍 언어와 프로그래머 재량이라고 봄.


함수형 프로그래밍 공부가 어렵다는 건 한국어 자료와 영어 자료 퀄리티 차이가 큰 것도 한몫 하는 것 같음. 영어 자료도 퀄리티 좋은 걸 찾기 쉬운 게 아닌데 한국어 자료는 양까지도 적음… 좋은 자료도 상당할 텐데 구글링하면 좋은 자료가 나오는 건 아닌듯. 좋은 큐레이션, 어썸 목록이 있으면 잘 공유가 돼야 하는데.


가끔 OOP를 지양하고 함수형으로 가야한다는 의견도 보이는데 이런 주장은 해석 자체가 어려워서 구체적인 예시가 필요하다고 생각함. 가령 위에서 말한 재사용 단위를 작게 코딩해야 한다고 하거나. 그럼 상대방도 자동완성의 장점을 살리면서 쪼갤 수 있는 방법이 있나 하는 식으로 더 얘기를 진행할 수 있을 테니. 다른 해석으론 순수 코드와 비순수 코드를 나누면서 코딩해야 한다는 것도 있겠지. 둘 중에 어떻게 해석해야 할진 쓴 사람 아니고선 모름.
C패밀리의 OOP는 this 문맥이랑 인자로 받은 각 객체의 문맥을 가졌다고 볼 수 있음. 하스켈로 오면 이건 중첩된 모나드가 될 뿐임. 순수 함수형인 하스켈이 이 부분에서 고질적인 문제를 가지고 있으니 무턱대고 이 부분을 함수형으로 바꾸라고 하면 오히려 누워서 침뱉기가 되는 경우도 있음.

OOP랑 함수형은 보통 섞여쓰이곤 함. 프로그램 조립의 기본 단위를 객체로 하는 것도 피곤하다는 건 람다를 써본 사람들이 체감할 거임. OOP 언어도 코드의 일부분에 국한해서 보면 함수형처럼 작성된 부분도 있을 수 있고 둘은 공존 불가능한 형태가 아니라는 거임. 뭐 하나로 통일하는 것도 좋겠지만 그건 각자 생각할 문제고.