일급함수와 고차함수

boyeonJ·2023년 6월 11일
1
post-thumbnail

자바스크립트의 일급객체란?

JavaScript에서 일급 객체(first-class object)는 함수와 마찬가지로 다음과 같은 특징을 가지는 객체를 말합니다:

  1. 변수에 할당 가능, 으로 다루기 가능: 일급 객체는 변수에 할당할 수 있습니다. 즉, 객체를 변수에 저장하고 나중에 참조하거나 사용할 수 있습니다.
  2. 인자로 전달 가능: 일급 객체는 다른 함수에게 인자로 전달할 수 있습니다. 이를 통해 객체를 다른 함수로 전달하여 동작을 파라미터화할 수 있습니다.
  3. 반환값으로 사용 가능: 일급 객체는 다른 함수의 반환값으로 사용될 수 있습니다. 즉, 함수가 일급 객체를 반환할 수 있습니다.
  4. 동적 프로퍼티 할당 가능: 일급 객체는 동적으로 프로퍼티를 할당하거나 변경할 수 있습니다. 객체의 프로퍼티는 런타임 중에 추가, 삭제, 수정이 가능합니다.

일급객체인 함수는 일급함수라고 부릅니다.

일급 함수라는 용어는 함수를 값으로 다룰 수 있는 특성을 강조하는 것입니다.일급 객체는 객체지향 프로그래밍에서 객체를 값으로 다룰 수 있는 특성을 가리키는 개념이고, 일급 함수는 함수형 프로그래밍에서 함수를 값으로 다룰 수 있는 특성을 가리키는 개념입니다.

일급 함수의 특성을 활용하여 조합성추상화를 구현하고 이용할 수 있습니다.

함수형 프로그래밍에서 조합성(composition)과 추상화(abstraction)은 중요한 개념입니다.

1. 조합성 (Composition):

조합성은 작은 함수들을 조합하여 더 큰 함수를 만드는 것을 의미합니다. 이를 통해 코드를 모듈화하고 재사용 가능한 작은 단위로 분리할 수 있습니다. 함수를 조합함으로써 코드의 가독성을 높이고, 의도를 명확히 표현하며, 코드의 유지보수성을 개선할 수 있습니다.

예를 들어, 함수 A와 함수 B가 있을 때, 이 두 함수를 조합하여 새로운 함수를 만들 수 있습니다:

const A = (x) => x * 2;
const B = (x) => x + 5;

const combinedFunction = (x) => B(A(x));

console.log(combinedFunction(3)); // 11

위의 예제에서 AB는 각각 곱셈과 덧셈을 수행하는 함수입니다. combinedFunctionAB를 조합하여 A의 결과를 B에 전달하는 함수입니다. 이렇게 작은 함수를 조합하여 더 유연하고 의미 있는 동작을 수행할 수 있습니다.

2. 추상화 (Abstraction):

추상화는 복잡한 세부 내용을 감추고 필수적인 개념과 기능에 집중할 수 있게 해줍니다. 함수형 프로그래밍에서는 함수를 추상화의 도구로 활용합니다. 함수를 사용하여 문제를 해결하는 방법을 추상화하고, 재사용 가능한 코드 블록을 작성할 수 있습니다.

예를 들어, 숫자 배열의 합을 구하는 함수를 추상화해보겠습니다:

const sum = (numbers) => {
  let total = 0;
  for (let i = 0; i < numbers.length; i++) {
    total += numbers[i];
  }
  return total;
};

console.log(sum([1, 2, 3, 4, 5])); // 15

위의 코드는 배열의 모든 요소를 더하는 기능을 수행하는 sum 함수입니다. 이 함수는 숫자 배열에 대한 추상화된 인터페이스를 제공하여, 배열의 내부 구현을 감추고 핵심적인 기능에 집중할 수 있습니다.


함수를 값으로 다루는 특징을 활용한 고차함수

고차 함수(Higher-order function)는 함수를 인자로 받거나 함수를 반환하는 함수를 말합니다. 즉, 함수를 값으로 다루는 함수입니다.

고차 함수는 함수형 프로그래밍에서 중요한 개념이며, 함수를 추상화하고 조합성을 높이는 데에 사용됩니다. 다른 함수를 인자로 받아 필요한 작업을 수행하거나, 함수를 반환하여 미래에 실행할 수 있는 기능을 제공합니다.

함수를 인자로 활용

const apply1 = f => f(1);
const add2 = a => a + 2;

log(apply1(add2));

const times = (f, n) => {
	let i = -1;
  	while (++1 < n) f(i);
};

times(log, 3); // 0,1,2
times(a => log(a+10), 3); //10,11,12

함수의 결과를 리턴하여 활용(클로저를 만들어 리턴하는 함수)

const addMaker = a => b => a + b;
const add10 = addMaker(10);
log(add10(5));
log(add10(10));

고차함수 활용

고차 함수는 다양한 용도로 활용될 수 있습니다. 예를 들면 다음과 같은 상황에서 고차 함수를 사용할 수 있습니다:

  1. 콜백 함수: 다른 함수에게 작업을 위임하기 위해 콜백 함수를 인자로 전달합니다. 이는 비동기적인 작업이나 이벤트 처리와 관련된 상황에서 주로 사용됩니다.
  2. 매핑 함수: 배열이나 리스트와 같은 컬렉션에 대해 각 요소에 대한 작업을 수행하는 함수를 인자로 받아 새로운 배열을 반환하는 함수입니다. map 함수가 고차 함수의 예시입니다.
  3. 필터링 함수: 컬렉션의 요소를 걸러내기 위해 조건을 체크하는 함수를 인자로 받아 해당 조건을 만족하는 요소로 구성된 새로운 컬렉션을 반환하는 함수입니다. filter 함수가 고차 함수의 예시입니다.
  4. 커링(Currying): 함수의 일부 인자를 고정하고, 나머지 인자를 받는 새로운 함수를 반환하는 고차 함수입니다. 이를 통해 함수의 재사용성과 부분 적용을 가능하게 합니다.

고차 함수의 활용을 통해 코드의 가독성, 재사용성, 유지보수성을 높일 수 있으며, 함수형 프로그래밍의 핵심적인 개념 중 하나입니다.

0개의 댓글