함수형 프로그래밍
함수형 프로그래밍이란?
- 부수효과 없이 순수함수만을 사용하는 프로그래밍 방식
- 클린코드의 Robert C.Martin에 의하면 대입문이 없는 프로그래밍 방식
최근 읽은 함수형 코딩책[2]에서는 프로그램을 순수함수, 계산, 액션 3가지로 나눈다.
간단하게 요약하면 순수함수( 책에서는 계산이라고 언급한다.)는 같은 인력값을 가지고 항상 같은 결과값을 반환하는 함수로, 내부적으로 사이드 이펙트를 발생시키지 않는 함수이다.
예시를 들면 숫자 리스트에서 최댓값을 찾는 함수는 다음과 같다. 아래 함수는 여러번 실행한다고 하여도 사이드 이펙트가 없다.
private Integer getMaxNum(List<Integer> input){
return input.stream().max(Integer::compareTo).get();
}
액션은 실행 시점이나 횟수에 의존하는 함수이다. 다른 말로 부수 효과, 순수하지 않은 함수라고 부른다. 이메일 발송 , DB 쿼리 모두 액션에 속한다. 예시를 들면 이메일 발송을 여러 번한 결과는 당연히 메일이 여러번 축적될것이다. 즉 어떤 상태값을 변경하거나, 누적시키는 함수라고도 생각할 수 있다.
아래의 함수는 어떨까? 최댓값을 찾아서, 이를 특정 사용자에게 메일로 보내주는 기능을 상상해보면 이 함수는 실행될떄마다 사용자에게 메일이 발송된다. 즉 저자에 따르면 액션이 분류될수 있을것이다.
private void getMaxNumAndSendMail(List<Integer> input){
int maxNum = input.stream().max(Integer::compareTo).get();
mailService.sendMail(maxNum);
}
함수형 프로그래밍을 왜 해야 하는가?
그렇다면 이렇게 책에서 강조하고 있는 순수함수(계산)와 그렇지 않은 액션(비순수함수)를 분류해서 어떤 장점이 있을까?
-
순수함수는 분산 시스템과 어울린다. 시간에 따라 출력값이 바뀌는 액션(즉 실행 시점이나 실행 횟수에 종속적인 코드)이 아니기 떄문에 발생할 수 있는 잠재적인 버그를 막을 수 있다.
-
순수함수는 재사용이 용이하다. 함수를 가져다 쓰는 입장에서도 해당 함수 내부적으로 사이드 이펙트가 있다면 재사용을 할떄 신중해야 할것이다. 물론 어떤 함수든 막 사용해야 한다는 말은 아니지만, 의도치 않는 동작을 하는 케이스를 줄일 수 있을것이다.