JS 3.2 · 3부. 데이터 다루기

배열 반복하기

for...of 와 forEach 로 배열을 탐색합니다.

예상 학습 시간 14분 실행 단추가 있는 예제는 고쳐서 실행해 볼 수 있습니다 난이도 초급
개념 설명

배열을 처음부터 끝까지 훑습니다

1.10 의 for 로도 배열을 다룰 수 있습니다. 다만 번호를 세는 일이 매번 되풀이되고, 조건의 등호 하나만 틀려도 한 번 모자라거나 남습니다.

배열에는 더 짧고 안전한 방법이 둘 있습니다 — for...offorEach 입니다.

최소 예제 · 편집 가능

세 가지 방법

script.js
const fruits = ["사과", "바나나"];

for (let i = 0; i < fruits.length; i++) {
	console.log(`for: ${fruits[i]}`);
}

for (const fruit of fruits) {
	console.log(`for...of: ${fruit}`);
}

fruits.forEach(fruit => console.log(`forEach: ${fruit}`));
출력
for: 사과 for: 바나나 for...of: 사과 for...of: 바나나 forEach: 사과 forEach: 바나나

for...of값이 바로 들어옵니다. 번호를 세지 않으니 실수할 자리도 없습니다.

상세 사용법

forEach 는 함수를 받습니다

2.6 에서 본 콜백입니다. forEach 는 값마다 한 번씩 넘겨받은 함수를 부릅니다. 두 번째 매개 변수로 번호도 받습니다.

script.js
const items = ["연필", "공책", "지우개"];

items.forEach((item, index) => {
	console.log(`${index + 1}. ${item}`);
});
출력
1. 연필 2. 공책 3. 지우개

번호가 필요 없으면 매개 변수를 하나만 받으면 됩니다. 넘겨주는 쪽이 둘을 주더라도 받는 쪽이 하나만 적으면 나머지는 버려집니다(2.6).

상세 사용법

합계 구하기

script.js
const prices = [1000, 2000, 500];

let total = 0;

for (const price of prices) {
	total += price;
}

console.log(total);
출력
3500

더해 갈 값은 반복문 에 두어야 합니다. 안에 두면 돌 때마다 새로 만들어집니다(2.4).

상세 사용법

중간에 멈출 수 있는가

forfor...ofbreak 로 멈출 수 있습니다. forEach 는 멈출 수 없습니다. 값마다 함수를 부르는 것이라 그 함수 안의 return 은 그 회차만 끝냅니다.

script.js
const numbers = [1, 2, 3, 4];

for (const n of numbers) {
	if (n > 2) break;
	console.log(`for...of: ${n}`);
}

numbers.forEach(n => {
	if (n > 2) return;
	console.log(`forEach: ${n}`);
});
출력
for...of: 1 for...of: 2 forEach: 1 forEach: 2

출력이 같아 보이지만 다릅니다. 위는 3에서 끝났고, 아래는 3과 4에서도 함수를 부르되 아무것도 하지 않고 건너뛴 것입니다. 값이 많으면 차이가 납니다.

상세 사용법

무엇을 선택할까

  • for...of — 기본으로 사용합니다. 중간에 멈출 수 있습니다.
  • forEach — 멈출 일이 없고 짧게 적고 싶을 때.
  • for — 번호가 꼭 필요하거나, 거꾸로 돌거나, 두 칸씩 건너뛸 때.
흔한 실수

처음에 자주 걸리는 것

1. for...in 과 헷갈립니다

for...in 은 값이 아니라 번호가 들어오고 그것도 글자입니다. 배열에는 for...of 를 사용하세요.

for (const x in ["가", "나"]) console.log(x);   // "0" "1" 이 나옵니다
2. forEach 를 break 로 멈추려 합니다

구문 오류가 납니다. 멈춰야 한다면 for...of 를 사용하세요.

SyntaxError: Illegal break statement
3. 더해 갈 변수를 반복문 안에 둡니다

돌 때마다 새로 만들어져 늘 마지막 값만 남습니다. 밖에 두세요.

실습 문제

직접 해보기

1. 번호를 붙여 출력하기 난이도 하

이름이 담긴 배열을 1. 홍길동 형태로 한 줄씩 출력하세요.

const names = ["홍길동", "김철수"]; names.forEach((name, i) => console.log(`${i + 1}. ${name}`));
2. 처음 만나는 합격 점수 찾기 난이도 중

점수 배열에서 60 이상인 첫 점수를 찾아 출력하고 반복을 멈추세요. 없으면 "없습니다" 를 출력합니다.

멈춰야 하므로 forEach 가 아니라 for...of 입니다. 찾았는지 표시할 변수를 하나 두면 됩니다.
const scores = [42, 58, 85, 91]; let found = null; for (const score of scores) { if (score >= 60) { found = score; break; } } console.log(found === null ? "없습니다" : found);
요약

이 단원의 정리

  • for...of 는 값이 바로 들어옵니다. 기본으로 사용합니다.
  • forEach 는 값마다 함수를 부릅니다. 번호는 두 번째 매개 변수입니다.
  • forEach 는 중간에 멈출 수 없습니다.
  • 더해 갈 변수는 반복문 밖에 둡니다.
  • 배열에는 for...in 을 사용하지 않습니다.