함수형 프로그래밍
함수형 프로그래밍이란?
함수적인 접근 방법으로 문제 해결을 하기 위하여 만들어졌습니다.
순수 함수를 작성하여 숨겨진 입력이나 출력을 최대한 제거하여 코드 대부분이 단지 입력과 출력의 관계를 기술하게끔 하는것을 말합니다.
물론 대부분의 프로그램은 반환 값을 얻기 위해서가 아닌 어떤 동작을 하기 위한 경우도 있기 때문에 가능한 모든 곳에서 철저하게 통제 해야 합니다.
함수형 프로그래밍 언어란?
함수형 프로그래밍 언어는 위에서 설명한 함수형 프로그래밍을 철저히 제어하기 위해 적극적으로 도와주는 언어입니다.
이를테면 자바스크립트나 자바 8버전에서도 함수형 프로그래밍을 구현 할 수는 있습니다.
하지만 함수형 프로그래밍의 특징을 철저하게 제어하지 못하기 때문에 함수형 프로그래밍 언어라고 하지는 않습니다.
대표적 함수형 프로그래밍 언어의 종류
- Lisp
- Scalar
- Closure
- haskell 등
함수형 프로그래밍의 특징
함수형 프로그램은 다음과 같은 특징을 가지고 있습니다.
- 불변 데이터(Immutable Data)
- 1급 함수(First-Class Function)
- 순수 함수(Pure Function)
불변 데이터(Immutable Data)
함수형 프로그래밍을 가능하게 하는 요소 중 하나가 바로 Immutable Data입니다.
한번 정해진 값은 바뀌지 않습니다.
List를 하나 만들어 항목을 추가/삭제 할때 추가가 필요하면 추가항목이 입력 된 List를 만들고 삭제가 필요하면 삭제항목이 제거 된 List를 만드는 식입니다.
이러한 자료구조를 Persistent Data Structure라고 부릅니다.
1급 함수(First-Class Function)
- 컴퓨터 과학자 Christopher Strachey가 만든 조어
- 함수가 런타임에도 생성
- 함수의 인자로 전달되고 함수의 결과로서 리턴되며, 변수에 할당
- 함수도 데이터처럼 구성이 가능해짐(Composability)
자바에서는 메서드가 1급으로 처리되지 않기에, 메서드만 따로 생성하거나, 메서드 자체를 생성자나 변수나 파라미터등에 전달 할 수 없습니다.
반면 자바스크립트에서는 아래와 같은 코드가 가능합니다.
function someFunc(){ ... }
otherFunc(someFunc) //함수 자체를 파라미터로 전달 가능
var a = someFunc; // 함수를 변수에 할당 가능
즉 자바스크립트에서는 함수를 1급으로 처리하고 있습니다
순수함수(Pure Function)
주어진 입력으로 계산하는 것 이외의 프로그램의 실행에 영향을 미치는 부수 효과(Side Effect)가 없는 함수를 순수 함수라고 합니다.
예를들면 count, length 함수는 임의 문자열이나 배열에 대해서 길이를 반환하며, 그 외의 일은 일어나지 않습니다.
Side Effect (부수효과)
입력받은 값의 결과를 돌려주는 것 이외의 다른 어떤 일을 수행하는것
- 변수를 수정
- 자료 구조를 제자리에서 수정
- 객체의 필드를 설정
- 예외(Exception)를 던지거나 오류를 내면서 실행 중단
- 콘솔에 출력하거나 사용자의 입력을 읽어들임
- 파일에 기록하거나 파일에서 읽어들임
- 화면에 출력
함수형 프로그래밍의 장점
- 순수 함수들로 작성하면 모듈성이 증가
- 모듈성으로 인해 생기는 장점
- 검사(Test)가 쉬워짐
- 재사용
- 병렬화
- 일반화
- 분석이 쉬워짐
- 버그가 생길 여지가 적다
- 가독성과 유지 관리 편의성이 향상
- 함수를 사용하기 때문에 반복되는 개발이 쉬워진다
왜 함수형 프로그래밍인가?
- 멀티 코어가 기본이 되면서 ‘동시성’ 처리에 함수형 프로그래밍이 강점을 보임
- 불변값을 주로 다루기 때문에 Side Effect가 적어 동시성 처리가 쉬워짐
- 코드 이해하기 쉬움
- 유지보수 쉬움
마치며
개념만보면 사실 확 와닿지 않은 부분이 많이 있습니다.
다음 포스트에서는 실제 코드로 함수형 프로그래밍에 대해서 알아 보도록 하겠습니다.
참고
msdn 함수형프로그래밍
함수형 프로그래밍 소개 - Jooyung Han
Functional Programming - 양수한(slideshare)
Gilderwiki
1급(first-class)의 의미 - 자바캔
순수함수 - 잉여개발자