선언형과 함수형 프로그래밍
'무엇을' 풀어내는가에 집중하는 패러다임이며, 프로그램은 함수로 이루어진 것이다. 라는 명제가 담긴 패러다임
💡 패러다임이란?
프로그래밍의 관점을 갖게 하고 코드를 어떻게 작성할 지 결정하는 역할
선언형 프로그래밍이란?
명령형 프로그래밍은 어떻게 할지 표현하고, 선언형 프로그래밍은 무엇을 할 건지를 표현한다.
선언적 방식으로 접근하기 위해서는 명령형 방식으로 어떻게 접근하는가가 먼저 추상화되어야 한다.
선언적 접근 방식의 기저에는 명령형이 깔려있고 추상화 된 것이다.
함수형 프로그래밍이란?
작은 문제를 해결하기 위한 함수를 작성
부수 효과가 없는 순수 함수를 1급 객체로 간주하여 파라미터나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있다.
부수 효과 (Side Effect)
- 변수의 값이 변경됨
- 자료 구조를 제자리에서 수정함
- 객체의 필드 값을 설정함
- 예외나 오류가 발생하며 실행이 중단됨
- 콘솔 또는 파일 I / O가 발생
순수 함수
부수 효과 (Side Effect) 들을 제거한 함수
출력이 입력에만 의존하는 것을 의미
- Memory or I / O의 관점에서 Side Effect 가 없는 함수
- 함수의 실행이 외부에 영향을 끼치지 않는 함수
// 순수 함수, 매개변수에만 출력이 영향을 받음
const pure = (a, b) => {
return a + b;
}
/*=================================*/
// 순수 함수 X
// 매개변수 이외의 변수에 의해 출력 값이 영향을 받음
const c = 10;
const notPure = (a, b) => {
return a + b - c;
}
pure 함수는 들어오는 매개변수 a, b 에만 영향을 받는다.
만약 a, b 말고 다른 전역 변수 c 등이 출력에 영향을 주면 순수 함수가 아니다.
순수 함수의 장점
- 함수 자체가 독립적이며, Side Effect가 없기 때문에 Thread에 안전성을 보장받을 수 있다.
- Thread에 안정성을 보장받아 병렬 처리를 동기화 없이 진행할 수 있다.
고차 함수
함수가 함수를 값처럼 매개변수로 받아 로직을 생성할 수 있는 것을 의미
1 급 객체 (First Class Object)
고차 함수를 쓰기 위해서는 해당 언어가 일급 객체라는 특징을 가져야한다.
- 변수나 메서드에 함수를 할당할 수 있다.
- 함수 안에 함수를 매개변수로 담을 수 있다.
- 함수가 함수를 반환할 수 있다.
- 파라미터로 전달할 수 있다.
- 반환값으로 사용할 수 있다.
- 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다.
함수형 프로그래밍에서 함수는 1급 객체로 취급
참조 투명성 (Referential Transparency)
- 동일한 인자에 대해 항상 동일한 결과를 반환
- 참조 투명성을 통해 기존의 값은 변경되지 않고 유지 (Immutable Data)
명령형 프로그래밍과 함수형 프로그래밍에서 사용하는 함수는 부수효과의 유/무에 따라 차이가 있다.
그에 따라 함수가 참조에 투명한지 안하지 나뉘어 지는데, 참조에 투명하다는 것을 말 그대로 함수를 실행하여도 어떠한 상태의 변화 없이 항상 동일한 결과를 반환하여 항상 동일하게 실행 결과를 참조할 수 있다는 것을 의미
(부작용을 제거하여 프로그램의 동작을 이해하고 예측을 용이하게 하는 것)
프론트엔드에서 함수형 프로그래밍이 선호되는 이유
코드를 간결하고 유지보수하기 쉽게 유지하기 위해서
상태 관리의 용이성
함수형 프로그래밍은 상태 변이를 최소화하여 코드를 더 예측 가능하고 안정적으로 만드는 것이 가능 (순수 함수로 만들어지기 때문)
코드의 간결함
복잡한 로직들을 추상화하여 선언적으로 코드를 작성하기 용이
불변성
프론트 프레임워크의 렌더링 방식을 보면 가상 DOM (Virtual DOM)을 사용하여 UI를 렌더링하게 된다.
가상 DOM 은 이전 상태와 현재 상태를 비교하여 서로 같지 않으면 변경된 부분만 실제 DOM 에 반영한다.
하지만 상태가 변경됬음에도 불구하고, 상태 객체를 직접 수정하게 되면 이전 상태와 현재 상태가 같아 보일 수 있으므로, 변경된 부분을 찾지 못한다.
예측 가능한 상태
상위 컴포넌트에서 하위 컴포넌트로 데이터를 전달하고, 하위 컴포넌트는 데이터를 수정하지 않고 다시 상위 컴포넌트로 전달
객체 지향 프로그래밍이 선호되지 않는 이유
객체의 변경
객체 지향 프로그래밍에서는 객체의 상태를 변경하는 것이 중요한 개념 중 하나이며 객체는 데이터와 그 데이터를 조작할 수 있는 메서드도 포함하게 된다.
이 메서드는 객체의 상태를 변경할 수 있다.
객체 지향 프로그래밍에서는 객체의 상태를 변경해야 하는 경우가 많아서, 상태 변경이 발생할 때마다 함수의 반환값이 예측하기 어려워진다.
또한 여러 객체가 상태를 공유할 경우, 상태 변경이 예측하기 어려워진다.
순수 함수와 불변성의 장점을 활용하기 어렵기 때문에 함수형 프로그래밍이 선호된다.
'CS > 디자인 패턴' 카테고리의 다른 글
MVVM 패턴 (0) | 2023.09.11 |
---|---|
옵저버 패턴 (Observer Pattern) (0) | 2023.09.11 |
전략 패턴 (Strategy Pattern) (0) | 2023.09.11 |
팩토리 패턴 (Factory Pattern) (0) | 2023.09.11 |
싱글톤 (Singleton Pattern) (0) | 2023.09.11 |