하나의 프로그래밍 패러다임으로 정의되는 일련의 코딩 접근 방식
자료처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로드래밍 패러다임
1. 순수함수
- 동일한 입력엔 항상 같은 값을 반환해야하는 함수
- 함수의 실행이 프로그램의 실행에 영향을 미치지 않아야 하는 함수
- 함수 내부에서 인자의 값을 변경하거나 프로그램 상태를 변경하는 Side Effect가 없는 것
let num = 1; function add(a) { return a + num; }
위와 같은 예제에서 add 라는 함수 안에서 전역으로 선언된 변수인 num을 참조하기 때문에 순수함수라고 볼 수 없다.
function add(a, b) { return a + b; } const result = add(2, 3);
위와 같이 add의 함수가 프로그램 실행에 영향을 미치지 않고 입력 값에 대해서만 값의 변환이 있으므로 순수함수이다.
- 순수 함수는 프로그램의 변화없이 입력 값에 대한 결과를 예상 할 수 있어 테스트가 용이하다.
2. 비상태, 불변성
- 함수형 프로그래밍에서의 데이터는 변하지 않는 불변성을 유지해야 한다.
- 데이터의 변경이 필요한 경우, 원본 데이터 구조를 변경하지 않고 그 데이터의 복사본을 만들어서 그 일부를 변경하고, 변경한 복사본을 사용해 작업을 진행한다.
let person = {name: "jaewoo", age: "25"}; function increaseAge(person) { person.age = person.age + 1; return person; }
위의 예제에서는 increaseAge 함수에서 전역으로 선언된 person의 age 속성을 변경하므로 불변성 유지를 만족하지 못한다.
// 비상태, 불변성 만족 const person = { name: "jaewoo", age: "25" }; function increaseAge(person) { return { ...person, age: person.age + 1 }; }
위처럼 객체의 값을 바꾸기 위해서는 데이터의 복사본을 만들어, 그 복사본을 사용해 작업을 진행하고 반환한다.
3. 선언형 함수
let numbers = [1, 2, 3]; function multiply(numbers, multiplier) { for (let i = 0; i < numbers.length; i++) { numbers[i] = numbes[i] * multiplier; } }
위의 예시에선 for문을 사용해 배열의 각 요소에 mutiplier 곱해주는 명령형 프로그래밍이다.
함수형 프로그래밍에서는 마찬가지로 if,switch,for 등 명령문을 사용하지 않고 함수형 코드로 사용해야한다.// 선언형 프로그래밍 function multiply(number, multiplier) { return number.map((num) => num * multiplier); }
위의 예시는 for문을 map으로 대치했고, Javascript 에선filter,map,take,reduce 등의 함수형 코드를 사용한다.
4.1급 객체와 고차함수
- 변수나 데이터 구조안에 담을 수 있다.
- 파라미터로 전달 할 수 있다.
- 반환값(return value)으로 사용할 수 있다.
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능하다.
- 동적으로 프로퍼티 할당이 가능하다.
// 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]
위의 예시에서는 함수를 변수에 할당하거나 반환하는 1급 객체로서의 특징을 보여준다.
그리고 고차 함수의 속성을 가져야 하는데, 고차 함수의 특징은 다음과 같다.
- 함수를 인자로써 전달 할 수 있어야 한다.
- 함수의 반환 값으로 또 다른 함수를 사용 할 수 있다
// 고차 함수 const addInform = (name) => (age) => age + name; const jaewoo = addInform("재우"); console.log(jaewoo("98")); // 98재우
위의 예제처럼 함수의 반환 값으로 다른 함수를 사용하거나, 함수의 반환 값으로 또 다른 함수를 사용 할 수 있어야 한다.