자바스크립트 forEach(): 예제, index, map 차이, break continue return
자바스크립트에서 배열과 반복문을 사용해야 하는 경우에. 가장 일반적으로 사용하는 메서드 중 하나는 forEach()
메서드입니다.
이번 포스팅에서는 forEach()
메서드 사용 예제부터, index
, array
매개 변수, map()
등 다른 메서드와의 차이, break
continue
return
키워드 사용 등에 대해 알아보겠습니다.
forEach()
메서드는 배열 뿐 아니라 Set, Map 등 대부분의 자바스크립트 데이터 타입에 구현되어 있습니다.
이번 시간에는 배열 메서드에 대해서만 살펴볼게요.
JS를 실행하기 위한 Node.js 는 asdf 로 설치하는 것을 추천합니다. 관련 내용은 이 포스트에서 확인할 수 있습니다.
1. JavaScript forEach() 기초
1.1. Array.prototype.forEach() 메서드 이해하기
forEach
메서드는 Array.prototype
객체의 일부이므로 모든 배열 인스턴스에서 사용할 수 있습니다.
이 메서드는 배열을 순회하고 각 요소에 대해 지정한 함수를 실행하는 가독성 높은 방법을 제공합니다.
forEach()
메서드는 배열의 각 요소에 대해 실행하는 콜백 함수를 매개변수로 받습니다.
1.2. forEach() 메서드 기본 문법
forEach()
메서드를 사용하기 위한 기본 문법은 간단합니다.
array.forEach(function callback(currentValue[, index[, array]]) {
// Your code here
})
콜백 함수는 현재 값, 인덱스, 배열의 세 가지 매개변수를 받습니다.
currentValue
는 배열의 현재 요소를 나타내고, index
는 해당 위치를 나타내며,
array
는 배열 자체에 대한 참조입니다. 인덱스와 배열 매개변수는 선택 사항입니다.
다음은, 단순한 forEach()
메서드 사용 예제입니다.
const numbers = [1, 2, 3, 4, 5];
numbers.forEach(number => console.log(number));
1.3. 일반적인 for 문과 비교
기존의 for
문에 비해 forEach()
메서드는 더 읽기 쉽고 간결한 구문을 제공합니다.
또한, 인덱스를 벗어나는 반복이나 배열 값이 수정되어 오류가 발생하는 등의 개발자의 실수를 미연에 방지합니다.
그러나 forEach 는 특히 반복문에서 벗어나거나, 반복을 건너뛸 때 for
문과 동일한 수준의 제어 기능을 제공하지 않는다는 점에 유의하여 사용해야 합니다.
2. forEach(), map() 차이
자바스크립트에서 배열 반복에 사용할 수 있는 다른 메서드는 filter(), map(), reduce() 등이 있습니다.
이러한 메서드는 forEach
보다 더 전문화되어 있으며 특정 사용 사례에 최적화되어 있습니다:
map()
: 각 요소에 콜백 함수를 적용하여 배열을 변환하고, 변환된 요소가 포함된 새 배열을 반환합니다.reduce()
: 이전 값과 현재 값을 결합하는 함수를 적용하여 배열의 값을 하나의 값으로 합산합니다.filter()
: 지정된 조건을 통과하는 요소만 남겨서 새 배열을 만듭니다.
특히, map()
메서드가 새 배열을 반환하는 것에 비해, forEach()
메서드는 항상 undefined
를 반환합니다.
다른 배열 메서드에 대한 더 자세한 사항은 각각의 포스트를 참고해주세요.
3. forEach() 메서드 내 break, continue, return 키워드
함수형 프로그래밍 기반의 forEach()
메서드는 배열의 모든 원소를 순회하는 것을 기본으로 전제합니다.
이에 따라, 순회를 정지하거나, 재개하는 break
, continue
키워드 사용을 지원하지 않습니다.
다만, return
키워드를 사용해서, break
키워드의 역할을 대신할 수 있습니다.
아래 예제에서 요소값이 3
인 경우에, return
키워드로 다음 원소로 넘어간 것을 확인할 수 있습니다.
const array = [1, 2, 3, 4, 5];
array.forEach((element) => {
if (element === 3) {
return; // Skips the current iteration
}
console.log(element);
});
4. forEach() 사용 예제
4.1. 데이터 정리 및 포맷팅
자바스크립트 forEach()
메서드는 데이터를 처리하거나 표시하기 전에, 데이터를 정리하고 포맷팅하는 데 유용하게 사용할 수 있습니다.
예를 들어 이름에 대소문자가 섞여있는 사용자 객체 배열이 있다고 가정해 보겠습니다.
forEach()
메서드를 사용하여 대소문자를 표준화할 수 있습니다:
const users = [
{ id: 1, name: "ALICE" },
{ id: 2, name: "BOb" },
{ id: 3, name: "Charlie" }
];
users.forEach((user) => {
user.name =
user.name.charAt(0).toUpperCase() + user.name.slice(1).toLowerCase();
});
console.log(users);
// 출력:
// [
// { id: 1, name: 'Alice' },
// { id: 2, name: 'Bob' },
// { id: 3, name: 'Charlie' }
// ]
이 예제에서 forEach()
메서드는 users
배열을 반복하여 각 사용자의 이름을 적절한 대문자로 변경합니다.
이러한 유형의 데이터 정리는 애플리케이션 전체에서 일관성을 보장하여 데이터를 더 쉽게 표시하고 처리하는 데 도움이 됩니다.
4.2. DOM 조작하기
forEach()
메서드를 사용하면 HTMLCCollections를 쉽게 반복하여 DOM 요소를 조작할 수 있습니다.
예를 들어 특정 클래스 이름을 가진 모든 요소에 클래스를 추가하고 싶을 수 있습니다:
const elements = document.getElementsByClassName("target");
Array.prototype.forEach.call(elements, (element) => {
element.classList.add("new-class");
});
또한, DOM 엘리먼트의 속성이나 내용을 수정하는 데에도 사용할 수 있습니다.
예를 들어 특정 클래스 이름을 가진 모든 image
요소의 src
속성을 수정하고 싶다면 다음과 같이 할 수 있습니다.
const images = document.querySelectorAll(".image-class");
images.forEach((image) => {
image.src = "new-image-source.jpg";
});
4.3. 다른 배열 메서드와 forEach 연결하기 (체이닝)
forEach()
메서드를 다른 배열 메서드와 연결하면 더 강력하면서도 읽기 쉬운 코드를 만들 수 있습니다.
예를 들어, 주문 배열을 처리하고 특정 제품의 주문에 대한 총 수익을 계산한다고 가정해 보겠습니다:
const orders = [
{ id: 1, product: "A", price: 10, quantity: 2 },
{ id: 2, product: "B", price: 20, quantity: 1 },
{ id: 3, product: "A", price: 10, quantity: 3 },
{ id: 4, product: "C", price: 30, quantity: 1 }
];
const targetProduct = "A";
const totalRevenue = orders
.filter((order) => order.product === targetProduct)
.map((order) => order.price * order.quantity)
.reduce((acc, curr) => acc + curr, 0);
console.log(totalRevenue);
이 예제에서는, 먼저 주문 배열을 필터링하여 대상 제품이 포함된 주문만 유지합니다.
그런 다음 map
메서드를 사용하여 필터링된 각 주문의 매출을 계산합니다.
마지막으로 reduce
메서드를 사용하여 총 수익을 누적합니다.
이러한 체이닝 방식은 더 읽기 쉽고 기능적인 코드로 이어져 코드 이해와 유지 관리가 더 쉬워집니다.
5. 콜백 함수 내에서 index, array 매개변수 활용하기
forEach()
메서드의 콜백 함수는 현재 값뿐만 아니라 각 인덱스와 배열 자체에 접근하는 레퍼런스를 제공합니다.
이를 통해, 더욱 유연한 콜백 함수를 정의할 수 있습니다.
const numbers = [10, 20, 30, 40, 50];
numbers.forEach((number, index, array) => {
console.log(`Index: ${index}, Number: ${number}, Array: ${array}`);
});
// 출력값:
// Index: 0, Number: 10, Array: 10,20,30,40,50
// Index: 1, Number: 20, Array: 10,20,30,40,50
// Index: 2, Number: 30, Array: 10,20,30,40,50
// Index: 3, Number: 40, Array: 10,20,30,40,50
// Index: 4, Number: 50, Array: 10,20,30,40,50
6. 사용자 정의 forEach 메서드 구현하기
경우에 따라, 필요에 맞게 forEach의 기능을 확장하고 싶을 수 있습니다.
예를 들어, for
문에서 break
문과 같이 빨리 반복문을 벗어나거나, 콜백 함수에 추가 매개 변수를 제공하는 등의 사용자 정의 forEach 함수를 만들 수 있습니다.
사용자 정의 forEach 함수를 만들려면 for
문을 사용하고 원하는 매개변수를 전달하면 됩니다.
다음은 break
기능이 포함된 사용자 정의 forEach 함수의 예시입니다:
function customForEach(array, callback) {
for (let i = 0; i < array.length; i++) {
const result = callback(array[i], i, array);
if (result === false)
break;
}
}
const numbers = [1, 2, 3, 4, 5];
customForEach(numbers, (number) => {
if (number > 3) return false; // "break" when number > 3
console.log(number);
});
// 출력값:
// 1
// 2
// 3
7. 마치며
이번 포스팅에서 forEach()
메서드 사용 예제부터, index
array
매개 변수, map()
등 다른 메서드와의 차이,
break
continue
return
키워드 사용 등에 대해 알아보겠습니다.
보다 깔끔하고 효율적인 코드를 작성할 수 있게 해주는 forEach()
메서드의 강점과 한계를 이해하면, 다양한 웹 개발 과제를 더 잘 해결할 수 있습니다.
자바스크립트 기술을 향상하고 더욱 효과적이고 매력적인 웹 애플리케이션을 제작하기 위해 forEach()
및 기타 배열 메서드에 대해 계속 탐구해 보시기 바랍니다.