1. 함수형 프로그램 원칙
1. 입출력이 순수해야한다.(순수 함수)
- 입출력이 순수한 것은 반드시 하나 이상의 인자를 받고, 인자를 처리하여 결과물로 도출해야한다.
- 인자를 제외한 다른 변수는 사용하면 안된다. 인자를 제외한 다른 변수는 사용하면 안된다.
2. 부작용(부산물)이 없어야한다.
- 프로그래머가 바꾸고자 하는 변수 외 바뀌어서는 안된다.
- 원본 데이터는 불변해야한다.
- 데이터 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고, 데이터의 복사본을 만들어 작업을 진행한다.
// 비상태, 불변성 만족
const person = { name: "jongmin", age: "26" };
function increaseAge(person) {
return { ...person, age: person.age + 1 };
}
3. 함수와 데이터를 중점으로 생각한다.
2. 함수형 프로그래밍 함수(map, filter, reduce)
1. map
var arr = [1, 2, 3, 4, 5];
var map = arr.map(function(x) {
return x * 2;
}); // [2, 4, 6, 8, 10]
- arr라는 값을 이용해서 결과를 내고 값은 변하지 않았다.
2. filter
// 잘못된 함수형 프로그래밍
var arr = [1, 2, 3, 4, 5];
var condition = function(x) { return x % 2 === 0; }
var ex = function(array) {
return array.filter(condition);
};
ex(arr); // [2, 4]
// 잘된 함수형 프로그래밍
var ex = function(array, cond) {
return array.filter(cond);
};
ex(arr, condition);
- condition 변수때문, 인자로 받지 않은 변수를 사용하였다.(잘못된 함수형 프로그래밍)
- condition 변수를 인자로 받으면 된다. 이렇게 하면 쉽게 에러를 추적할 수 있다.(잘된 함수형 프로그래밍)
3. 선언형 함수
- 무엇을 할 것인가에 주목한다.
let numbers = [1, 2, 3];
function multiply(numbers, multiplier) {
for (let i = 0; i < numbers.length; i++) {
numbers[i] = numbes[i] * multiplier;
}
}
//선언형 프로그래밍
function multiply(number, multiplier) {
return number.map((num) => num * multiplier);
}
- add안에서 add를 또 호출한다.
- 코드의 재사용성이 매우 높아진다.
4. reduce
var arr = [1,2,3,4,5,6,7,8,9,10];
arr.reduce(function(prev, cur) {
return prev + cur;
}); // 55
5. 1급 객체와 고차함수
- 함수형 프로그래밍에서는 함수가 1급 객체다.
5-1. 1급 객체 특징
- 변수나 데이터 구조안에 담을 수 있다.
- 파라미터로 전달 할 수 있다.
- 반환값으로 사용할 수 있다.
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
- 동적으로 프로퍼티 할당이 가능하다.
const addTwo = (num) => num + 2;
const multiplyTwo = (num) => num * 2;
const transform = (numbers) => numbers.map(addTwo).map(multiplyTwo);
console.log(transform([1, 2, 3, 4])); // [6, 8, 10, 12]
5-2. 고차함수 특징
- 함수를 인자로써 전달 할 수 있어야 한다.
- 함수의 반환 값으로 또 다른 함수를 사용할 수 있다.
// 고차 함수
const addInform = (name) => (age) => age + name;
const jongmin = addInform("종민");
console.log(jongmin("96")); // 96종민
3. 함수형 프로그래밍 장단점
3-1. 장점
1. 높은 수준의 추상화 제공
2. 함수 단위의 코드 재사용이 수월
3. 프로그램의 동작을 예측하기 쉽다.
3-2. 단점
1. 순수함수 구현하기 위해서 코드 가독성이 좋지 않을 수 있따.
2. 반복은 재귀를 통해이뤄져서 무한 루프에 빠질 수 있다.
3. 조합하는 것은 쉽지 않다.
4. 참조 투명성이란?
- 어떤 함수가 동일한 입력을 받았을때 동일한 결과를 나타내는 것.
int count = 0;
int count(){
return count++;
}// count의 값이 매번 다르다.
final int x = 10;
int getX(){
return x;
}// 항상 같은 x위 값을 반환하게 된다. 이를 참조 투명하다라고 한다.
참고 자료:
'개발 공부' 카테고리의 다른 글
[리액트 공식 문서] Quick start~ Thinking in React (0) | 2023.08.18 |
---|---|
.yarn 디렉토리가 없는 경우 (0) | 2023.07.10 |
[JS] Number()와 parseInt와 차이점 (0) | 2023.07.10 |
[JS] 형식화 배열이란?(Typed array) (0) | 2023.07.10 |
[JS]연결리스트와 연속 배열의 차이 (0) | 2023.07.10 |