
반복문은 프로그램에서 동일한 코드 블록을 여러 번 실행하는 데 사용됩니다. 이를 통해 반복적인 작업을 자동화하고 코드의 중복을 줄일 수 있습니다.
// for (시작조건; 종료조건; 변화조건;) {
// 반복 실행될 코드
// }
for (let i = 0; i < 3; i += 1) {
// 반복 실행될 코드
}
const ulEl = document.querySelector("ul");
for (let i = 1; i <= 10; i += 1) {
// 반복 실행될 코드
const li = document.createElement("li");
li.textContent = `list-${i}`;
if (i % 2 === 0) {
li.addEventListener("click", function () {
console.log(li.textContent);
});
}
ulEl.appendChild(li);
}

let i = 1 변수 i를 선언하고 1으로 초기화합니다. 이것은 반복문의 초기값을 설정하는 부분입니다.i < 10 이 부분은 for문이 얼마나 반복될 것인지를 결정하는 조건을 작성하는 부분입니다. 이 조건이 참이면 실행됩니다.i += 1 이 부분은 반복문이 한 번 실행될 때마다 i가 1씩 증가하도록 합니다.i 값이 10이 되는 순간 중단됩니다. <li>태그를 생성하고, 이 태그의 텍스트로 list-${i}를 설정합니다. i는 1부터 시작합니다. if를 사용하여 i이 짝수인 경우 li의 클릭 이벤트를 실행합니다. 이 클릭 이벤트는 li 태그의 텍스트를 콘솔에 로그합니다. 그리고 생성된 li태그를 ul 태그에 추가합니다. const animals = [
"Aardvark",
"Aardwolf",
"African Elephant",
"African Tree Pangolin",
"Alligator",
"Alpaca",
"Anteater",
"Antelope",
"Ape(s)",
"Arabian Horse",
"Armadillo",
"Arthropod(s)",
"Asian Elephant",
"Aye-Aye",
"Baboon",
"Badger",
"Bandicoot",
];
// 'for' 반복문을 사용하여 'animals' 배열의 모든 요소를 순회합니다.
for (let i = 0; i < animals.length; i++) {
// 각 반복마다, 현재 인덱스(i)와 그 인덱스에 해당하는 동물 이름을 콘솔에 출력합니다.
console.log(i, animals[i]);
}

i < animals.length라는 조건은 i의 값이 animals 배열의 길이보다 작을 때만 참(true)입니다. 따라서 i의 값이 animals 배열의 길이와 같거나 크게 되면, 이 조건은 거짓(false)가 되어 for 반복문이 종료되게 됩니다. 모든 배열의 요소를 순회하고 반복문이 종료됩니다.let i = 0;
while (i < 5) {
console.log(i);
i++;
}
let count = 5;
while (count >= 1) {
console.log(count);
count--;
}
console.log("발사!");

