본문 바로가기
개발자

[개념] 함수형 프로그래밍

by hs_seo 2018. 6. 27.

함수형 언어

함수형 언어는 함수형 프로그래밍의 패러다임을 따르는 프로그래밍 언어입니다. LISP, Clojure, Erlang 등이 있고, 최근에는 함수형 언어가 아닌 C#, Java같은 객체지향언어에서도 람다 함수의 도입을 통해 함수형 프로그래밍을 지원할 수 있도록 노력하고 있습니다.


함수형 프로그래밍

함수형 프로그래밍은 프로그래밍 패러다임의 하나로 자료 처리를 수학적 함수의 계산으로 취급하고 상태 변화와 가변 데이터를 피하는 것입니다.

순수 함수와 보조 함수의 조합을 이용해서 로직 내에 존재하는 조건문과 반복문을 제거하여 복잡성을 없애고, 변수의 사용을 억제하여 상태 변경을 피하고자 하는 패러다임입니다. 조건문과 반복문은 로직의 흐름을 이해하기 어렵게 하여 가독성을 해치고, 변수의 값은 누군가에 의해 언제든지 변경 될 수 있어 오류 발생의 근본적인 원인이 될 수 있기 대문입니다.

함수형 프로그래밍은 함수형 언어가 제공하는 다음의 특징을 이용합니다.


순수 함수(pure function)

함수의 실행이 외부에 영향을 끼치지 않는 함수입니다. 외부에 영향을 미치지 않기 때문에 스레드-세이프하고, 병렬 계산이 가능합니다.

다음의 add 함수는 외부 변수에 영향을 주지 않기 때문에 스레드-세이프하고, 병렬로 처리 되어도 외부에 영향을 주지 않습니다.

public int add(int a, int b) {
  return a + b;
}

익명 함수(anonymous function)

전통적인 명령형 언어는 함수에 이름이 있어야 합니다. 함수형 언어는 선언부가 없는 익명 함수를 생성하여 코드 길이를 줄이고, 프로그래밍 로직에 집중할 수 있습니다.

다음과 같이 reduce 함수의 입력값으로 익명 함수를 제공하여 값을 처리할 수 있습니다.

Arrays.asList(1,2,3).stream().reduce((a,b)-> a-b).get(); 

고차함수(higher-order function)

함수를 인수로 취하는 함수입니다. 함수를 입력 파라미터나 출력 값으로 처리할 수 있습니다.

Collections.sort(new ArrayList<Integer>(), (x, y) -> x >= y ? -1 : 1);


반응형