섹션 2. 함수형으로 전환하기 - 2

리리·2021년 7월 21일

TIL

목록 보기
7/22

each 만들기

_each로 _map, _filter 중복 제거

function _map(list, mapper) {
	var new_list = [];
	for (var i = 0; i < list.length; i++) {
		names.push(mapper(list[i]));
	}
	return new_list;
}

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;
}

두 부분의 중복 -> loop 부분과 참조하는 부분이 중복된다. 이걸 참조할 수 있는 함수 _each()를 만들어보자.

function _each(list, iter) {
	for (var i = 0; i < list.length; i++) {
		iter(list[i]);
	}
    return list;
}

each()함수를 사용하게 되면 위 함수들은 다음과 같이 변경된다.

function _map(list, mapper) {
	var new_list = [];
	_each(list, function(val) {
    	new_list.push(mapper(val));
    });
	return new_list;
}

function _filter(users, predi) {
	var new_list = [];
    _each(list, function(val) {
    	if (predi(val)) {
			new_list.push(val);
		}
    });
	return new_list;
}

명령적인 코드표현이 줄어들게 되고, 선언적인 코드가 늘어나게 된다.

외부 다형성

array_like, arguments, document.querySelectorAll

console.log(
	[1, 2, 3].map(function(val) {
    	return val * 2;
    })
);

array내부 함수에 map, filter와 같은 함수들이 있다. 정확히는 순수함수가 아니라 객체 상태에 따라 결과가 달라지는 메소드이다.
메소드는 객체지향 프로그래밍이다. 해당클래스의 인스턴스에만 사용할 수 있다. 즉, map 과 filter은 array가 아닌것에는 적용 불가하다. 그러나, js에는 array가 아니라 array like 객체가 많다. 예를 들어 jsQeury..가 있다.
예를 들어
document.querySelectorAll('*'); 과 같은 코드는 array처럼 생긴 결과를 반환하지만, array가 아니다. 그래서 map, filter와 같은 array 객체의 메소드를 사용할 수 없다.
함수형 프로그래밍에서는 함수를 먼저 만들고, 함수에 맞는 객체를 사용하기 때문에 다형성을 보장한다.
_map(document.querySelectorAll('*'), function(node) { return node.nodeName; }) 는 가능하지만
map(document.querySelectorAll('*'), function(node) { return node.nodeName; }) 은 불가능하다.

객체지향형 프로그래밍에서는 객체가 반드시 존재해야하므로 함수 평가시점이 매우 중요해진다. 그러나, 함수형 프로그래밍에서는 함수는 항상 존재하기 때문에 평가시점이 더욱 유연해진다.

내부 다형성

predicate, iter, mapper

응용형 함수의 장점.

_map([1, 2, 3, 4], function(v) {
  return v + 10;
});

두 번째로 들어간 함수를 무조건 콜백 함수라고 부르는 경향이 있다. 그러나, 함수형 프로그래밍에서는 두번째 함수가 어떤 역할을 갖느냐에 따라 다른 이름을 갖는 것이 꽤나 중요하다.
콜백 함수 : 무조건 어떤 일들을 다 수행 한 다음, 맨 끝에서 다시 돌려주는 것을 뜻함.
predicate: 조건을 걸어주는 함수
iter: 반복하는 함수
mapper: 무언가와 매핑하는 함수

외부다형성은 _map이 어떻게 구현되었느냐에 따라 다르다. 반면, 배열 안에 어떤 값이든 들어있어도 돌아갈 수 있게 만드는 것은 보조함수 관할이다. 내부 값의 다형헝은 predicate, iter, mapper등이 책임진다.

0개의 댓글