LearningJS-CH04.3-유용한 제어문 패턴
4.3 유용한 제어문 패턴
이제 기본적인 제어문에 대해 알았으니, 널리 쓰이는 패턴에 대해 알아보자.
1. continue문을 사용해서 조건 중첩 줄이기
특정 조건이 맞을 때만 루프 바디를 실행해야 할 때가 많다. 즉, 반복문 안에 조건문을 써야할 때를 말한다. 다음 코드를 보자.
while(funds > 1 && funds < 100){
let totalBet = rand(1, funds);
if(totalBet === 13){
console.log("Unlucky! Skip this round...");
} else {
// play...
}
}
이러한 경우를 제어문 중첩nested control flow
라고 한다. while
루프의 바디에서 해야할 일은 대부분 else
문에 들어있고, if
절이 하는 일은 console.log
를 호출하는 것 뿐이다. continue
문을 써서 이 구조를 간결하게 만들 수 있다.
while(funds > 1 && funds < 100){
let totalBet = rand(1, funds);
if(totalBet === 13){
console.log("Unlucky! Skip this round....");
continue;
} else {
//play...
}
}
이렇게 말야.
2. break나 return문을 사용해서 불필요한 연산을 줄이기
뭔가를 찾기 위해 루프를 실행했다면, 찾고나서는 루프를 끝내줘야한다.
예를 들어, 소수prime
인지 판단하는 작업은 CPU 부하가 비교적 높은 일 중 하나이다. 숫자 수천개에서 소수 찾는 건..더더욱.
다음 코드를 보자. 소수찾는 코드이다.
let firstPrime = null;
for(le tn of bigArrayOfNumbers){
if(isPrime(n) && firstPrime === null)
firstPrime = n;
}
만약, 우리가 찾는 소수가 첫번째 숫자였다면, 우리는 쓸데 없는 작업을 bigArrayOfNumbers
의 크기만큼 더 하게 된다. 이럴 때 break
를 사용하자.
let firstPrime = null;
for(le tn of bigArrayOfNumbers){
if(isPrime(n) && firstPrime === null)
firstPrime = n;
break;
}
해당 루프가 함수 안에 있었다면, break
대신 return
문을 사용해도 된다.
3. 루프를 완료한 뒤에 인덱스 값을 사용하기
break
문을 써서 루프를 일찍 종료했을 때, 인덱스 변수의 값이 필요할 때가 있다. for
루프가 끝나도 인덱스 변수의 값은 그대로 유지된다는 점을 활용하자!
해당 패턴은 break
문을 써서 루프를 끝내도록 해야 사용할 수 있다. 예를 들어 이 패턴을 사용해서 배열에 들어있는 첫번째 소수의 인덱스를 찾을 수 있다.
let i = 0;
for(; i<bigArrayOfNumbers.length; i++){
if(isPrime(bigArrayOfNumbers[i])) break;
}
if(i === bigArrayOfNumbers.length) console.log('No prime Num!');
else console.log(`FirstPrimeNumber found at position ${i}`);
4. 배열을 수정할 때 감소하는 인덱스 사용하기
배열에 루프를 실행하면서 루프 바디에서 배열을 수정하는 것은 위험할 수 있다. 뜻하지 않게 종료조건을 바꿔버릴수도 있기에!
이런 경우 감소하는 인덱스를 사용해서 배열 마지막 요소에서 루프를 시작하도록 하자. 이렇게 하면 배열에 요소를 추가하거나 제거해도 종료조건이 바뀌는 일은 없다.
예를 들어서 bigArrayOfNumbers
에서 찾은 모든 소수를 제거하고 싶다고 하자. 다음 예제에서 사용할 splice
메서드는 배열 요소를 추가하거나 제거할 때 사용한다.
for(let i = 0; i < bigArrayOfNumbers.length; i++){
if(isPrime(bigArrayOfNumbers[i])) bigArrayOfNumbers.splice(i, 1);
}
인덱스는 점점 커지는데, 우리는 요소를 제거하고 있으므로 소수가 연달아 존재한다면 그중 일부를 제거하지 않고 넘어갈 가능성이 있다. 감소하는 인덱스를 사용하면 이 문제는 간단히 해결된다.
for(let i = bigArrayOfNumbers.length - 1; i > = 0; i--){
if(isPrime(bigArrayOfNumbers[i])) bigArrayOfNumbers.splice(i, 1);
}
이렇게 말이다..
댓글남기기