일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- FP 특징
- jwt
- 웹 크롤링
- toggle-btn
- 리액트 렌더링 최적화
- 실행컨텍스트
- next js
- v8 원리
- 테스트 코드 툴 비교
- gql restapi 차이
- this
- 리덕스
- 웹팩 기본개념
- 리액트 메모이제이션
- Js module
- 리액트 메모
- 자바스크립트 엔진 v8
- 리액트
- 항해99 부트캠프
- 항해99 사전스터디
- 타입스크립트
- JS module system
- js배열 알고리즘
- 코어자바스크립트
- 알고리즘
- chromatic error
- 함수형 프로그래밍 특징
- 렌더링 최적화
- 항해99 미니프로젝트
- 항해99
- Today
- Total
Jaeilit
함수형 프로그래밍 - 고차함수 HOF ( 일급객체 ) 본문
프로그래밍 패러다임에서도 설명드렸다시피 프로그래밍에는 크게 명령형과 선언형으로 구분됩니다.
명령형은 결과(Waht)보다 과정(How)을 중요시하고
선언형은 과정(How)보다 결과(What)를 중요시합니다.
이 과정에서 명령형은 OOP 를 지향하여 객체들간의 상호작용과 객체의 상태변화를 중심으로 프로그래밍을 설계하고
선언형은 함수형 프로그래밍을 지향합니다.
함수형 프로그래밍의 특징
- 순수함수
- 불변성
- 고차함수
- 1급 객체
순수함수
순수함수란 같은 입력에는 항상 같은 출력을 반환해야하며, 외부상태를 변경하지않고 외부에 사이드이팩트를 미치지 않는 함수를 말합니다
순수함수 예제)
// 순수 함수 예제 1: 두 숫자의 합을 반환하는 함수
function add(a, b) {
return a + b;
}
// 순수 함수 예제 2: 배열의 모든 요소에 숫자를 더하는 함수
function addToList(arr, num) {
return arr.map(item => item + num);
}
// 순수 함수 예제 3: 문자열의 길이를 반환하는 함수
function stringLength(str) {
return str.length;
}
// 순수 함수 예제 4: 제곱 값을 반환하는 함수
function square(x) {
return x * x;
}
만약 예제에서 function 외부 전역 스코프에 let a = 0 이라는 변수와 함께 function 에서 a 라는 변수에 할당/ 재할당을 하면서 외부 변수를 건드리게 되면 입력에 따라 출력값도 달라질수있고 외부변수에 의존하게 되어 사이드이팩트도 초래할수도 있습니다.
불변성
불변성은 원본 데이터는 변경되지않아야한다는 점입니다. 함수형 프로그래밍에서는 원본 데이터는 변경하지않고 새로운 데이터를 반환하므로 이 또한 사이드이팩트를 줄여 안전한 프로그래밍을 할수 있습니다.
불변성 예제)
// 배열에 요소를 추가하는 함수 (불변성 유지)
function addToArray(arr, element) {
return [...arr, element];
}
// 객체에 속성을 추가하는 함수 (불변성 유지)
function addToObject(obj, key, value) {
return { ...obj, [key]: value };
}
// 배열에서 요소를 제거하는 함수 (불변성 유지)
function removeFromArray(arr, index) {
return arr.slice(0, index).concat(arr.slice(index + 1));
}
// 객체의 속성을 제거하는 함수 (불변성 유지)
function removeFromObject(obj, key) {
const newObj = { ...obj };
delete newObj[key];
return newObj;
}
// 예시 데이터
const originalArray = [1, 2, 3];
const originalObject = { a: 1, b: 2, c: 3 };
// 불변성 유지한 데이터 조작
const newArray = addToArray(originalArray, 4);
const newObject = addToObject(originalObject, 'd', 4);
const modifiedArray = removeFromArray(newArray, 1);
const modifiedObject = removeFromObject(newObject, 'b');
console.log(originalArray); // [1, 2, 3]
console.log(newArray); // [1, 2, 3, 4]
console.log(originalObject); // { a: 1, b: 2, c: 3 }
console.log(newObject); // { a: 1, b: 2, c: 3, d: 4 }
console.log(modifiedArray); // [1, 3, 4]
console.log(modifiedObject); // { a: 1, c: 3, d: 4 }
예제에서 spread 문법으로 객체/배열을 얕은 복사하여 새로운 데이터를 반환하고 있습니다.
새로운 데이터를 반환하는 함수에는 예제와 같이 slice 도 있고 map, filter 등이 있고 객체에는 object.assign() 과 JSON.parse() 등 다른 메서드들도 있습니다.
고차함수란?
고차함수는 함수형 프로그래밍에 자주 사용되는 패턴입니다.
고차함수에는 2가지의 특징이 있는데 하나라도 만족 한다면 고차함수라고 볼 수 있습니다.
- 함수를 인자로 받는 함수
- 함수를 리턴하는 함수
보통 JS 의 Array 메서드들이 HOF에 속합니다.
예를들어 우리는 map method 에 [1,2,3].map((num) => num + num) 에서 (num) => num +num 라는 함수를 인자로 받았기 때문입니다.
간단하게 다른 예제를 살펴보겠습니다.
// 고차 함수 예시 1: 함수를 인자로 받는 함수
function doOperation(operation, x, y) {
return operation(x, y);
}
function add(a, b) {
return a + b;
}
function subtract(a, b) {
return a - b;
}
console.log(doOperation(add, 5, 3)); // 출력: 8
console.log(doOperation(subtract, 8, 2)); // 출력: 6
// 고차 함수 예시 2: 함수를 반환하는 함수
function multiplyBy(factor) {
return function (number) {
return number * factor;
}
}
const double = multiplyBy(2);
const triple = multiplyBy(3);
console.log(double(5)); // 출력: 10
console.log(triple(4)); // 출력: 12
일급 객체
- 변수나 데이터에 할당 할 수 있어야한다.
- 객체의 인자 값으로 넘길 수 있어야한다.
- 객체의 리턴 값으로 리턴 할 수 있어야한다.
고차함수와 마찬가지로 객체의 인자 값으로 넘길수, 리턴 값으로 활용할수 있어야한다. 자바스크립트의 함수는 모두 일급객체이므로 고차함수로 사용할 수 있고 함수형 프로그래밍을 구현할 수 있다.
'TIL' 카테고리의 다른 글
자바스크립트 V8 엔진 (1) | 2023.10.26 |
---|---|
번들러 웹팩 (0) | 2023.09.07 |
JS - Module System (0) | 2023.08.20 |
프론트엔드 테스트 종류와 비교 (0) | 2023.07.28 |
nextjs @svgr/webpack jest + @issue 해결 (0) | 2023.07.21 |