본문 바로가기

Javascript/함수형 프로그래밍

함수형 프로그래밍의 장점, 다형성!(어떤 객체에만 적용가능한 메서드가 아닌 함수를 생성한다)

반응형

다형성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
console.log(
  [1,2,3,4].map(function(val){
    return val * 2;
  })
);
// 2,4,6,8 출력
console.log(
  [1,2,3,4].filter(function(val){
    return val % 2;
  })
);
// 1,3 출력
 


다형성에 대해 얘기하기전에 기존에 만들었던 _map 함수와 _filter 함수는 이미 만들어져있다.

그래서 위와같이 사용이 가능하다.

명확히는 함수가 아닌 메서드로 만들어져있다.

무슨말이냐면 메서드는 어떤 객체, 여기서는 배열의 메서드라서 배열객체가 생성된 후에 그 배열객체에'만' 적용가능한 함수인 것이다.

1
2
3
4
5
console.log(
    document.querySelectorAll('*').map(function(node){
      return node.nodeName;
    });
);


이렇게 찍어보면 어떨까?

document.querySelectorAll('*') 만 콘솔로 찍어보면 마치 배열처럼 [head, script, body, ... ] 이런식으로 나온다.

length도 보이고 배열의 인덱스도 보이지만 배열이 아니다.

이것은 array like 타입이기 때문에 위의 콘솔은 에러가 난다.

배열의 함수인 map을 불러서 그렇다.

이 문제를 어떻게 해결하느냐? 전에 만든 _map과 _filter는 함수다.

즉, 어떤 객체에'만' 적용가능한 메서드가 아닌 함수라서 그 함수의 인자에 타입만 맞으면 모두 실행가능하다

(= 다형성)


이렇게 함수를 사용하면 외부적으로 다형성을 만들 수 있다는 얘기다. (_map, _filter, _each가 핵심 조건)

그럼 내부적으로 다형성은 누가 만들까?

바로 iter, mapper, predi 같은 인자로 넘어오는 함수들이다.

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


그 배열에 어떤 값이든 수행할수 있게 만드는 역할은 보조함수가 함.

개발자가 v가 숫자니까 더할꺼라든지 node가 노드니까 그 이름을 리턴한다든지 보조함수를 통해 정한다.

반응형