반복문을 사용하다보면, continue, break를 사용해야 하는 경우가 있다. break의 개념은 순회함수에서도 가끔 사용 되는 경우가 있는데, 아래와 같은 경우이다.
let res = 1;
for(let i = -8; i < 20; i++) {
res *= i;
if(!res) break;
}
res = 1;
[1,2,4,5,2,3,1,0,2,3,1].every(i => {
return res *= i;
})
개인적으로는 싫어하는 방식이지만.. every와 some의 경우 return을 이용하여, break처럼 사용할 수 있다.
일반적으로는 label을 사용해본 경험이 있는가? 웬만하면, c언어에서 이런 문법도 있어요~ 수준으로 소개를 할 뿐 스파게티 소스가 되기 때문에 label을 사용한 경험은 웬만해서는 없을 것이다.
continue와 label을 합친 방식은 continue가 순회문에서만 사용가능 하기 때문에, 큰 의미는 없으나, label과 break를 합친 방식은 사용하려면 해볼 수 는 있다.
break와 label을 합친 빠른리턴,
function foo(str) {
if(typeof str !== 'string') return;
// 추가적인 로직
console.log('실행되지 않음');
}
const str = null;
bar: {
if(typeof str !== 'string') break bar;
// 추가적인 로직
console.log('실행되지 않음');
}
console.log('여기는 실행 된다.');
함수라면, 더이상 실행 되지 않아야 하는 구간에서는 return;을 사용 하여, 실행을 중지 할 수 있지만, 평가 중 부분만 건너뛰어야한다면, 위처럼 break와 lebel을 사용하여, 건너뛰는 것이 가능하다.
하지만, 리터럴 object과 문법이 너무 유사하다...
const foo = {
a: {
// console.log(1)
}
}
{
a: {
console.log(1)
}
}
긴 코드에서, a: {}와 같은 방식을 마주쳤을 때, 이게 리터럴 object문법인지.... labal인지... 즉각적으로 판단하기 힘들다.
자 일반적인 상황이라면, continue는 아래처럼 사용하는 경우가 많다.
let sum = 0;
for(let i = 0; i < 100; i++) {
if(!(i%3)) continue;
sum += i;
}
0 ~ 99까지 합을 하면서, 3의 배수를 제외한다고 한다면, 위처럼 짜는게 정석 아닐까 싶다.
let sum = 0;
for(let i = 0; i < 100; i++) {
if(!(i%3)) continue;
if(!(i%7)) continue;
if(!(i%21)) continue;
if(!(i%23)) {
i += 2;
continue;
}
if(!(i%29)) {
i += 2;
continue;
}
sum += i;
}
하지만 위처럼 예외 케이스가 많고, 중간중간에 무언가의 처리가 있다면, 어떻게 될까? 이걸 일반적인 순회라고 볼 수 있을까? 혹은 극단적으로,
let sum = 0;
for(let i = 0; i < 10; i++) {
if(i === 1) continue;
if(i === 2) continue;
if(i === 3) continue;
if(i === 4) continue;
if(i === 5) continue;
if(i === 6) continue;
if(i === 7) continue;
if(i === 8) continue;
sum += i;
}
거의 순회 갯수 만큼 있다면 어떨까? 위의 코드는 심플 하니까, 볼수는 있는 코드이지만... 각각의 케이스에 복잡한 로직이 추가가 되면? 어떨까?
결론
결론을 지어보면, continue와 break의 경우, 필요시 사용할 만하고, label은 사용해야 하나 싶을 정도로 문법이... 별로이다. continue와 break는 순회문에 한 번만 사용하는것이 맞지 않을까?
댓글
댓글 쓰기