코딩 하는 가든

함수형 프로그래밍 - 함수형 예제(1) - _filter, _map 함수 만들기 본문

함수형프로그래밍

함수형 프로그래밍 - 함수형 예제(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이상인 유저들의 이름 수집

 

 위와 같이 함수형 프로그래밍은 여러 함수들의 조합으로 재사용성을 높여 나갈 수 있다는 편리하고도 매우 큰 장점이 있다.