Javascript : 효율적인 반복문

i_sy_code·2022년 2월 3일
0
post-thumbnail

앞서 반복문 글에 오류를 범해 다시 반복문을 자세히 공부하다보니
새롭게 알게된 내용들이 있어 공유하고자 글을 쓴다.
왜 증감문에 곱셈이나 나눗셈같은 연산을 넣기보다 i++나 i--를 넣고,
실행문에 해당 연산을 넣는지 그리고 그것이 왜 더 효율적인지에 대해 말해보고자 한다.



1. 증감문 내에 사칙연산을 쓸 수 있는가?

정답은 '가능하다'
아래는 내가 저번에 실수를 했던 반복문이다.

for (let i = 0; i < 10; i *= 10) {console.log(i)}

이렇게 i = 0부터 시작하면 다음 i 값이 0 * 10 = 0이 되므로 무한루프에 빠진다.
또한, i = 1로 시작하더라도 다음 값 i = 10이 i < 10 조건을 만족하지 않아 콘솔에 1만 반환해 버린다.
따라서 반복문을 만들 때는 초기문과 조건문, 증감문을 잘 고려해서 짜야한다.





2. i * 10 를 증감문에 넣느냐, 실행문에 넣느냐의 차이

10을 곱해주는 반복문을 만드는 두 방식에 대해 알아보자.

1) 증감문에 넣었을 때
for (let i=1; i< 101; i*=10){console.log(i)}
    // 1, 10, 100 출력
2) 실행문에 넣었을 때
for (let i=0; i < 3; i++){console.log(i*10)}
    // 0, 10, 20 출력

이처럼 i * 10 가 어디에 위치했느냐에 따라 결괏값이 달라진다.
진정한 의미에서 출력값에 10씩 곱해주는 반복문은 1번이 맞으나, 대개 for문은 array와 함께 사용하므로
10번째 index의 요소를 출력할 때 or 요소마다 10을 곱해줄 때 1번을 쓰는 실수를 할 수가 있다.<= 는 나





3. array와 for문

array랑 for문을 같이 쓸 때 더 헷갈리는 이유에 대해 알아보자.

let array = [1, 2, 3, 4, 5]
1) for (let i=1; i < array.length; i*=10){console.log(array[i])}
   // 2
2) for (let i=0; i < array.length; i++){console.log(array[i] * 10)}
   // 10, 20, 30, 40, 50

위의 예시에서 눈여겨볼 것은 array.length가 5라는 점이다.
1번처럼 증감문이 i * = 10면 array[1]의 요소만 반환하고 for문이 종료가 된다.
2번처럼 증감문 i++, 실행문 * 10이면 1~5번째의 index 요소 반환값에 10이 곱해진다.
보통 배열 요소에 접근하는 반복문은 array.length를 조건으로 주기에 증감문에는 i++나 i--를 넣는게 좋다.

즉, 배열이든 아니든 증감문에 곱셈, 나눗셈 연산이 들어가게 되면 다음 i값이 비약적으로 커지거나 작아지기 때문에 반복문이 언제까지 실행될지에 대한 조건을 정하는게 복잡하고 어려워질 수 있다.





4. 퐁당퐁당 반복문

해당 **array2의 0, 2, 4번째 index의 요소를 반환**해보자!
let array2 = [0, 2, 4, 6, 8, 10]
for (let i=1; i < array2.length; i*=2){console.log(array2[i-1])}
    // 0, 2, 6

앞선 과정처럼 증감문에 곱셈 연산을 넣을땐 i = 1;로 시작해야 한다.
실행문에 i-1을 넣더라도 0, 1, 3번째 index의 요소만 반환하게 된다.
반면, 실행문에 곱셈을 넣으면 쉽게 alternate한 값을 반환할 수 있다.

1) for (let i=0; i < array2.length/2; i++){console.log(array2[i*2])}
       // 0, 4, 8
2) for (let i=0; i < array2.length; i++){if(isNaN(array[i*2]) === false){
    console.log(array2[i*2])}}
       // 0, 4, 8

두 가지 방식 중 2번의 경우 왜 isNaN을 사용했냐면 array2[6], array2[8], array2[10]의 요소가 정의되지 않았기 때문에 undefined도 같이 출력되는 것을 방지하기 위해서이다.

  • isNaN() = 숫자형 데이터타입인지 아닌지 판별하는 boolean형 함수
profile
삶은 끊임없이 나의 한계와 맞서는 일이다.

0개의 댓글