
알고리즘 스터디를 하면서 반복문을 사용을 자주 사용하게 되었는데, for문만 쓰다 보니 다른 종류의 반복문은 언제 사용하면 좋을까 하는 궁금증이 생겼습니다. 또한 for문 이외의 반복문을 사용할 때 더 효율적으로 해결할 수 있는 방법이 있는 것 같아 정리해 보았습니다.
자바스크립트에서 가장 흔하게 접할 수 있는 기본적인 반복문 입니다.
해당 방식은 특정 조건문이 거짓이 될 때까지 반복문을 수행하게 됩니다.
for (초기문, 조건문, 증감문) {반복해서 수행할 코드}
ex)
let answer = 0;
// answer에 1을 더해주는 코드를 3번 반복함
for (let i = 0; i < 3; i++) {
answer += 1;
}
console.log(answer) //3
이때 초기문, 조건문, 증감문 모두 생략해서 사용이 가능하고 필수사항은 아닙니다.
대신 무한 반복을 탈출할 수 있는 코드를 설정해 주어야 합니다.
for문은 continue나 break 사용이 가능하고 변수 활용이 용이하다는 장점이 있습니다.
for(let i = 0;; i++) {
console.log(i); // 0, 1, 2, 3, 4
if(i > 3) break; // i 가 3보다 크면 반복문 탈출
}
for...of 문은 반복가능한 객체에 대해서 반복합니다.
이때 반복가능한 객체에는 Array, Map, Set, String, TypedArray, arguments 객체 등을 포함합니다.
for of 문은 순서에 크게 필요하지 않은 경우 for문보다 간결하게 사용해 줄 수 있습니다.
for(let 또는 const 변수 of 반복가능한 객체) {반복해서 수행할 코드}
ex)
const string = "hi";
for(let s of string) {
console.log(s) // "h", "i"
}
for...in문은 객체의 모든 열거가능한 속성에 대해 반복합니다. 즉, 객체에 접근하여 객체의 값들을 for in문을 활용하여 사용할 수 있습니다.
객체에 쉽게 접근하여 사용 가능하다는 장점이 있지만 성능 측면에서 다른 for문들에 비해 느리고 좋지 못하다는 단점이 있습니다.
for(let 또는 const 변수 in 객체) {반복해서 수행할 코드}
ex)
const object = { a: 1, b: 2, c: 3 };
// 객체 안에 들어있는 데이터만큼 반복문 수행
for (const key in object) {
console.log(`${key}: ${object[key]}`);
}
// "a: 1"
// 'b: 2"
// "c: 3"
forEach() 메서드는 주어진 함수를 배열 요소 각각에 대해 실행합니다.
코드가 한눈에 보기 쉽고 성능 측면에서도 준수하다는 장점이 있습니다. 하지만 건너뛰기 continue나 종료 break가 불가능하다는 단점이 있습니다.
const array = ['a', 'b', 'c'];
array.forEach(element => console.log(element));
// "a"
// "b"
// "c"
for 문을 forEach() 로 바꾸면 아래와 같습니다.
const nums = [1, 2, 3];
const copy = [];
// for문
for (let i=0; i<nums.length; i++) {
copy.push(nums[i]);
}
// forEach 메서드
nums.forEach(function(num){
copy.push(num);
});
while문은 조건문이 참일 때 실행되는 반복문으로 조건은 문장안이 실행되기 전에 참, 거짓을 판단합니다. 조건이 거짓일 경우 문장은 while 반복문 후로 넘어간다.
while(조건문) {반복해서 수행할 코드}
ex)
let n = 0;
let x = 0;
// n이 3보다 작을 때까지 반복
while (n < 3) {
n++;
x += n;
}
console.log(n); // 3
console.log(x); // 6
이번에 코딩테스트 공부를 하다가 추가적으로 알게 된 사실은 while문 안에서 메서드 호출이 가능하다는 점 입니다.
// 괄호 안에 있는 문자를 모두 제외하고 남은 문자만 출력해야하는 문제
const solution = (s) => {
let stack = []
for (let x of s) {
if (x === ')') {
// stack.pop 메서드 계속 호출, 대상이 "(" 이 되면 멈춤
// 메서드가 먼저 실행되기 때문에 "(" 문자를 지운 이후에 while문 종료
while (stack.pop() !== '(');
} else stack.push(x)
}
return stack.join('');
}
console.log(solution("(AB(C))D(E)")) // "D"