반복문은 프로그램에서 동일한 코드 블록을 여러 번 실행하는 데 사용됩니다. 이를 통해 반복적인 작업을 자동화하고 코드의 중복을 줄일 수 있습니다.
// 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)
를 실행하면, 각 키-값 쌍은 별도의 배열로 콘솔에 출력됩니다.