스칼라로 배우는 함수형 프로그래밍을 읽고 정리한 글입니다.
FP는 함수를 결국 부수 효과(side effect)가 없는 순수 함수로 만드는 것을 지향한다.
이 순수성 덕분에 FP로 개발한 프로그램이 모듈성이 좋다.
모듈성이 좋다는 얘기는 결국 함수를 다른 함수와 합성이 가능하다라는 얘기이다.
순수 함수는 결국 입력에 대해 어떤 계산만 수행하고 해당 계산이 반영된 출력을 내놓을 뿐이다.
순수 함수의 입력이 주어지는 방식은 단 하나, 함수의 파라미터 뿐이다.
그리고 결과를 돌려주고서는 절대 그 결과에 대해 신경쓰지 않는다.
"나는 입력된 데이터에 대해 어떤 결과를 내놓을꺼야, 근데 너가 그 출력 데이터에 대해 어떻게 쓰든 난 상관 안해"가 핵심인 것이다.
순수 함수는 결국 입력 데이터에 대해 계산이 수행된 출력을 내 놓지만, 이제 그 출력에 대해서는 그 출력을 또 다른 입력으로 사용하는 다른 함수들의 몫이다.
결국 수학에서의 함수 합성처럼, 입력(정의역)과 출력(치역)을 가지는 순수 함수 A가 있다면 A를 사용하는 다른 순수 함수 B는 A의 치역을 자신의 정의역으로 사용한게 되는 꼴이다.
결국에 정의역 -> 치역 -> 정의역 -> 치역 -> ... 으로 이어질 수 있는 형태 때문에 합성이 쉬워지며 모듈성이 높다고 얘기하는 것이다.
하나 더 첨언하자면, 결국 모듈성이 높은 이유는 순수 함수는 부수 효과가 없어서이기도 하다.
만약 기존 순수 함수 A의 구현에 global variable을 1씩 증가시키는 코드(부수 효과)가 추가되었다고 가정해보자.
(이제 A는 더 이상 순수 함수가 아니다.)
그럼 A를 100번 호출하는 B를 사용하면, global variable이 100이 증가할 것이고,
A를 200번 호출하는 C를 사용하면, global variable이 200이 증가할 것이다.
그럼 이제 B, C를 사용하려던 다른 함수의 입장이 난해해질 것이다.
"나는 그냥 B에 입력 데이터를 넘겨서 입력에 대해 변경된 출력을 얻고 싶었을 뿐인데 B를 사용하면 global variable 값이 바뀌어 버리니 그럼 결국 이 global variable을 read하는 다른 함수들한테 영향이 가겠네?"라는 결론에 도달하게 된다.
그렇게 되면 더 이상 B, C 그리고 A는 모듈성이 좋다고 할 수 없다.
하지만 순수 함수 형태로 구현하면 이와 같은 부수 효과(side effect)가 없으므로 충분히 모듈성이 좋은, 합성 가능한 함수가 된다.