함수형 프로그래밍이란?
함수형 프로그래밍은 1930년대 미국의 수학자 알론조 처치(Alonzo Church)가 개발한 람다 대수(lambda calculus)에서 시작한다고 볼 수 있습니다.
포트란과 알골 언어처럼 상태의 변화를 강조하는 명령형 프로그래밍(Imperative Programming)과 다르게 함수형 프로그래밍에서는 함수의 응용을 강조합니다.
그러니까, 자료 처리를 수학적인 함수의 계산으로 취급하고 상태와 가변적인 데이터를 배제하는 프로그래밍을 말합니다. 실행 순서를 지정할 필요가 없기 때문에 비절차형 언어라고도 합니다.
함수형 프로그래밍 언어에는 하스켈(Haskell), 스킴(Scheme) 등이 있습니다.
객체지향 프로그래밍이란?
1960에 유행한 시뮬레이션 언어 SIMURA에서 그 시작을 찾을 수 있습니다.
실제의 세계를 나타내는 객체지향 프로그래밍(Object-Oriented Programming)은 캡슐화, 상속, 다형성의 특징이 있으며 절차지향 프로그래밍(Procedure-Oriented Programming)과 자주 비교되곤 합니다.
코드의 라인 수가 증가하면 재사용과 유지보수에 어려움이 급격하게 증가하는데 반해, 객체지향 프로그래밍은 모듈 재사용 등으로 인해 확장 및 유지 보수에 상대적으로 용이합니다.
객체지향 프로그래밍 언어에는 자바(Java), 스몰토크(Smalltalk) 등이 있습니다.
함수형과 객체지향, 어떻게 비교할 수 있을까?
언어의 관점에서 보면 일급 객체(또는 일급 시민, 일급 엔티티)을 생각해볼 수 있습니다.
함수형 언어에서는 함수(Function) 자체가 일급 객체가 되겠지만, 객체지향 언어에서는 클래스(또는 객체, Object)가 일급 객체가 됩니다.
일급 객체의 조건에 대해서 Wikipedia를 인용해보자면
- 변수나 데이터 구조(자료 구조) 안에 담을 수 있다.
- (하위 루틴의) 파라미터로 전달할 수 있다.
- (하위 루틴의) 반환 값(Return Value)로 사용할 수 있다.
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
절차지향 프로그래밍의 단점을 극복하기 위해서 객체지향 프로그래밍이 등장했다면, 함수형 프로그래밍은 객체지향 프로그래밍의 단점을 극복하기 위해서 등장했습니다.
예를 들면, 객체지향은 프로그램을 상호작용(interaction)하는 객체들의 집합으로 볼 수 있지만, 함수형은 상태 값을 지니지 않는 함수 값들의 연속으로 생각할 수 있게 합니다.