해당 책에서는 세 가지 패러다임에 대해 소개를 하는데, 이에 대해 하나씩 알아보자.
구조적 프로그래밍(structured programming)
<aside> 💡 구조적 프로그래밍은 제어흐름의 직접적인 전환에 대해 규칙을 부과한다.
</aside>
: 최초로 만들어지진 못했지만, 최초로 적용된 패러다임. 무분별한 점프(goto 문장)가 프로그램 구조에 해롭다는 점을 근거로 제시하며 이러한 점프 대신 if/then/else와 do/while/until 과 같이 익숙한 구조로 대체한다.
객체지향 프로그래밍(object-oriented programming)
<aside> 💡 객체 지향 프로그래밍은 제어흐름의 간접적인 전환에 대해 규칙을 부과한다.
</aside>
알골(ALGOL)언어의 함수 호출 스택 프레임(stack frame)을 힙(heap)으로 옮기면 함수 호출이 반환된 이후에도 함수에서 선언된 지역 변수가 오래 유지된다는 점을 발견했는데, 이런 함수를 클래스의 생성자로, 지역 변수는 인스턴스 변수, 중첩 함수는 메서드가 되었다.
함수 포인터를 특정 규칙에 따라 사용하는 과정을 통해 다형성이 등장하게 되었다.
함수형 프로그래밍(functional programming)
<aside> 💡 함수형 프로그래밍은 할당문에 대해 규칙을 부과한다.
</aside>
불변성(immutability)과 심볼(symbol)의 값이 변경되지 않는다는 람다 계산법의 기초 개념을 토대로 만들어졌는데, 함수형 언어에는 할당문이 전혀 없고,
이런 세 가지 패러다임을 보면, 각각의 패러다임은 프로그래머에게서 권한을 박탈한다.
모두 개발자에게 무엇을 할 수 있게 해준다기보단 무엇을 하지 못하게 막는 제약조건들이다.
(goto문을 사용하지마라, 함수 포인터, 할당문을 사용하지마라 등등…)
구조적 프로그래밍을 설명하며 얘기하겠지만, 개발에 대해서 수학적 접근이 아닌 과학적 접근을 함으로써, 정답을 확신하기보다는 하지말아야 할 점들을 제약하며 결과적으로 클린한 구조와 코드를 추구하도록 하는게 패러다임들의 목적이다. 세 가지 패러다임과 아키텍처의 세 가지 큰 관심사(함수, 컴포넌트 분리, 데이터 관리)가 서로 어떻게 연관되는지에 대해 알아보자.