[JavaScript] 고차함수
고차함수는 함수를 값처럼 다루는 도구다. 반복문 없이도 배열 데이터를 쉽고 깔끔하게 처리할 수 있어서 현대 JavaScript 개발에서 중요하다.
🔧 고차함수 기본 개념
🎪 고차함수란?
고차함수는 다른 함수를 매개변수로 받거나 함수를 반환하는 함수다.
쉽게 말해 함수를 마치 숫자나 문자열처럼 변수에 담고 다른 함수에 전달할 수 있다는 뜻이다.
// 함수를 변수에 담기
const sayHello = function (name) {
return `안녕, ${name}!`;
};
// 함수를 다른 함수에 전달하기
function greetPeople(names, greetFunction) {
return names.map(greetFunction);
}
const names = ["철수", "영희", "민수"];
const greetings = greetPeople(names, sayHello);
// ["안녕, 철수!", "안녕, 영희!", "안녕, 민수!"]
📊 왜 고차함수를 쓸까?
고차함수는 반복문보다 코드가 짧고 간결해서 실수를 줄이고 읽기 편하다.
반복문
// 배열의 모든 숫자를 2배로 만들기
const numbers = [1, 2, 3, 4, 5];
const doubled = [];
for (let i = 0; i < numbers.length; i++) {
doubled.push(numbers[i] * 2);
}
// [2, 4, 6, 8, 10]
고차함수 방법
// 같은 작업을 고차함수로
const numbers = [1, 2, 3, 4, 5];
const doubled = numbers.map((num) => num * 2);
// [2, 4, 6, 8, 10]
반복문은 코드가 길고 직접 배열에 값을 넣어야 해서 실수할 여지가 많다.
위 예시처럼 고차함수를 사용하면 더 짧고, 읽기 쉽고, 실수를 줄일 수 있다.
🗺️ map 함수
map
함수는 배열의 모든 요소를 똑같은 규칙으로 바꿔서 새로운 배열을 만든다.
마치 도장을 찍는 것처럼, 모든 요소에 동일한 작업을 적용한다.
// 숫자를 2배로 만들기
const numbers = [1, 2, 3, 4];
const doubled = numbers.map((num) => num * 2);
// [2, 4, 6, 8]
// 이름 앞에 "안녕, " 붙이기
const names = ["철수", "영희", "민수"];
const greetings = names.map((name) => `안녕, ${name}!`);
// ["안녕, 철수!", "안녕, 영희!", "안녕, 민수!"]
- 원본 배열은 그대로 두고 새 배열을 만든다.
- 입력과 출력 배열의 길이가 항상 같다.
- 모든 요소에 동일한 변환 적용한다.
🔍 filter 함수
filter
함수는 배열에서 조건을 만족하는 요소들만 골라서 새로운 배열을 만든다.
마치 체로 걸러내는 것처럼, 원하는 것만 통과시키고 나머지는 제거한다.
// 짝수만 골라내기
const numbers = [1, 2, 3, 4, 5, 6];
const evenNumbers = numbers.filter((num) => num % 2 === 0);
// [2, 4, 6]
- 조건을 만족하는 요소만 포함한다.
- 출력 배열이 입력 배열보다 작거나 같다.
- 원본 배열은 변경되지 않는다.
📉 reduce 함수
reduce
함수는 배열의 모든 요소를 하나의 값으로 합치는 함수다.
마치 재료들을 모아서 하나의 요리를 만드는 것처럼, 모든 요소를 조합해서 최종 결과를 만든다.
// 숫자들의 합계 구하기
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((total, current) => total + current, 0);
// 15
// 가장 큰 수 찾기
const max = numbers.reduce((biggest, current) => {
return current > biggest ? current : biggest;
}, 0);
// 5
- 배열 전체를 하나의 값으로 축약한다.
- 누적값을 계속 업데이트하면서 진행된다.
- 초기값을 지정할 수 있다.
🕵️♂️ find 함수
find
함수는 조건을 처음으로 만족하는 요소 하나만 반환한다.
// 짝수 중 첫 번째 숫자 찾기
const numbers = [1, 3, 4, 6, 8];
const firstEven = numbers.find((num) => num % 2 === 0);
// 4
- 조건을 만족하는 첫 번째 요소만 반환된다.
- 만족하는 요소가 없으면 결과는
undefined
, 아무 값도 찾지 못했다는 뜻이다. - 반환 결과는 배열이 아니라 요소 하나이다.
✅ some 함수
some
함수는 배열 안에 조건을 만족하는 요소가 하나라도 있는지 확인한다.
// 짝수가 하나라도 있는지 확인하기
const numbers = [1, 3, 5, 7, 8];
const hasEven = numbers.some((num) => num % 2 === 0);
// true
- 조건을 만족하는 요소가 하나라도 있으면 true를 반환한다.
- 모든 요소가 조건을 만족하지 않으면 false를 반환한다.
- 조건 확인만 하며, 배열은 변하지 않는다.
🧪 every 함수
every
함수는 배열의 모든 요소가 조건을 만족하는지 확인한다.
// 모든 숫자가 홀수인지 확인하기
const numbers = [1, 3, 5];
const allOdd = numbers.every((num) => num % 2 === 1);
// true
- 모든 요소가 조건을 만족하면 true를 반환한다.
- 하나라도 조건을 만족하지 않으면 false를 반환한다.
- 배열 전체의 일관성을 확인할 때 유용하다.
🎯 함수들을 연결해서 사용하기
고차함수들의 진짜 힘은 여러 개를 연결해서 사용할 때 나타난다. 마치 레고 블록을 조립하듯 단계별로 연결할 수 있다.
// 학생 데이터 처리 예시
const students = [
{ name: "철수", age: 20, grade: 85 },
{ name: "영희", age: 22, grade: 92 },
{ name: "민수", age: 19, grade: 78 },
{ name: "지원", age: 21, grade: 88 },
{ name: "수진", age: 20, grade: 95 },
];
// 성인 중에서 우수한 학생들의 평균 점수 구하기
const averageGrade =
students
.filter((student) => student.age >= 20) // 성인만 선별
.filter((student) => student.grade >= 85) // 우수한 학생만 선별
.map((student) => student.grade) // 점수만 추출
.reduce((sum, grade) => sum + grade, 0) / // 점수 합계
students.filter((s) => s.age >= 20 && s.grade >= 85).length; // 평균 계산
이렇게 여러 고차함수를 연결하면 읽기 쉽고, 무엇을 하고 싶은지가 코드에서 바로 드러난다.
고차함수는 단순히 편의 기능이 아니라 생각하는 방식을 바꿔주는 도구다. “어떻게 할지” 고민하는 대신 “무엇을 할지”에 집중할 수 있게 해준다.
복잡한 반복문 대신 고차함수를 활용해 더 깔끔하고 효율적인 코드를 작성해보자!
Leave a comment