-
온보딩 커리큘럼 [배열, 반복문(2)]항해99(온보딩커리큘럼) 2023. 3. 9. 01:03
반복문
while반복문
while (condition) { // 코드 // '반복문 본문(body)'이라 불림 }
condition(조건)이 truthy 이면 반복문 본문의 코드가 실행됩니다.
let i = 0; while (i < 3) { // 0, 1, 2가 출력됩니다. alert( i ); i++; }
i++가 없었다면 이론적으로 반복문이 영원히 반복되었을 겁니다. 그런데 브라우저는 이런 무한 반복을 멈추게 해주는 실질적인 수단을 제공합니다. 서버 사이드 자바스크립트도 이런 수단을 제공해 주므로 무한으로 반복되는 프로세스를 종료할 수 있습니다.
let i = 3; while (i) { // i가 0이 되면 조건이 falsy가 되므로 반복문이 멈춥니다. alert( i ); i--; }
본문이 한 줄이면 대괄호를 쓰지 않아도 됩니다.반복문 본문이 한 줄짜리 문이라면 대괄호 {…}를 생략할 수 있습니다.let i = 3; while (i) alert(i--);
do...while 반복문
condition을 반복문 본문 아래로 옮길 수 있습니다.
do { // 반복문 본문 } while (condition);
이때 본문이 먼저 실행되고, 조건을 확인한 후 조건이 truthy인 동안엔 본문이 계속 실행됩니다.
let i = 0; do { alert( i ); i++; } while (i < 3);
do..while 문법은 조건이 truthy 인지 아닌지에 상관없이, 본문을 최소한 한 번이라도 실행하고 싶을 때만 사용해야 합니다. 대다수의 상황에선 do..while보다 while(…) {…}이 적합합니다.
for반복문
for 반복문은 while 반복문보다는 복잡하지만 가장 많이 쓰이는 반복문입니다.
for (begin; condition; step) { // ... 반복문 본문 ... }
for (let i = 0; i < 3; i++) { // 0, 1, 2가 출력됩니다. alert(i); }
begin을 실행함 → (condition이 truthy이면 → body를 실행한 후, step을 실행함) → (condition이 truthy이면 → body를 실행한 후, step을 실행함) → (condition이 truthy이면 → body를 실행한 후, step을 실행함) → ...
// for (let i = 0; i < 3; i++) alert(i) // begin을 실행함 let i = 0 // condition이 truthy이면 → body를 실행한 후, step을 실행함 if (i < 3) { alert(i); i++ } // condition이 truthy이면 → body를 실행한 후, step을 실행함 if (i < 3) { alert(i); i++ } // condition이 truthy이면 → body를 실행한 후, step을 실행함 if (i < 3) { alert(i); i++ } // i == 3이므로 반복문 종료
인라인 변수 선언지금까진 ‘카운터’ 변수 i를 반복문 안에서 선언하였습니다. 이런 방식을 ‘인라인’ 변수 선언이라고 부릅니다. 이렇게 선언한 변수는 반복문 안에서만 접근할 수 있습니다.for (let i = 0; i < 3; i++) { alert(i); // 0, 1, 2 } alert(i); // Error: i is not defined
인라인 변수 선언 대신, 정의되어있는 변수를 사용할 수도 있습니다.
let i = 0; for (i = 0; i < 3; i++) { // 기존에 정의된 변수 사용 alert(i); // 0, 1, 2 } alert(i); // 3, 반복문 밖에서 선언한 변수이므로 사용할 수 있음
반복문 빠져나오기
대개는 반복문의 조건이 falsy가 되면 반복문이 종료됩니다.그런데 특별한 지시자인 break를 사용하면 언제든 원하는 때에 반복문을 빠져나올 수 있습니다.let sum = 0; while (true) { let value = +prompt("숫자를 입력하세요.", ''); if (!value) break; // (*) sum += value; } alert( '합계: ' + sum );
반복문은 사용자에게 일련의 숫자를 입력하도록 안내하고, 사용자가 아무런 값도 입력하지 않으면 반복문을 '종료’합니다.
다음 반복으로 넘어가기
continue 지시자는 break의 '가벼운 버전’입니다. continue는 전체 반복문을 멈추지 않습니다. 대신에 현재 실행 중인 이터레이션을 멈추고 반복문이 다음 이터레이션을 강제로 실행시키도록 합니다(조건을 통과할 때).continue는 현재 반복을 종료시키고 다음 반복으로 넘어가고 싶을 때 사용할 수 있습니다.continue를 사용해 홀수만 출력합니다.
for (let i = 0; i < 10; i++) { // 조건이 참이라면 남아있는 본문은 실행되지 않습니다. if (i % 2 == 0) continue; alert(i); // 1, 3, 5, 7, 9가 차례대로 출력됨 }
i가 짝수이면 continue가 본문 실행을 중단시키고 다음 이터레이션이 실행되게 합니다(i가 하나 증가하고, 다음 반복이 실행됨). 따라서 alert 함수는 인수가 홀수일 때만 호출됩니다.
(i > 5) ? alert(i) : continue; // 여기에 continue를 사용하면 안 됩니다.
‘?’ 오른쪽엔 break나 continue가 올 수 없습니다.
break / continue와 레이블
for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { let input = prompt(`(${i},${j})의 값`, ''); // 여기서 멈춰서 아래쪽의 `완료!`가 출력되게 하려면 어떻게 해야 할까요? } } alert('완료!');
사용자가 Cancel 버튼을 눌렀을 때 반복문을 중단시킬 방법이 필요합니다.input 아래에 평범한 break 지시자를 사용하면 안쪽에 있는 반복문만 빠져나올 수 있습니다. 이것만으론 충분하지 않습니다(중첩 반복문을 포함한 반복문 두 개 모두를 빠져나와야 하기 때문이죠 – 옮긴이). 이럴 때 레이블을 사용할 수 있습니다.outer: for (let i = 0; i < 3; i++) { for (let j = 0; j < 3; j++) { let input = prompt(`(${i},${j})의 값`, ''); // 사용자가 아무것도 입력하지 않거나 Cancel 버튼을 누르면 두 반복문 모두를 빠져나옵니다. if (!input) break outer; // (*) // 입력받은 값을 가지고 무언가를 함 } } alert('완료!');
반복문 안에서 break <labelName>문을 사용하면 레이블에 해당하는 반복문을 빠져나올 수 있습니다.
<요약 : 온보딩커리큘럼 부교재 내용>
더보기<배열과 메서드>배열은 특수한 형태의 객체로, 순서가 있는 자료를 저장하고 관리하는 용도에 최적화된 자료구조입니다.-
선언 방법:
new Array(number)을 호출하면 길이가 number인 배열이 만들어지는데, 이 때 요소는 비어있습니다.
// 대괄호 (가장 많이 쓰이는 방법임) let arr = [item1, item2...]; // new Array (잘 쓰이지 않음) let arr = new Array(item1, item2...);
- length 프로퍼티는 배열의 길이를 나타내줍니다. 정확히는 숫자형 인덱스 중 가장 큰 값에 1을 더한 값입니다. 배열 메서드는 length 프로퍼티를 자동으로 조정해줍니다.
- length 값을 수동으로 줄이면 배열 끝이 잘립니다.
다음 연산을 사용하면 배열을 데큐처럼 사용할 수 있습니다.
-
push(...items) – items를 배열 끝에 더해줍니다.
-
pop() – 배열 끝 요소를 제거하고, 제거한 요소를 반환합니다.
-
shift() – 배열 처음 요소를 제거하고, 제거한 요소를 반환합니다.
-
unshift(...items) – items를 배열 처음에 더해줍니다.
아래 방법을 사용하면 모든 요소를 대상으로 반복 작업을 할 수 있습니다.
-
for (let i=0; i<arr.length; i++) – 가장 빠른 방법이고 오래된 브라우저와도 호환됩니다.
-
for (let item of arr) – 배열 요소에만 사용되는 모던한 문법입니다.
-
for (let i in arr) – 배열엔 절대 사용하지 마세요.
요소를 더하거나 지우기
-
push(...items) – 맨 끝에 요소 추가하기
-
pop() – 맨 끝 요소 추출하기
-
shift() – 첫 요소 추출하기
-
unshift(...items) – 맨 앞에 요소 추가하기
-
splice(pos, deleteCount, ...items) – pos부터 deleteCount개의 요소를 지우고, items 추가하기
-
slice(start, end) – start부터 end 바로 앞까지의 요소를 복사해 새로운 배열을 만듦
-
concat(...items) – 배열의 모든 요소를 복사하고 items를 추가해 새로운 배열을 만든 후 이를 반환함. items가 배열이면 이 배열의 인수를 기존 배열에 더해줌
원하는 요소 찾기
-
indexOf/lastIndexOf(item, pos) – pos부터 원하는 item을 찾음. 찾게 되면 해당 요소의 인덱스를, 아니면 -1을 반환함
-
includes(value) – 배열에 value가 있으면 true를, 그렇지 않으면 false를 반환함
-
find/filter(func) – func의 반환 값을 true로 만드는 첫 번째/전체 요소를 반환함
-
findIndex는 find와 유사함. 다만 요소 대신 인덱스를 반환함
배열 전체 순회하기
-
forEach(func) – 모든 요소에 func을 호출함. 결과는 반환되지 않음
배열 변형하기
-
map(func) – 모든 요소에 func을 호출하고, 반환된 결과를 가지고 새로운 배열을 만듦
-
sort(func) – 배열을 정렬하고 정렬된 배열을 반환함
-
reverse() – 배열을 뒤집어 반환함
-
split/join – 문자열을 배열로, 배열을 문자열로 변환함
-
reduce(func, initial) – 요소를 차례로 돌면서 func을 호출함. 반환값은 다음 함수 호출에 전달함. 최종적으로 하나의 값이 도출됨
기타
-
Array.isArray(arr) – arr이 배열인지 여부를 판단함
sort, reverse, splice는 기존 배열을 변형시킨다는 점에 주의하시기 바랍니다.지금까지 배운 메서드만으로 배열과 관련된 작업 99%를 해결할 수 있습니다. 이 외의 배열 메서드도 있긴 한데 잠시 언급하고 넘어가겠습니다.-
두 메서드는 map과 유사하게 모든 요소를 대상으로 함수를 호출합니다. some은 함수의 반환 값을 true로 만드는 요소가 하나라도 있는지 여부를 확인하고 every는 모든 요소가 함수의 반환 값을 true로 만드는지 여부를 확인합니다. 두 메서드 모두 조건을 충족하면 true를, 그렇지 않으면 false를 반환합니다.
-
arr.copyWithin(target, start, end)은 start부터 end까지 요소를 복사하고, 복사한 요소를 target에 붙여넣습니다. 기존 요소가 있다면 덮어씁니다.
배열에 관한 모든 메서드는 manual에서 찾아볼 수 있습니다.
<반복문>
-
while – 각 반복이 시작하기 전에 조건을 확인합니다.
-
do..while – 각 반복이 끝난 후에 조건을 확인합니다.
-
for (;;) – 각 반복이 시작하기 전에 조건을 확인합니다. 추가 세팅을 할 수 있습니다.
‘무한’ 반복문은 보통 while(true)를 써서 만듭니다. 무한 반복문은 여타 반복문과 마찬가지로 break 지시자를 사용해 멈출 수 있습니다.현재 실행 중인 반복에서 더는 무언가를 하지 않고 다음 반복으로 넘어가고 싶다면 continue 지시자를 사용할 수 있습니다.반복문 앞에 레이블을 붙이고, break/continue에 이 레이블을 함께 사용할 수 있습니다. 레이블은 중첩 반복문을 빠져나와 바깥의 반복문으로 갈 수 있게 해주는 유일한 방법입니다.반복문은 진짜 몇번을 들어도 너무 어렵다
별만들기에 멘붕오고 내가 아예 반복문을 잘못 알고있었다..
기초부터 탄탄히 해야한다는말을 오늘 다시 한번 깨닳았다.
왜 이해가 안되는건지.. ㅠㅠ 반복문 다 뿌셔..
'항해99(온보딩커리큘럼)' 카테고리의 다른 글
온보딩 커리큘럼[객체] (1) 2023.03.11 온보딩 커리큘럼[함수의 기본 형태] (1) 2023.03.10 온보딩 커리큘럼 [배열, 반복문 + 확인문제] (1) 2023.03.09 온보딩 커리큘럼 [조건문(if, switch)] (0) 2023.03.07 온보딩 커리큘럼 [js기본 문법] (0) 2023.03.07 -