온보딩 커리큘럼 [배열, 반복문(2)]
반복문
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이므로 반복문 종료
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, 반복문 밖에서 선언한 변수이므로 사용할 수 있음
반복문 빠져나오기
let sum = 0;
while (true) {
let value = +prompt("숫자를 입력하세요.", '');
if (!value) break; // (*)
sum += value;
}
alert( '합계: ' + sum );
반복문은 사용자에게 일련의 숫자를 입력하도록 안내하고, 사용자가 아무런 값도 입력하지 않으면 반복문을 '종료’합니다.
다음 반복으로 넘어가기
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('완료!');
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이 배열인지 여부를 판단함
-
두 메서드는 map과 유사하게 모든 요소를 대상으로 함수를 호출합니다. some은 함수의 반환 값을 true로 만드는 요소가 하나라도 있는지 여부를 확인하고 every는 모든 요소가 함수의 반환 값을 true로 만드는지 여부를 확인합니다. 두 메서드 모두 조건을 충족하면 true를, 그렇지 않으면 false를 반환합니다.
-
arr.copyWithin(target, start, end)은 start부터 end까지 요소를 복사하고, 복사한 요소를 target에 붙여넣습니다. 기존 요소가 있다면 덮어씁니다.
배열에 관한 모든 메서드는 manual에서 찾아볼 수 있습니다.
<반복문>
-
while – 각 반복이 시작하기 전에 조건을 확인합니다.
-
do..while – 각 반복이 끝난 후에 조건을 확인합니다.
-
for (;;) – 각 반복이 시작하기 전에 조건을 확인합니다. 추가 세팅을 할 수 있습니다.
반복문은 진짜 몇번을 들어도 너무 어렵다
별만들기에 멘붕오고 내가 아예 반복문을 잘못 알고있었다..
기초부터 탄탄히 해야한다는말을 오늘 다시 한번 깨닳았다.
왜 이해가 안되는건지.. ㅠㅠ 반복문 다 뿌셔..