const SECRET = "BabyHippo";
let guess = prompt("enter the secret code...");
while (guess !== SECRET) {
guess = prompt("enter the secret code...");
}
console.log("CONGRATS YOU GOT THE SECRET!!!");
BabyHippo라는 정확한 비밀 코드를 입력할 때까지 이 요청을 반복합니다. 사용자가 정확한 비밀 코드를 입력하면, CONGRATS YOU GOT THE SECRET!!! 라는 메시지가 콘솔에 출력됩니다.guess !== SECRET는 사용자의 입력값(guess)이 SECRET(BabyHippo)과 같지 않다는 조건을 표현합니다. 사용자가 BabyHippo를 입력할 때까지 이 조건이 참이며, 그 때 조건이 거짓이 되어 while 반복문이 종료됩니다.추측 게임 만들기 - 사용자가 숫자를 추측하는 게임입니다.
let maxinum = parseInt(prompt("숫자 추측하기 게임! 숫자를 입력해주세요!!"));
while (!maxinum) {
maxinum = parseInt(prompt("숫자를 입력하세요!"));
}
const targetNum = Math.floor(Math.random() * maxinum) + 1;
let count = 1;
let inPutval = prompt(
"첫 번째 추측값을 입력하세요 'q'를 입력해 종료할 수 있습니다."
);
while (parseInt(inPutval) !== targetNum) {
if (inPutval === "q") break;
inPutval = parseInt(inPutval);
if (inPutval > targetNum) {
inPutval = prompt("높아요");
count++;
} else if (inPutval < targetNum) {
inPutval = prompt("낮아요");
count++;
} else {
inPutval = prompt(
"다른거 말고 숫자를 입력해주세요. 'q'를 입력해 종료할 수 있습니다."
);
}
}
if (inPutval === "q") {
console.log("수고하셨습니다.");
} else {
console.log(`축하드려요~! ${count}번 만에 맞추셨어요!`);
}
각 부분이 어떤식으로 작동하는지 확인해보겠습니다.
let maxinum = parseInt(prompt("숫자 추측하기 게임! 숫자를 입력해주세요!!"));
// 사용자가 유효한 숫자를 입력할 때까지 계속해서 입력을 요청합니다.
while (!maxinum) {
maxinum = parseInt(prompt("숫자를 입력하세요!"));
}
NaN, null, undefined, 0, 빈 문자열(""), false와 같은 값들은 falsy(거짓으로 취급되는) 값입니다.parseInt 함수는 숫자로 변환할 수 없는 값을 처리하면 NaN을 반환합니다. while (!maxinum)에서 maximum이 Falsy값을 가지게 되면 !maxinum은 ture가 되어서 while문이 계속 실행됩니다. 즉 코드는 사용자가 숫자(0이 아닌 정수)를 입력할 때 까지 계속 해서 입력을 요청하게 됩니다.// 1부터 사용자가 입력한 최대 숫자(maxinum)까지의 범위에서 랜덤한 정수를 생성합니다.
const targetNum = Math.floor(Math.random() * maxinum) + 1;
// 사용자의 추측 횟수를 저장하는 변수입니다. 초기값은 1로 설정합니다.
let count = 1;
Math.random()은 0과 1 사이의 랜덤한 소수를 생성합니다.maximum(사용자 입력값)이 10이라면, Math.random() * maximum의 결과는 0부터 9.9999.. 중 하나가 됩니다. 정수를 얻어야 하기 때문에 Math.floor() 함수로 소수점 아래를 버려주면서 0부터 9 사이의 정수를 얻을 수 있습니다. +1을 해줘서 0이 아닌 1부터 시작, 최대값도 10이 되도록 조정해줍니다.count변수는 사용자의 추측 횟수를 저장하는 변수이며 초기값은 1로 설정합니다.// 사용자에게 첫 번째 추측값을 입력 받습니다. 'q'를 입력하면 게임을 종료할 수 있습니다.
let inPutval = prompt("첫 번째 추측값을 입력하세요 'q'를 입력해 종료할 수 있습니다.");
// 사용자의 추측값이 목표 숫자와 일치하지 않을 경우, 계속해서 새로운 추측값을 요청합니다.
while (parseInt(inPutval) !== targetNum) {
if (inPutval === "q") break;
// 사용자가 'q'를 입력하면 게임을 종료합니다.
inPutval = parseInt(inPutval);
// 사용자가 입력한 문자열 inPutval을 정수로 변환합니다.
if (inPutval > targetNum) {
inPutval = prompt("높아요");
count++;
} else if (inPutval < targetNum) {
inPutval = prompt("낮아요");
count++;
} else {
inPutval = prompt("다른거 말고 숫자를 입력해주세요. 'q'를 입력해 종료할 수 있습니다.");
// 유효하지 않은 추측값 입력 시, 사용자에게 숫자를 입력하거나 'q'를 입력하여 종료하라는 메시지를 출력합니다.
}
}
targetNum)를 비교하여, 추측값이 목표 숫자보다 크거나 작은 경우에는 적절한 메시지를 출력합니다.높아요라는 메시지를, 추측값이 목표 숫자보다 작을 경우에는 낮아요라는 메시지를 출력하고, 숫자가 아닌 다른값을 입력했을 경우 다시 추측값을 입력하라는 프롬프트를 보여줍니다.dfgdfg나 1235와 같이 목표값이 아닌 값을 입력하더라도, 사용자의 입력값이 목표값과 정확히 일치할 때까지 while문은 계속해서 실행됩니다.count는 사용자가 목표 숫자를 맞추는 데 시도한 횟수를 저장합니다. 따라서 count++는 사용자가 새로운 추측을 할 때마다 시도 횟수를 1 증가시키는 것을 의미합니다.// 사용자가 'q'를 입력하여 게임을 종료한 경우, "수고하셨습니다."라는 메시지를 출력합니다.
if (inPutval === "q") {
console.log("수고하셨습니다.");
} else {
// 사용자가 목표 숫자를 맞춘 경우, "축하드려요~! ${count}번 만에 맞추셨어요!"라는 메시지를 출력합니다.
console.log(`축하드려요~! ${count}번 만에 맞추셨어요!`);
}
let i = 0;
do {
console.log(i);
i++;
} while (i < 5);
let userInput;
do {
userInput = prompt("1 + 1 = ? (정답을 입력해주세요!)");
} while (userInput !== "2");
console.log("정답을 찾았습니다!");

