함수형 프로그래밍과 객체지향 프로그래밍

함수형 프로그래밍과 객체지향 프로그래밍

#OOP #Functional #Object-Oriented


함수형 프로그래밍이란?

함수형 프로그래밍은 1930년대 미국의 수학자 알론조 처치(Alonzo Church)가 개발한 람다 대수(lambda calculus)에서 시작한다고 볼 수 있습니다.

람다 대수(lambda calculus)란,
이론 컴퓨터 과학 및 수리 논리학에서 함수 정의와 적용
그리고 귀납적 함수를 추상화한 형식 체계를 말한다.

포트란과 알골 언어처럼 상태의 변화를 강조하는 명령형 프로그래밍(Imperative Programming)과 다르게 함수형 프로그래밍에서는 함수의 응용을 강조합니다.

그러니까, 자료 처리를 수학적인 함수의 계산으로 취급하고 상태와 가변적인 데이터를 배제하는 프로그래밍을 말합니다. 실행 순서를 지정할 필요가 없기 때문에 비절차형 언어라고도 합니다.

함수형 프로그래밍 언어에는 하스켈(Haskell), 스킴(Scheme) 등이 있습니다.



객체지향 프로그래밍이란?

1960에 유행한 시뮬레이션 언어 SIMURA에서 그 시작을 찾을 수 있습니다.

모든 데이터를 객체(Object)로 취급하고
처리 요청을 받은 객체가 자기 안에 있는 기능을 가지고 처리한다.

실제의 세계를 나타내는 객체지향 프로그래밍(Object-Oriented Programming)은 캡슐화, 상속, 다형성의 특징이 있으며 절차지향 프로그래밍(Procedure-Oriented Programming)과 자주 비교되곤 합니다.

코드의 라인 수가 증가하면 재사용과 유지보수에 어려움이 급격하게 증가하는데 반해, 객체지향 프로그래밍은 모듈 재사용 등으로 인해 확장 및 유지 보수에 상대적으로 용이합니다.

객체지향 프로그래밍 언어에는 자바(Java), 스몰토크(Smalltalk) 등이 있습니다.



함수형과 객체지향, 어떻게 비교할 수 있을까?

언어의 관점에서 보면 일급 객체(또는 일급 시민, 일급 엔티티)을 생각해볼 수 있습니다.

컴퓨터 프로그래밍 언어 디자인에서 특정 언어의 일급 객체라 함은 일반적으로 다른 객체들에 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 여기서 연산이란 함수에 매개변수로 넘기기, 변수에 대입하기 등을 말한다.- Wikipedia

함수형 언어에서는 함수(Function) 자체가 일급 객체가 되겠지만, 객체지향 언어에서는 클래스(또는 객체, Object)가 일급 객체가 됩니다.

일급 객체의 조건에 대해서 Wikipedia를 인용해보자면

  • 변수나 데이터 구조(자료 구조) 안에 담을 수 있다.
  • (하위 루틴의) 파라미터로 전달할 수 있다.
  • (하위 루틴의) 반환 값(Return Value)로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.

절차지향 프로그래밍의 단점을 극복하기 위해서 객체지향 프로그래밍이 등장했다면, 함수형 프로그래밍은 객체지향 프로그래밍의 단점을 극복하기 위해서 등장했습니다.

예를 들면, 객체지향은 프로그램을 상호작용(interaction)하는 객체들의 집합으로 볼 수 있지만, 함수형은 상태 값을 지니지 않는 함수 값들의 연속으로 생각할 수 있게 합니다.