함수형 프로그래밍(3)

Siwoo Pak·2022년 1월 7일
0

Javascript

목록 보기
30/34

다형성(외부/내부)

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 함수는 이미 만들어져있다.

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

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

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

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 같은 인자로 넘어오는 함수들이다.

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

그 배열에 어떤 값이든 수행할수 있게 만드는 역할은 보조함수가 하며, 그 인자로 들어오는 보조함수로 내부 다형성을 구현함.

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

참고

profile
'하루를 참고 인내하면 열흘을 벌 수 있고 사흘을 참고 견디면 30일을, 30일을 견디면 3년을 벌 수 있다.'

0개의 댓글