프로그래머에게 프로그래밍의 관점을 갖게 하고 코드를 어떻게 작성할 것인지 결정하게 하는 역할을 하는 것을 의미합니다.
크게 아래와 같이 구분할 수 있습니다.
명령형 프로그래밍
선언형 프로그래밍
함수형 프로그래밍이란, 순수함수
를 조합하여 SW를 만드는 방식입니다.
대표적으로 클로저, 스칼라, 하스켈
등 언어가 있고, javascript, kotlin, python
등에도 함수형 프로그래밍 문법이 추가되어 있습니다.
함수형 프로그래밍은 함수 단위로 코드를 사용하기 때문에 재사용에 용이하다는 장점이 있습니다. 하지만, 함수를 조합하여 구현해내야하기 때문에 이 과정이 어렵고 가독성이 떨어질 수 있다는 단점이 존재합니다.
순수함수란, 동일한 입력에 항상 같은 결과값을 반환하는 함수를 말합니다. 프로그램 실행에 영향을 주지 않고 입력 값에 대해서만 값이 변화하는 함수를 순수함수
라고 합니다.
또한, 순수함수는 함수 내부에서 인자를 변경하거나 프로그램에 상태를 변경하는 등 side effect
가 없어야합니다.
👉 아래와 같은 함수를 순수함수라고 할 수 있습니다.
const addNum = (a, b) => a + b;
const result = addNum(12, 21);
함수형 프로그래밍에서 데이터는 변할 수 없기 때문에 불변성 데이터
라고도 합니다.
그래서 데이터를 변경해야할 경우, 원본 데이터를 변경하지 않고 복사(copy)하여 일부를 변경하고 복사본을 이용하여 작업을 해야합니다.
👉 아래 코드는 불변성이 적용되지 않은 데이터와 적용된 데이터를 비교하는 코드입니다.
// 불변성이 적용되지 않은 데이터
let admin = {
name: "Alex",
age: 30,
};
const changeAdmin = (admin) => {
admin.name = "Sebastian";
return admin;
};
console.log(changeAdmin(admin)); // { name: 'Sebastian', age: 30 }
console.log(admin.name); // Sebastian
// 불변성이 적용된 데이터
const admin = {
name: "Alex",
age: 30,
};
const changeAdmin = (admin) => {
return { ...admin, name: "Sebastian" };
};
console.log(changeAdmin(admin)); // { name: 'Sebastian', age: 30 }
console.log(admin.name); // Alex
함수형 프로그래밍에서는 제어문(for문등)을 사용하지 않고 함수형 코드를 사용해야 합니다.
// for문 대신 map()를 사용하여 구현
let nums = [1, 2, 3, 4, 5];
// 1) for문
const squareNum = (nums) => {
for (let i = 0; i < nums.length; i++) {
nums[i] = nums[i] * nums[i];
}
};
// 2) map
const squareNum = (nums) => {
return nums.map((num) => num * num);
};
console.log(nums);
1급객체는 아래와 같은 조건을 만족하는 객체를 의미합니다.
- 변수나 데이터 구조에 값을 담을 수 있음
- 파라미터로 값을 전달할 수 있음
- 반환값으로 사용할 수 있음
- 할당에 사용된 이름과 관계없이 고유한 구별이 가능함
- 동적으로 프로퍼티 할당 가능
2개이상의 함수를 조합하는 과정을 Function Compositon
이라고 하는데, 작은 여러개의 순수 함수들을 연쇄적으로, 병렬적으로 호출하여 더 큰 함수를 만드는 것을 말합니다.
위와 같이 함수를 서로 조합하여 다른 함수를 만들 때 고차함수를 사용할 수 있는데요!
고차함수는 아래 조건을 만족해야 합니다.
- 함수를 인자로 받음
- 함수를 반환값으로 가짐
👉 아래와 같이 고차함수를 사용할 수 있습니다.
const makeNickname = (name) => (birth) => `${name}-${birth}`;
const getMyNickname = makeNickname("현주");
console.log(getMyNickname(1997));