JavaScript 독학 가이드 4 - 반복문과 배열
“숫자 1부터 100까지 출력해주세요.” 이걸 console.log(1), console.log(2) 이렇게 100번 쓸 건가요? 당연히 아니죠. 반복문을 쓰면 3줄로 끝납니다. 그리고 여러 개의 데이터를 한 번에 관리하려면 배열을 알아야 해요.
배열이 뭔가요?
배열은 여러 값을 하나의 변수에 담는 상자예요.
// 변수는 값 하나만
let student1 = "철수";
let student2 = "영희";
let student3 = "민수";
// 배열은 여러 값을 한꺼번에
let students = ["철수", "영희", "민수"];
배열 만들기
// 방법 1: 대괄호
let fruits = ["사과", "바나나", "딸기"];
// 방법 2: new Array() (잘 안 씀)
let numbers = new Array(1, 2, 3);
// 빈 배열
let empty = [];
배열 접근하기
배열의 각 값은 인덱스(번호)로 접근합니다. 인덱스는 0부터 시작해요!
let fruits = ["사과", "바나나", "딸기"];
console.log(fruits[0]); // "사과" (첫 번째)
console.log(fruits[1]); // "바나나" (두 번째)
console.log(fruits[2]); // "딸기" (세 번째)
실행 결과:
> console.log(fruits[0])
사과
> console.log(fruits[1])
바나나
> console.log(fruits[2])
딸기
배열 길이
let fruits = ["사과", "바나나", "딸기"];
console.log(fruits.length); // 3
실행 결과:
> console.log(fruits.length)
3
length는 배열에 몇 개의 요소가 있는지 알려줘요.
배열 값 변경
let fruits = ["사과", "바나나", "딸기"];
fruits[1] = "포도";
console.log(fruits); // ["사과", "포도", "딸기"]
실행 결과:
> console.log(fruits)
["사과", "포도", "딸기"]
배열 메서드
let fruits = ["사과", "바나나"];
// 끝에 추가
fruits.push("딸기");
console.log(fruits); // ["사과", "바나나", "딸기"]
// 끝에서 제거
fruits.pop();
console.log(fruits); // ["사과", "바나나"]
// 맨 앞에 추가
fruits.unshift("포도");
console.log(fruits); // ["포도", "사과", "바나나"]
// 맨 앞에서 제거
fruits.shift();
console.log(fruits); // ["사과", "바나나"]
실행 결과:
> fruits.push("딸기")
> console.log(fruits)
["사과", "바나나", "딸기"]
> fruits.pop()
> console.log(fruits)
["사과", "바나나"]
> fruits.unshift("포도")
> console.log(fruits)
["포도", "사과", "바나나"]
> fruits.shift()
> console.log(fruits)
["사과", "바나나"]
for문
같은 코드를 여러 번 실행할 때 씁니다.
기본 형태
for (let i = 0; i < 5; i++) {
console.log(i);
}
// 출력: 0, 1, 2, 3, 4
실행 결과:
> for (let i = 0; i < 5; i++) { console.log(i); }
0
1
2
3
4
구조:
let i = 0: 시작값 (초기화)i < 5: 조건 (언제까지 반복할지)i++: 증가식 (매 반복마다 실행)
배열과 함께 사용
let fruits = ["사과", "바나나", "딸기"];
for (let i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}
// 출력:
// 사과
// 바나나
// 딸기
실행 결과:
> for (let i = 0; i < fruits.length; i++) { console.log(fruits[i]); }
사과
바나나
딸기
for…of문 (간단한 방법)
배열의 각 요소를 순회할 때 더 간단합니다.
let fruits = ["사과", "바나나", "딸기"];
for (let fruit of fruits) {
console.log(fruit);
}
// 출력: 사과, 바나나, 딸기
실행 결과:
> for (let fruit of fruits) { console.log(fruit); }
사과
바나나
딸기
인덱스가 필요 없을 땐 for...of가 훨씬 깔끔해요.
while문
조건이 true인 동안 계속 반복합니다.
let count = 0;
while (count < 5) {
console.log(count);
count++;
}
// 출력: 0, 1, 2, 3, 4
실행 결과:
> while (count < 5) { console.log(count); count++; }
0
1
2
3
4
주의: 조건이 항상 true면 무한 루프에 빠져요!
// 위험! 브라우저 멈춤
while (true) {
console.log("무한 반복!");
}
do…while문
최소 한 번은 실행하고, 그 다음부터 조건을 체크합니다.
let num = 10;
do {
console.log(num);
num++;
} while (num < 5);
// 출력: 10 (조건이 false지만 한 번은 실행됨)
실행 결과:
> do { console.log(num); num++; } while (num < 5);
10
break와 continue
break - 반복문 종료
for (let i = 0; i < 10; i++) {
if (i === 5) {
break; // i가 5가 되면 반복 중단
}
console.log(i);
}
// 출력: 0, 1, 2, 3, 4
실행 결과:
> for (let i = 0; i < 10; i++) { if (i === 5) break; console.log(i); }
0
1
2
3
4
continue - 현재 반복 건너뛰기
for (let i = 0; i < 5; i++) {
if (i === 2) {
continue; // i가 2일 때 건너뜀
}
console.log(i);
}
// 출력: 0, 1, 3, 4 (2는 출력 안 됨)
실행 결과:
> for (let i = 0; i < 5; i++) { if (i === 2) continue; console.log(i); }
0
1
3
4
중첩 반복문
반복문 안에 반복문을 넣을 수 있어요.
// 구구단 2단
for (let i = 1; i <= 9; i++) {
console.log(`2 x ${i} = ${2 * i}`);
}
// 구구단 전체
for (let i = 2; i <= 9; i++) {
for (let j = 1; j <= 9; j++) {
console.log(`${i} x ${j} = ${i * j}`);
}
}
실행 결과 (구구단 2단):
> for (let i = 1; i <= 9; i++) { console.log(`2 x ${i} = ${2 * i}`); }
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
실전 예제
1. 배열의 합 계산
let numbers = [10, 20, 30, 40, 50];
let sum = 0;
for (let num of numbers) {
sum += num;
}
console.log(`합계: ${sum}`); // 합계: 150
실행 결과:
> console.log(`합계: ${sum}`)
합계: 150
2. 짝수만 출력
for (let i = 1; i <= 10; i++) {
if (i % 2 === 0) {
console.log(i);
}
}
// 출력: 2, 4, 6, 8, 10
실행 결과:
> for (let i = 1; i <= 10; i++) { if (i % 2 === 0) console.log(i); }
2
4
6
8
10
3. 배열에서 특정 값 찾기
let fruits = ["사과", "바나나", "딸기", "포도"];
let target = "딸기";
let found = false;
for (let i = 0; i < fruits.length; i++) {
if (fruits[i] === target) {
console.log(`${target}을(를) ${i}번 인덱스에서 찾았습니다!`);
found = true;
break;
}
}
if (!found) {
console.log("찾지 못했습니다");
}
실행 결과:
> for (let i = 0; i < fruits.length; i++) { ... }
딸기을(를) 2번 인덱스에서 찾았습니다!
4. 역순 출력
let numbers = [1, 2, 3, 4, 5];
for (let i = numbers.length - 1; i >= 0; i--) {
console.log(numbers[i]);
}
// 출력: 5, 4, 3, 2, 1
실행 결과:
> for (let i = numbers.length - 1; i >= 0; i--) { console.log(numbers[i]); }
5
4
3
2
1
5. 별 찍기
// 직각삼각형
for (let i = 1; i <= 5; i++) {
let stars = "";
for (let j = 1; j <= i; j++) {
stars += "*";
}
console.log(stars);
}
// 출력:
// *
// **
// ***
// ****
// *****
실행 결과:
> for (let i = 1; i <= 5; i++) { ... }
*
**
***
****
*****
배열의 유용한 메서드
map - 각 요소 변환
let numbers = [1, 2, 3, 4, 5];
let doubled = numbers.map(num => num * 2);
console.log(doubled); // [2, 4, 6, 8, 10]
실행 결과:
> console.log(doubled)
[2, 4, 6, 8, 10]
filter - 조건에 맞는 요소만
let numbers = [1, 2, 3, 4, 5];
let evens = numbers.filter(num => num % 2 === 0);
console.log(evens); // [2, 4]
실행 결과:
> console.log(evens)
[2, 4]
forEach - 각 요소마다 실행
let fruits = ["사과", "바나나", "딸기"];
fruits.forEach(fruit => console.log(fruit));
실행 결과:
> fruits.forEach(fruit => console.log(fruit))
사과
바나나
딸기
이 메서드들은 나중에 자세히 배울 거예요. 지금은 이런 게 있다는 것만 알아두세요.
자주 하는 실수
1. 인덱스 범위 초과
let arr = [1, 2, 3];
console.log(arr[3]); // undefined (인덱스는 0, 1, 2만 있음)
실행 결과:
> console.log(arr[3])
undefined
2. 무한 루프
let i = 0;
while (i < 10) {
console.log(i);
// i++를 깜빡하면 무한 루프!
}
3. for문 조건 실수
let arr = [1, 2, 3];
// 틀림: <= 쓰면 범위 초과
for (let i = 0; i <= arr.length; i++) {
console.log(arr[i]); // 마지막에 undefined
}
// 맞음: < 사용
for (let i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
다음 단계
다음 글에서는 함수와 스코프를 배웁니다. 코드를 재사용 가능하게 만들고, 변수의 유효 범위를 이해하는 방법을 알아볼 거예요.
반복문은 처음엔 헷갈리지만, 연습하면 금방 익숙해져요. 직접 타이핑해보면서 익히세요!
JavaScript 독학 가이드 시리즈:
← 블로그 목록으로