함수형프로그래밍
함수형 프로그래밍 - 함수형 예제(1) - _filter, _map 함수 만들기
가든리
2020. 3. 16. 13:09
함수형 프로그래밍의 예제
다음과 같은 user object list가 있다고 하자
var users = [
{id : 1, name: 'ID', age: 36},
{id : 2, name: 'JM', age: 25},
{id : 3, name: 'MK', age: 33},
{id : 4, name: 'WT', age: 32},
{id : 5, name: 'JW', age: 26},
{id : 6, name: 'QE', age: 29},
{id : 7, name: 'WF', age: 31},
{id : 8, name: 'DZ', age: 23}
];
기존의 프로그래밍 방식은 아래와 같다.
// 30세 이상인 유저 필터
var temp_users = [];
for (var i=0; i<users.length; i++) {
if (users[i].age >= 30) {
temp_users.push(users[i]);
}
}
console.log(temp_users);
// 유저들의 이름만 수집.
var names = [];
for (var i=0; i<users.length; i++) {
names.push(users[i].name);
}
console.log("이름 수집" + names);
// 30세 이하인 유저 필터
temp_users = [];
for (var i=0; i<users.length; i++) {
if (users[i].age < 30) {
temp_users.push(users[i]);
}
}
console.log(temp_users);
// 유저들의 나이만 수집.
var ages = [];
for (var i=0; i<users.length; i++) {
ages.push(users[i].age);
}
console.log("나이 수집 : " + ages);
위의 코드에서 나이 필터를 하는 함수에서 for문이 중복 되게 된다. 이 부분에서 다른 점은 if (users[i].age < 30) 과 if (sers[i].age >= 30) 부분인데 함수형 프로그래밍에서는 이러한 부분을 함수 자체를 인자로 넘겨줌으로써 중복을 줄여 나갈 수 있다.
예시
function _filter(users, predi) {
var new_list = [];
for (var i=0; i<users.length; i++) {
if (predi(users[i])) {
new_list.push(users[i]);
}
}
return new_list;
}
_filter(users, function(user) { return user.age >= 30}); // 나이 30이상인 유저 필터
_filter(users, function(user) { return user.age < 30}); // 너아 30미만인 유저 필터
위처럼 user를 받아 나이가 30 이상인, 30 미만인 사람을 리턴하는 함수를 작성하여 _filter 함수에 인자로 넘겨줌으로써 나이 필터를 구현할 수 있으며 비슷하게 이름이 특정 문자로 시작한다던지 혹은 꼭 user가 아니더라도 다른 리스트에 대해서 필터링을 할 수 있는 범용 함수가 구현되었다.
수집 함수 또한 다음과 같이 함수형 프로그래밍 방식으로 작성할 수 있다.
function _map(users, mapper) {
var new_list = [];
for (var i=0; i<users.length; i++) {
new_list.push(mapper(users[i]));
}
return new_list;
}
_map(users, function(user) { return user.name}); // 유저들의 이름 수집
_map(users, function(user) { return user.age}); // 유저들의 나이 수집
위의 두 함수를 함께 활용해 다음과 같이 사용할 수도 있다.
_map(
_filter(users, function(user) { return user.age >= 30}),
function(user) { return user.name}
) // 나이가 30이상인 유저들의 이름 수집
위와 같이 함수형 프로그래밍은 여러 함수들의 조합으로 재사용성을 높여 나갈 수 있다는 편리하고도 매우 큰 장점이 있다.