프로그래밍의 상태와 상태를 변경시키는 구문의 관점에서 연산을 설명하는 방식.
즉, 문제를 어떻게(how) 해결할 것인지를 설명하는 프로그래밍 방식.
절차적 프로그래밍이란 단순히 순차적인 명령 수행이 아니라 루틴, 서브루틴, 메소드, 함수 등(이를 통틀어 프로시저라고 한다.)을 이용한 프로그래밍 패러다임을 뜻한다
프로시저 콜, 즉 함수 호출을 통해서 추상화와 재사용성을 얻어내는 것이 본질이다.
함수형 프로그래밍의 관점은 순수함수와 1급객체인 함수에 관심이 있는 것이고 절차적 프로그래밍은 함수(그리고 이를 관리하는 모듈)에 의한 재사용성에 초점을 둔 것이기에 두 개념은 차이가 있다.
데이터에 대한 순서를 파악하고 필요한 기능을 함수로 만들어 절차적으로 진행시키는 방법이다.
반면에 객체지향 프로그래밍은 기능들을 묶어 하나의 객체로 만든다
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
캡슐화로 코드의 재사용성이 높다.
코드의 변경이 용이하다.
직관적인 코드분석이 가능하다.
개발속도 향상된다.
상속을 통한 장점 극대화 된다.
처리속도가 상대적으로 느림
객체가 많으면 용량이 커질 수 있다.
설계시 상대적으로 많은 시간이 필요하다.
선언적 프로그래밍은 필요한 것을 달성하는 과정을 하나하나 기술하는 것보다 필요한 것이 어떤 것인지 기술하는 데 방점을 두고 애플리케이션의 구조를 세워 나가는 프로그래밍 구조이다.
웹 페이지는 선언형인데 웹페이지는 제목, 글꼴, 본문, 그림과 같이 "무엇"이 나타나야하는지를 묘사하는 것이지 "어떤 방법으로" 컴퓨터 화면에 페이지를 나타내야 하는지를 묘사하는 것이 아니기 때문이다.
명령형 프로그램은 알고리즘을 명시하고 목표는 명시하지 않는 데 반해 선언형 프로그램은 목표를 명시하고 알고리즘을 명시하지 않는 것이다.
어떤 방법으로 해야하는지를 나타내기보다, 무엇과 같은지를 설명하는 방식
선언형 방식이 제대로 동작하기 위해서는 명령형으로 "어떻게"가 구현된 것들이 추상화되어 있어야 한다.
아래는 명령형 프로그래밍이다.
// 배열을 파라미터로 받고 각 요소들의 값에 2를 곱하는 함수
function double (arr) {
let results = []
for (let i = 0; i < arr.length; i++){
results.push(arr[i] * 2)
}
return results
}
// 배열을 파라미터로 받고 각 요소들을 합한 값을 반환하는 함수
function add (arr) {
let result = 0
for (let i = 0; i < arr.length; i++){
result += arr[i]
}
return result
}
모두 "어떻게"를 설명하고 있다. 명시적으로 배열을 반복하거나 원하는 기능을 수행하는 방법에 대한 단계를 설명하고 있다.
선언형 프로그래밍 방식으로 고쳐보도록 한다면,
function double (arr) { return arr.map((item) => item * 2) }
function add (arr) { return arr.reduce((prev, current) => prev + current, 0) }
JavaScript에 기본으로 내장된 map과 reduce 메서드를 활용했다. 이는 명령형 방식이 추상화된 것이다. 선언형 프로그래밍의 중요한 솔루션은 명령형으로 작성된 구현에 대한 추상화입니다.
"어떻게" 보다 "무엇" 이 이루어지기를 원하는지를 설명한다. (나는 map과 reduce 가 어떻게 이루어져 있는지 알지 못하고 신경 쓸 필요조차 없습니다) 그리고 상태를 변경하는 모든 지점들은 map과 reduce 메서드 안쪽으로 추상화되어 나는 직접 상태를 변경하지 않는다. 또한 위 예제들은 훨씬 가독성이 높다.
순수 함수(pure function)를 조합하고 공유 상태(shared state), 변경 가능한 데이터(mutable data) 및 부작용(side-effects) 을 피하는 기본 원칙에 따라 소프트웨어를 구성하는 프로그래밍 패러다임이다.
순수 함수란 같은 입력에 대해 항상 같은 출력을 반환하는 함수로 다음과 같은 조건을 만족하는 함수를 말합니다. 멀티쓰레드에서도 안전하고 병렬처리 및 계산도 가능합니다.
1급 함수의 서브셋으로 다음 조건을 만족하는 함수를 말합니다.
함수형 프로그램이 언어에서 함수는 1급 객체이다.
(변수에 할당, 매개변수로 전달, 반환값 가능)
함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 한다.
데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어서 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행한다.
높은 수준의 추상화를 제공한다
함수 단위의 코드 재사용이 수월하다
불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬워진다
순수함수를 구현하기 위해서는 코드의 가독성이 좋지 않을 수 있다
함수형 프로그래밍에서는 반복이 for문이 아닌 재귀를 통해 이루어지는데 (deep copy), 재귀적 코드 스타일은 무한 루프에 빠질 수 있다
순수함수를 사용하는 것은 쉬울 수 있지만 조합하는 것은 쉽지 않다