for...of 문은 반복 가능한(iterable) 객체의 각 요소에 대해 반복하는 데 사용됩니다. 배열, 문자열, Set, Map 등과 같은 내장된 반복 가능한 객체에 사용됩니다.
for (const element of iterable) {
// 반복할 코드
}
const arr = [1, 2, 3];
for (const item of arr) {
console.log(item);
}
arr의 각 요소를 출력합니다. for...of 문을 사용하여 각 요소를 순회하고, 순회하는 동안 요소를 item 변수에 할당하여 출력합니다.element는 반복 가능한 객체의 각 요소를 나타냅니다.iterable은 배열, 문자열, Map, Set 등 반복 가능한 객체입니다.const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
for (const num of numbers) {
if (num % 2 !== 0) {
console.log(num);
}
}

const seatingChart = [
["Kristen", "Erik", "Namita"],
["Geoffrey", "Juanita", "Antonio", "Kevin"],
["Yuma", "Sakura", "Jack", "Erika"],
];
// for 문
for (let i = 0; i < seatingChart.length; i++) {
const row = seatingChart[i];
for (let j = 0; j < row.length; j++) {
console.log(row[j]);
}
}
// for of 문
for (let row of seatingChart) {
for (let student of row) {
console.log(student);
}
}
/*
Kristen
Erik
Namita
Geoffrey
Juanita
Antonio
Kevin
Yuma
Sakura
Jack
Erika
*/
seatingChart를 순회 하기 위해 for...of문을 두 번 사용하고 있습니다. 첫 번째 for...of문은 seatingChart의 각 행(배열)에 접근하고, 그 안에 두 번째 for...of문은 해당 행의 각 요소에 접근합니다. 각 행의 모든 학생들이 순서대로 출력 됩니다.for...of문이 가독성 있어 보입니다.const greeting = "Hello";
for (const char of greeting) {
console.log(char);
}
// 출력: H, e, l, l, o
const obj = { a: 1, b: 2, c: 3 };
for (const key in obj) {
console.log(key);
}
const obj = {a: 1, b: 2, c: 3, d: 4, e: 5 };
let count = 0;
for(let key in obj) {
count++
}
console.log(`속성개수: ${count}`)

중첩 루프는 루프 안에 또 다른 루프를 포함하는 구조입니다. 다차원 배열을 처리하거나 복잡한 반복 작업을 수행할 때 유용합니다. 중첩 루프는 일반적으로 외부 루프와 내부 루프로 구성됩니다. 외부 루프가 한 번 실행될 때마다 내부 루프가 처음부터 끝까지 실행됩니다.
const seatingChart = [
["Kristen", "Erik", "Namita"],
["Geoffrey", "Juanita", "Antonio", "Kevin"],
["Yuma", "Sakura", "Jack", "Erika"],
];
for (let i = 0; i < seatingChart.length; i += 1) {
const row = seatingChart[i];
console.log(`ROW #${i + 1}`);
for (let j = 0; j < row.length; j += 1) {
console.log(` ${row[j]}`);
}
}

