📝 함수형 프로그래밍이란
성공적인 프로그래밍을 위하여 부수효과를 미워하고, 조합성을 강조하는 하나의 프로그래밍 패러다임이다.
function add(a, b) {
return a + b;
}
console.log(add(10, 6));
add()
는 순수함수이다add()
함수가 순수함수인 이유return
하기 때문이다.return
하는 함수let c = 10;
function add2(a,b){
return a + b + c
}
add2()
에서 참조하는 전역변수로 할당한 c
가 무언가에 의해 c
라는 값이 변한다면 add2()
는 순수함수가 아니다c
가 let
이 아닌 const
, 즉 상수로서 동작한다면 add2()
도 순수함수로 볼 수 있다.console.log(add2(10, 2));
console.log(add2(10, 3));
console.log(add2(10, 5));
// 함수실행시 c의 상태가 변경된다면?
c = 20;
console.log(add2(10, 2));
console.log(add2(10, 3));
console.log(add2(10, 5));
인자는 동일한 인자를 넣었지만 c가 변화함에 따라 add2()가 다른 결과를 낳고 있다
let c = 20;
function add3(a, b) {
c = b;
return a + b;
}
c=b;
와 같이 리턴값 외에도 함수가 다른 외부 상태(현재에선 전역변수로 설정한 c
)에도 영향을 미치기 때문에 console.log(c); //20
//함수실행시 두번째 파라미터로 30을 전달했다 ➡️ 즉, 30에 b가 할당되었고 c에도 30이 할당되었다.
console.log(add3(20, 30));
//부수효과로 인해 c의 결괏값이 달라진다
console.log(c); //30
비순수함수
var obj1 = {val: 10};
function objFunction(obj, b) {
obj1.val += b;
}
console.log(obj1.val); //10
objFunction(obj1, 20);
// 함수로인해 obj.val가 변경되었음
console.log(obj1.val); //30
objFunction()
으로 객체의 key
에 직접 참조해서 기존 obj
객체의 value
를 직접적으로 변경하고 있는 상태이다.순수함수로 구현한다면?
var obj1 = {value: 10};
function objFunction(obj, b) {
return {val: obj.value + b};
}
objFunction()
의 리턴값으로 새로운 객체를 생성하며, 해당 val
의 값은 obj.value + b
이다.obj1
을 훼손시키지않는다.users
라는 객체로 이루어진 배열이 존재한다.
const users = [
{id: 1, name: "ID", age: 36},
{id: 2, name: "BJ", age: 23},
{id: 3, name: "JM", age: 32},
{id: 4, name: "PJ", age: 12},
{id: 5, name: "HA", age: 36},
{id: 6, name: "JE", age: 31},
{id: 7, name: "JI", age: 25},
{id: 8, name: "MP", age: 23},
];
🔏 여기서 4가지 조건이 있는데,
1. 30세 이상인 users를 거른다
let temp_users = [];
for (let i = 0; i < users.length; i++) {
if (users[i].age >= 30) {
temp_users.push(users[i]);
}
}
2. 30세 이상인 users의 names를 수집한다
const names = [];
for (let i = 0; i < temp_users.length; i++) {
names.push(temp_users[i].name);
}
3. 30세 미만인 users를 거른다
let temp_users2 = [];
for (let i = 0; i < users.length; i++) {
if (users[i].age < 30) {
temp_users2.push(users[i]);
}
}
4. 30세 미만인 users의 age를 수집한다
let ages = [];
//기존 수집했던 30세미만의 users의 배열(temp_users2)을 참조한다
for (let i = 0; i < temp_users.length; i++) {
ages.push(temp_users2[i].age);
}
push
하는 로직이다먼저 30세이상/30세미만의 users
들을 걸러내는 코드로직이 중복되는 부분이 많다.
조건부 일부만 다르고 나머지 코드로직은 전부 동일한형태로 돌아가고있다.
🎇
_filter()
함수 만들기
const _filter = (list, cut) => {
let new_list = [];
for (let i = 0; i < list.length; i++) {
if (cut(list[i])) {
new_list.push(list[i]);
}
}
return new_list;
};
const filteredOver30 = _filter(users, (user) => {
return user.age >= 30;
});
const filteredUnder30 = _filter(users, (user) => {
return user.age < 30;
});
_filter
함수의 매개변수로 list
와 cut
을 전달받고있는데 해당 list
는 내가 전달할 객체 또는 배열이다, cut()
은 전달인자로 전달할 함수로 cut()
내에서 조건처리를 하는 함수를 전달받는다.new_list
라는 빈 배열을 선언 후 할당하고,list
를 for문
으로 반복하게되는데, cut()
함수를 if문
안쪽에서 실행하게 하면서 user
들을 조건처리하게된다. 해당 조건이 true
로 평가되면, new_List
에 조건에 통과한 list[i]
(배열로 받는 경우list의 i번째 요소, 객체로 받을땐 list의 i번째 속성의 value)을 push
한다new_list
배열을 return
한다 _filter()
함수로 객체의 value들이 필터링 된 모습
두번째로, 30세 이상/30세 미만인 users
의 names
를 수집하는 코드로직을 모든 값을 받을 수 있는 유연한 _map()
으로 리팩토링해보자.
🎇
_map()
함수 만들기
const _map = (list, mapping) => {
const new_list = [];
for (let i = 0; i < list.length; i++) {
new_list.push(mapping(list[i]));
}
return new_list
};
const newMappingUserValue = _map(users, (user) => {
return user.name;
});
_filter
함수와 마찬가지로 list
와 mapping()
이란 함수를 파라미터로 전달받는다,mapping()
으로 객체의 value
를 반복문을 돌면서 새로운값으로 return
한다. _map()
함수의 인수로 list와 mapping함수(users의 name만을 return하는)를 전달하고 있다
const over30Users = _filter(users, (user) => user.age >= 30);
const over30UsersName = _map(over30Users, (user) => user.name);
over30Users
라는 변수를 선언에 _filter()
로 user
의 age
가 30세이상인 객체들을 배열로 만들어 할당하고_map()
에 첫번째 인수로 over30Users
로 새로 필터링된 배열을 전달후,over30Users
배열에서 name
값만을 반환하는 배열을 새로 over30UsersName
변수에 최종적으로 전달함users 객체에서 30세 이상인 user의 name들을 받아 배열로 반환한 모습
함수형 프로그래밍을 찍먹해봤는데, 이게 함수형프로그래밍에서의 코드중에서도 기초중의 기초 인데도 벌써부터 로직이 이해하기 어려워지는 느낌을 많이 느꼈다. 클로저
에 대한 정확한 이해도 필요하고, 함수형프로그래밍의 특성상 함수는 무조건 중첩이 되는데, 함수가 중첩될때, 어떤함수가 파라미터로 전달받고, 또 어떤함수가 인수로 함수에 전달하는지에 대한 연습도 필요할것같다. 따라서 먼저 기본 javascript
를 더 숙달한후, 함수형프로그래밍은 조금씩 천천히 연습해보는걸로해야겠다.. 👀