모던 자바스크립트 Deep Dive

[TIL/모던 자바스크립트 Deep Dive] 2023/05/24

12장. 함수 12-7. 다양한 함수의 형태(이어서...) > 중첩 함수 함수 내부에 정의된 함수를 라 한다. 중첩 함수를 포함하는 함수는 라 부른다. 중첩 함수는 외부 함수 호출할 수 있다. > 콜백 함수 특정 작업을 반복 수행하는 repeat 함수를 정의

2023년 5월 24일2min read

12장. 함수

12-7. 다양한 함수의 형태(이어서...)

중첩 함수

함수 내부에 정의된 함수를 ``중첩 함수(nested function) 또는 내부 함수(inner function)`라 한다. 중첩 함수를 포함하는 함수는 `외부 함수(outer function)`라 부른다. 중첩 함수는 외부 함수 `내부에서만`` 호출할 수 있다.

콜백 함수

특정 작업을 반복 수행하는 repeat 함수를 정의해 봤다.

repeat 함수는 console.log(i)에 강하게 의존하고 있어 다른 작업을 수행할 수 없다. 만약 repeat 함수의 반복문 내부에서 다른 일을 하고 싶다면, 함수를 새롭게 정의해야 한다.

위 예제의 함수들은, 반복하는 일의 '내용'만 다르다. 함수의 일부분만이 다른데 매번 함수를 새롭게 정의해야 한다. 함수의 변하지 않는 공통 로직은 미리 정의해 두고, 경우에 따라 변경되는 로직은 추상화해서 함수 외부에서 함수 내부로 전달하는 '함수 합성'이 해당 문제를 해결할 수 있다.

repeat 함수는 더 이상 내부 로직에 강력히 의존하지 않고 외부에서 로직의 일부분을 함수로 전달받아 수행하므로, 더욱 유연한 구조를 갖게 되었다.

함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수를 ``콜백 함수(callback function)`라고 하며, 매개변수를 통해 함수의 외부에서 콜백 함수를 전달받은 함수를 `고차 함수(Higher-Order Function, HOF)``라고 한다.

'중첩 함수'와 '콜백 함수'는 모두 헬퍼 함수로서의 역할을 한다. 다만, 중첩 함수는 고정되어 있기에 교체가 곤란하지만, 콜백 함수는 함수 외부에서 고차 함수로 주입하기 때문에 자유롭게 교체할 수 있다는 차이가 있다. 즉, 고차 함수는 콜백 함수를 자신의 일부분으로 합성한다.

콜백 함수는 고차 함수에 의해 호출되는데, 이때 고차 함수는 필요에 따라 콜백 함수에 인수를 전달할 수 있다. 따라서 고차 함수에 콜백 함수를 전달할 때 콜백 함수를 호출하지 않고 함수 자체를 전달해야 한다. 콜백 함수가 고차 함수 내부에서만 호출된다면, 콜백 함수를 익명 함수 리터럴로 정의하면서 곧바로 고차 함수에 전달하는 것이 일반적이다.

콜백 함수를 다른 곳에서도 호출할 필요가 있거나, 콜백 함수를 전달받는 함수가 자주 호출된다면 함수 외부에서 콜백함수를 정의하고 '함수 참조'를 고차 함수에 전달하는 편이 효율적이다.

콜백 함수는 함수형 프로그래밍 패러다임뿐만 아니라 비동기 처리에 활용되는 중요한 패턴이다.

콜백 함수는 비동기 처리뿐 아니라 배열 고차 함수에서도 사용된다. 가볍게 살펴봤다. 자세한 내용은 27장에서 다룬다고 한다.