seatingChart라는 이차원 배열을 순회하면서 각 행과 각 행의 요소를 콘솔에 출력합니다. 외부 루프는 배열의 각 행(내부 배열)을 순회하고, 내부 루프는 각 행의 요소를 순회합니다. 각 행이 출력된 후에 해당 행의 모든 요소가 출력됩니다.for (let i = 1; i <= 9; i++) {
for (let j = 1; j <= 9; j++) {
console.log(`${i} * ${j} = ${i * j}`);
}
}
i를 반복하고, 내부 루프는 각 i에 대해 1부터 9까지 숫자 j를 반복합니다. 각 반복에서 i와 j의 곱셈 결과를 콘솔에 출력합니다.const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
let sum = 0;
for (let i = 0; i < matrix.length; i++) {
for (let j = 0; j < matrix[i].length; j++) {
sum += matrix[i][j];
}
}
console.log(sum); // 출력: 45
sum에 더해지고, 그 다음에 1번째 행의 요소들을 합한 값인 4+5+6 = 15가 sum에 더해집니다. 이런 식으로 모든 행의 요소들이 순차적으로 sum에 더해집니다.i는 각 행에 접근하며, j는 각 행의 내부 요소에 접근합니다. matrix[i].length는 현재 행의 요소의 개수를 나타냅니다.let i = 0;
while (i < 3) {
let j = 0;
while (j < 3) {
console.log(`i = ${i}, j = ${j}`);
j++;
}
i++;
}
// 출력:
// i = 0, j = 0
// i = 0, j = 1
// i = 0, j = 2
// i = 1, j = 0
// i = 1, j = 1
// i = 1, j = 2
// i = 2, j = 0
// i = 2, j = 1
// i = 2, j = 2
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
for (const row of matrix) {
for (const value of row) {
console.log(value);
}
}
// 출력: 1, 2, 3, 4, 5, 6, 7, 8, 9
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
matrix.forEach(row => {
row.forEach(value => {
console.log(value);
});
});
// 출력: 1, 2, 3, 4, 5, 6, 7, 8, 9
break문은 반복문(for, while, do...while, switch)에서 사용되며, 특정 조건이 충족될 때 반복을 즉시 중단하는 역할을 합니다. 예를 들어 for 문 이나 while 문 내에서 특정 조건을 만족하는 요소를 찾았을 때 더 이상 반복을 계속할 필요가 없다면 break문을 사용하여 루프를 즉시 종료할 수 있습니다.
for (let i = 0; i < 1000; i++) {
console.log(i);
if (i === 100) break;
}
for 문입니다. 근데 i가 100이 되면 break문이 실행되어 반복문이 중단됩니다. 따라서 이 코드는 0부터 100까지의 숫자만 출력하게 됩니다.let input = prompt("Hey, say something!");
while (true) {
input = prompt(input);
if (input.toLowerCase() === "stop copying me") break;
}
console.log("OK YOU WIN!");
Hey, say something!라는 메시지를 보여주고 사용자의 입력을 받습니다. 그리고 while (true)에 의해 무한 반복문을 시작합니다.stop copying me를 입력하면 반복문이 중단(break)됩니다. 반복문이 중단되면 OK YOU WIN!가 출력됩니다.iterable)로 인식되지 않습니다.iterable 객체는 Symbol.iterator 메서드를 가지고 있으며, 이 메서드는 반복자 객체를 반환합니다.for...of 문은 iterable 객체를 순회할 수 있습니다.Map, Set 등은 iterable객체이며 for...of문을 통해 순회할 수 있습니다.Symbol.iterator를 구현하지 않아서 for...of 문으로 직접 순회할 수 없습니다. 그러나 객체의 속성을 Object.keys(), Object.values(), Object.entries() 메서드로 배열로 변환하여 순회할 수 있습니다.const testScores = {
keenan: 80,
damon: 67,
kim: 89,
shawn: 91,
marlon: 72,
dwayne: 77,
nadia: 83,
elvira: 97,
diedre: 81,
vonnie: 60,
};
for (let person of testScores) {
console.log(person);
}
// 출력 : TypeError: testScores is not iterable
객체는 반복 가능한 객체가 아니기 때문에 for...of 문을 사용하여 직접 순회할 수 없습니다. 이로 인해 에러가 발생하게 됩니다. 이를 해결하기 위해, 객체의 속성을 Object.keys(), Object.values(), Object.entries() 메서드를 사용하여 배열로 변환하고 순회해 보겠습니다.
Object.keys()를 사용하면 객체의 키를 배열로 얻을 수 있습니다. for...of 반복문과 함께 사용해서 각 키에 접근할 수 있습니다.
const testScores = {
keenan: 80,
damon: 67,
kim: 89,
shawn: 91,
marlon: 72,
dwayne: 77,
nadia: 83,
elvira: 97,
diedre: 81,
vonnie: 60,
};
console.log(Object.keys(testScores));
/*
[
'keenan', 'damon',
'kim', 'shawn',
'marlon', 'dwayne',
'nadia', 'elvira',
'diedre', 'vonnie'
]
*/
testScores 객체의 모든 키가 하나의 배열로 콘솔에 출력됩니다.const testScores = {
keenan: 80,
damon: 67,
kim: 89,
shawn: 91,
marlon: 72,
dwayne: 77,
nadia: 83,
elvira: 97,
diedre: 81,
vonnie: 60,
};
for (let key of Object.keys(testScores)) {
console.log(key);
}
/*
keenan
damon
kim
shawn
marlon
dwayne
nadia
elvira
diedre
vonnie
*/
Object.keys(testScores)로 testScores 객체의 모든 키를 배열로 반환하고, for...of 루프를 사용하여 배열의 각 요소(객체의 키)를 문자열로 콘솔에 출력합니다.const testScores = {
keenan: 80,
damon: 67,
kim: 89,
shawn: 91,
marlon: 72,
dwayne: 77,
nadia: 83,
elvira: 97,
diedre: 81,
vonnie: 60,
};
for (let key of Object.keys(testScores)) {
console.log(`${key}: ${testScores[key]}`);
}
/*
keenan: 80
damon: 67
kim: 89
shawn: 91
marlon: 72
dwayne: 77
nadia: 83
elvira: 97
diedre: 81
vonnie: 60
*/
testScores[key]코드는 testScores 객체에서 key에 해당하는 값을 가져옵니다. 여기서 person은 각각의 사람 이름을 나타내는 키를 참조합니다. 따라서, ${testScores[person]}은 person 키(즉, 특정 사람의 이름)에 연결된 값을(즉, 그 사람의 점수) 출력합니다.Object.values()를 사용하면 객체의 값을 배열로 얻을 수 있습니다. for...of 반복문과 함께 사용하여 각 값에 접근할 수 있습니다.
const testScores = {
keenan: 80,
damon: 67,
kim: 89,
shawn: 91,
marlon: 72,
dwayne: 77,
nadia: 83,
elvira: 97,
diedre: 81,
vonnie: 60,
};
console.log(Object.values(testScores));
/*
[
80, 67, 89, 91, 72,
77, 83, 97, 81, 60
]
*/
testScores 객체의 모든 값이 하나의 배열로 콘솔에 출력됩니다.const testScores = {
keenan: 80,
damon: 67,
kim: 89,
shawn: 91,
marlon: 72,
dwayne: 77,
nadia: 83,
elvira: 97,
diedre: 81,
vonnie: 60,
};
let total = 0;
// Object.values() 메소드를 사용하여 testScores 객체의 모든 값을 배열로 가져옵니다.
let scores = Object.values(testScores);
// for...of 루프를 사용하여 scores 배열의 모든 점수를 total에 더합니다.
for (let score of scores) {
total += score;
}
// 총 점수를 학생 수(점수의 개수)로 나누어 평균 점수를 구하고, 이를 콘솔에 출력합니다.
console.log(total / scores.length);
// 출력 : 79.7
scores.length는 학생의 수를 나타냅니다. 평균 점수를 계산하기 위해서는 총 점수를 학생의 수로 나누어야 하기 때문에 scores.length를 사용합니다.Object.entries()를 사용하면 객체의 키-값 쌍을 배열로 얻을 수 있습니다. for...of 반복문과 함께 사용하여 각 키-값 쌍에 접근할 수 있습니다.
const testScores = {
keenan: 80,
damon: 67,
kim: 89,
shawn: 91,
marlon: 72,
dwayne: 77,
nadia: 83,
elvira: 97,
diedre: 81,
vonnie: 60,
};
for (let person of Object.entries(testScores)) {
console.log(person);
}
/*
[ 'keenan', 80 ]
[ 'damon', 67 ]
[ 'kim', 89 ]
[ 'shawn', 91 ]
[ 'marlon', 72 ]
[ 'dwayne', 77 ]
[ 'nadia', 83 ]
[ 'elvira', 97 ]
[ 'diedre', 81 ]
[ 'vonnie', 60 ]
*/
Object.entries() 함수를 사용하면 객체의 각 키-값 쌍이 하나의 배열로 반환되고, console.log(person)를 실행하면, 각 키-값 쌍은 별도의 배열로 콘솔에 출력됩니다.