본문 바로가기
IT/자바스크립트

JavaScript forEach 완벽 가이드 배열을 효율적으로 다루는 최고의 방법

by 불멸남생 2025. 3. 25.

JavaScript에서 배열을 반복 처리할 때 가장 많이 사용하는 메서드 중 하나가 forEach입니다. 이 메서드는 간결하고 직관적인 코드 작성을 가능하게 하며, 특히 비동기 함수나 함수형 프로그래밍 패턴과 함께 사용될 때 뛰어난 가독성과 생산성을 제공합니다. 본 문서는 forEach 메서드의 사용법, 특징, 성능, 실전 예제 등을 중심으로 한 심층 분석으로, 구글 상위 노출을 목표로 작성된 고품질 SEO 최적화 콘텐츠입니다.

JavaScript forEach란 무엇인가?

forEach는 JavaScript의 배열 메서드 중 하나로, 배열의 각 요소에 대해 콜백 함수를 실행합니다. for, while 루프를 대체하는 함수형 프로그래밍 도구로서 자주 활용되며, 가독성이 뛰어나고 코드 라인이 짧아집니다.

기본 문법

array.forEach(function(currentValue, index, array) {
  // 실행할 코드
});
  • currentValue: 현재 요소
  • index: 현재 요소의 인덱스
  • array: forEach가 호출된 배열 자체
반응형

forEach의 핵심 기능 및 특성

1. 반환값이 없다

forEach는 항상 undefined를 반환합니다. 즉, map()처럼 새로운 배열을 생성하지 않으며 오직 반복 수행만을 목적으로 합니다.

const result = [1, 2, 3].forEach(num => console.log(num));
console.log(result); // undefined

2. break 또는 return 불가

전통적인 반복문과 달리, forEach는 break, continue를 사용할 수 없으며 루프를 중단하려면 예외 처리를 하거나 some, every 등의 대체 메서드를 사용해야 합니다.

3. 비동기 함수와 함께 사용할 때 주의

forEach는 async/await와 함께 사용할 경우 의도한 비동기 흐름을 만들지 못할 수 있습니다. 이럴 때는 for...of 루프가 더 적절합니다.

반응형

forEach 사용 예제: 실무 중심의 코드

1. 단순 출력

const fruits = ["사과", "바나나", "체리"];
fruits.forEach(function(item, index) {
  console.log(`${index + 1}번째 과일은 ${item}입니다.`);
});

2. 객체 배열에서 특정 속성 추출

const users = [
  { name: "철수", age: 28 },
  { name: "영희", age: 24 },
  { name: "민수", age: 31 }
];

users.forEach(user => {
  console.log(user.name);
});

3. DOM 요소 반복 처리

document.querySelectorAll('button').forEach(button => {
  button.addEventListener('click', function() {
    alert(`${this.textContent} 버튼 클릭됨`);
  });
});
반응형

forEach와 다른 반복 메서드 비교

메서드 반환값 break 가능 여부 사용 용도

forEach 없음 (undefined) 불가 단순 반복
map 새 배열 생성 불가 데이터 변환
filter 조건에 맞는 새 배열 불가 조건에 따른 필터링
some 불리언 가능 조건 충족 여부 확인
every 불리언 가능 모든 요소가 조건 충족 여부 확인
for...of 자유로움 가능 async/await와 함께 사용 가능
반응형

forEach 사용 시 주의할 점

1. 성능 이슈

forEach는 성능 면에서 for 루프보다 약간 느릴 수 있으나, 일반적인 수준의 반복에서는 무시해도 될 정도입니다. 대량의 데이터 처리 시는 반복문을 통한 최적화가 필요할 수 있습니다.

2. 중단 불가

중간에 반복을 멈출 수 없다는 점은 forEach의 가장 큰 제약 중 하나입니다. 반복 도중 조건을 만나 중단해야 하는 로직에는 some, every, 혹은 전통적인 반복문을 사용하세요.

3. 비동기 처리와의 궁합

async/await를 함께 사용할 경우, forEach는 await를 기다리지 않고 실행을 계속합니다. 아래는 잘못된 예시입니다:

// 잘못된 예
const asyncFunc = async () => {
  [1, 2, 3].forEach(async num => {
    await someAsyncTask(num);
  });
};

올바른 방식은 for...of 루프입니다.

const asyncFunc = async () => {
  for (const num of [1, 2, 3]) {
    await someAsyncTask(num);
  }
};
반응형

실무 활용: forEach를 사용한 데이터 가공

1. 배열 합계 구하기

const numbers = [10, 20, 30];
let sum = 0;
numbers.forEach(num => {
  sum += num;
});
console.log(`합계: ${sum}`);

2. HTML 리스트 생성

const animals = ['고양이', '강아지', '토끼'];
const ul = document.createElement('ul');

animals.forEach(animal => {
  const li = document.createElement('li');
  li.textContent = animal;
  ul.appendChild(li);
});

document.body.appendChild(ul);
반응형

forEach 고급 사용법과 트릭

1. thisArg 사용

forEach는 콜백 함수의 두 번째 인자로 this 값을 바인딩할 수 있습니다.

const obj = {
  prefix: "항목:",
  print(item) {
    console.log(this.prefix, item);
  }
};

["A", "B", "C"].forEach(function(item) {
  this.print(item);
}, obj);

2. 중첩 forEach

배열 안에 배열이 있을 경우 중첩 사용이 가능합니다.

const matrix = [
  [1, 2],
  [3, 4]
];

matrix.forEach(row => {
  row.forEach(cell => {
    console.log(cell);
  });
});
반응형

forEach를 대체할 수 있는 상황별 최적 메서드

  • 새 배열 반환이 필요한 경우: map
  • 조건 필터링이 필요한 경우: filter
  • 조건 만족 여부만 확인할 경우: some, every
  • 비동기 루프가 필요한 경우: for...of

이러한 메서드들과의 차이점을 명확히 이해하고 상황에 맞게 활용해야 생산성과 코드 품질을 모두 끌어올릴 수 있습니다.

반응형

결론

forEach는 단순하면서도 강력한 반복 도구입니다. 이해하기 쉽고, 실무에서 자주 사용되는 만큼 문법적 특성과 한계를 정확히 파악하고 적재적소에 사용하는 것이 중요합니다. 위에서 소개한 다양한 예제와 활용법을 통해 forEach를 완전히 마스터하고 더 나은 JavaScript 코드를 작성해보시기 바랍니다.

반응형