- 프로그래머가 프로그래밍의 특정 관점을 갖게 해주는 개발 방법론
- 크게 선언형, 명령형 두 가지로 분류할 수 있고, 각 패러다임에서 파생되는 프로그래밍 방식들이 존재함
- 하나만 골라 쓰는 것이 아님, Kotlin·JavaScript·Java 같은 현대 언어는 객체지향과 함수형을 함께 제공하는 멀티 패러다임이 기본
선언형
- Declarative Programming, 무엇을 풀어내는가에 집중하는 패러다임
- 프로그램은 함수로 이루어져 있다는 명제가 깔려 있음
- 함수형만 선언형인 것은 아님, SQL이나 React의 JSX처럼 원하는 결과를 기술하는 방식이 모두 선언형에 해당
함수형
- 순수 함수들을 조합하여 로직을 구현하는 방식
- 여기서 순수 함수란, 출력이 입력에만 의존하고 다른 외부 영향을 받지 않는 함수를 의미함
const ret = [1,2,3,5,10].reduce((max, num) => num > max ? num : max, 0)
// 위에선 reduce, 배열 입력만 받아 최대값을 추출하고 있다
console.log(ret) // 10
- 불변성 (Immutability) 이란 특징이 있는데, 함수형 프로그래밍에서 객체는 불변의 상태이고, 불변이기에 어플리케이션에 영향을 주지 않음
- 불변성이 있지만 객체 수정이 필요한 경우, 복사본을 만드는 식으로 유지함
- 부작용을 함수 밖으로 밀어내면 입력과 출력만 보면 되므로 테스트가 쉬워짐, 외부 의존이 없는 순수 함수는 mock 없이 실제 값으로 검증 가능
명령형
- Imperative Programming, 어떻게 풀어내는가에 집중하는 패러다임
객체지향
- 데이터를 객체로 취급하여 프로그래밍을 구성하고 상호작용하도록 개발하는 방식
- 객체지향은 크게 네 가지 특징을 가짐
- 추상화 : 시스템으로부터 객체의 기능을 간추리는 것
- 캡슐화 : 객체 속성 중 일부를 외부에 감추는 것
- 상속성 : 하위 객체가 상위 객체를 이어 받아 기능을 확장하는 것
- 다형성 : 하위 객체가 여러 상위 객체를 이어 받던지, 객체의 기능이 여러 방식으로 구현되는 것
- ex) Overloading, Overriding
- 위 특징들을 살려 생산성을 높일 수 있지만, 객체가 상태를 가지기 때문에 변화가 생길 수 있고, 이 변화는 예측할 수 없는 상태가 되어 버그를 유발할 수 있음