고급 프로그래밍 개념 중 하나인 일급 계산법은 함수를 일반적인 데이터처럼 취급할 수 있는 강력한 기능을 제공한다. 이를 통해 프로그램에서 함수를 동적으로 생성, 전달, 저장, 호출하는 것이 가능해져 코드의 유연성과 재사용성이 크게 향상된다.

일급 함수란?
일급 함수란 데이터 구조나 변수처럼 다른 함수의 인자로 전달되거나, 함수의 반환 값으로 사용될 수 있는 함수를 말한다. 또한 다른 함수 안에 내포되거나, 동적으로 생성될 수도 있다. 이러한 특성으로 인해 일급 함수는 프로그램 로직을 더욱 유연하게 표현하고 복잡한 문제를 해결하는 데 사용될 수 있다.
함수를 인자로 전달하기
일급 함수의 가장 간단한 예 중 하나는 함수를 다른 함수의 인자로 전달하는 것이다. 이를 통해 함수의 동작을 동적으로 수정하거나, 특정 작업에 맞춤화된 함수를 만들 수 있다. 예를 들어, map
함수는 배열의 각 요소에 함수를 적용하여 새로운 배열을 생성한다.
const numbers = [1, 2, 3, 4, 5];
const squaredNumbers = numbers.map((n) => n * n);
이 예에서 map
함수는 n -> n * n
라는 제곱 함수를 인자로 받는다. 이를 통해 numbers
배열의 각 요소에 제곱 함수가 적용되어 squaredNumbers
라는 새로운 배열이 생성된다.
함수를 반환 값으로 사용하기
일급 함수는 다른 함수의 반환 값으로도 사용될 수 있다. 이를 통해 함수를 생성하는 함수를 작성하거나, 함수를 데이터 구조의 일부로 저장하는 것이 가능해진다. 예를 들어, filter
함수는 배열의 요소 중 조건을 만족하는 요소만 포함하는 새로운 배열을 반환한다.
const evenNumbers = numbers.filter((n) => n % 2 === 0);
이 예에서 filter
함수는 n -> n % 2 === 0
라는 짝수 확인 함수를 반환 값으로 사용한다. 이를 통해 numbers
배열의 각 요소가 짝수 확인 함수에 적용되어 짝수 요소만 포함된 evenNumbers
배열이 생성된다.
함수 내부에 함수 내포하기
일급 함수는 다른 함수 안에 내포될 수 있다. 이를 통해 코드를 더욱 모듈화하고 유지 관리 가능하게 만들 수 있다. 예를 들어, 다음 함수는 다른 함수를 인자로 받아 해당 함수를 여러 번 호출한다.
function repeat(n, f) {
for (let i = 0; i < n; i++) {
f();
}
}
이 함수에 console.log('Hello World!')
함수를 인자로 전달하면 5번 출력된다.
repeat(5, () => console.log('Hello World!'));
일급 계산법의 장점
일급 계산법은 여러 가지 장점을 제공한다.
- 코드 재사용성 향상: 함수를 데이터처럼 취급할 수 있으므로 코드 재사용성이 크게 향상된다.
- 유연한 프로그램 로직: 함수를 동적으로 생성, 수정, 호출할 수 있으므로 프로그램 로직을 더욱 유연하게 만들 수 있다.
- 고차 함수 지원:
map
,filter
,reduce
와 같은 고차 함수는 일급 계산법을 기반으로 구현되며, 이를 통해 데이터 처리를 더욱 간결하고 효율적으로 만들 수 있다.
일급 계산법의 단점
일급 계산법에는 몇 가지 단점도 있다.
- 성능 저하: 일급 함수는 일반적으로 비일급 함수보다 성능이 저하될 수 있다. 이는 함수가 데이터 구조에 저장되거나 함수 호출을 동적으로 생성해야 하기 때문이다.
- 디버깅 어려움: 일급 함수는 프로그램 로직을 더욱 복잡하게 만들 수 있으므로 디버깅이 어려워질 수 있다.
- 가비지 수집 문제: 일급 함수는 참조 카운트 때문에 가비지 수집 문제가 발생할 수 있다. 이는 함수가 더 이상 사용되지 않더라도 다른 데이터 구조나 함수에 참조되어 있는 경우가 있기 때문이다.
결론
일급 계산법은 프로그래머에게 강력한 도구를 제공한다. 코드 재사용성과 유연성을 향상시키고 고차 함수를 사용할 수 있게 해준다. 하지만 성능 저하, 디버깅 어려움, 가비지 수집 문제와 같은 단점도 고려해야 한다. 적절하게 사용하면 일급 계산법은 복잡한 문제를 해결하고 효율적인 코드를 작성하는 데 활용될 수 있다.