일급 함수란 무엇인가?
일급 함수(first-class function)는 함수가 다른 값과 동일한 방식으로 다뤄질 수 있는 프로그래밍 언어의 특징을 의미한다. 이는 함수가 변수에 저장되거나, 함수의 인자로 전달되거나, 함수의 반환값으로 사용될 수 있음을 나타낸다.
일급 함수의 특징
•
변수에 저장 가능: 함수를 변수에 할당할 수 있다.
•
인자로 전달 가능: 함수를 다른 함수에 인자로 전달할 수 있다.
•
반환값으로 사용 가능: 함수를 다른 함수의 반환값으로 사용할 수 있다.
예시
// 함수를 변수에 저장
const greet = (name) => `Hello, ${name}!`;
// 함수를 인자로 전달
function executeFunction(func, value) {
return func(value);
}
console.log(executeFunction(greet, 'Alice')); // "Hello, Alice!"
// 함수를 반환값으로 사용
function createMultiplier(multiplier) {
return (value) => value * multiplier;
}
const double = createMultiplier(2);
console.log(double(5)); // 10
JavaScript
복사
고차 함수란 무엇인가?
고차 함수(higher-order function)는 함수를 인자로 받거나, 함수를 반환값으로 제공하는 함수다. 이는 일급 함수의 개념에 기반하며, 복잡한 로직을 단순화하고, 코드를 재사용 가능하게 만들어 준다.
일급 함수와 고차 함수를 사용한 리팩터링 예시
리팩터링 전 코드
다음은 여러 버튼에서 각각 다른 작업을 수행할 때마다 공통적인 로깅 기능을 반복적으로 사용하는 코드이다.
function handleLogin() {
console.log('User clicked login');
// 로그인 처리 로직
}
function handleSignup() {
console.log('User clicked signup');
// 회원가입 처리 로직
}
function handleLogout() {
console.log('User clicked logout');
// 로그아웃 처리 로직
}
document.getElementById('loginButton').addEventListener('click', handleLogin);
document.getElementById('signupButton').addEventListener('click', handleSignup);
document.getElementById('logoutButton').addEventListener('click', handleLogout);
JavaScript
복사
이 코드에서는 각 버튼의 클릭 핸들러마다 공통적인 로깅 기능이 중복된다.
리팩터링 후 코드
고차 함수를 사용해 공통적인 로깅 로직을 분리하고, 각 핸들러를 더 간결하게 작성할 수 있다.
고차 함수로 횡단 관심사 분리
// 고차 함수: 공통 로직 추가
function withLogging(handler, message) {
return function (event) {
console.log(message);
handler(event);
};
}
// 개별 핸들러
function handleLogin() {
// 로그인 처리 로직
}
function handleSignup() {
// 회원가입 처리 로직
}
function handleLogout() {
// 로그아웃 처리 로직
}
// 이벤트 리스너 등록
const loginButton = document.getElementById('loginButton');
loginButton.addEventListener('click', withLogging(handleLogin, 'User clicked login'));
const signupButton = document.getElementById('signupButton');
signupButton.addEventListener('click', withLogging(handleSignup, 'User clicked signup'));
const logoutButton = document.getElementById('logoutButton');
logoutButton.addEventListener('click', withLogging(handleLogout, 'User clicked logout'));
JavaScript
복사
리팩터링의 장점
1.
중복 제거: 공통적인 로깅 로직이 한 곳에서 관리되므로 중복 코드를 제거할 수 있다.
2.
가독성 향상: 각 핸들러의 핵심 로직이 더 잘 드러난다.
3.
유연성 증가: withLogging 함수는 다양한 로깅 요구사항에 쉽게 확장 가능하다.
결론
일급 함수와 고차 함수는 함수형 코딩의 핵심 개념으로, 코드의 재사용성과 가독성을 높이고, 유지보수를 용이하게 한다. 개발자는 이러한 개념을 활용해 반복되는 코드를 줄이고, 횡단 관심사를 효과적으로 분리할 수 있다. 이를 통해 더 모듈화되고 유연한 코드를 작성할 수 있다.