배열
배열은 여러 값을 순서대로 한 이름 아래 모아 둡니다. ["red", "green", "blue"]에서 "red"는 인덱스 0에 있고 길이는 3입니다.
변수 하나에 담은 목록
반 전체의 점수를 다루는 프로그램이 있다고 해 봅시다. score1, score2, score3처럼 변수를 서른 개 만들면 다루기 괴롭고 반복문으로 돌 수도 없습니다. 배열은 다른 값들의 순서 있는 목록을 담는 값 하나입니다. 대괄호와 쉼표로 씁니다.
const fruits = ["apple", "banana", "cherry"];
console.log(fruits.length); // 3
console.log(fruits[0]); // apple
console.log(fruits[2]); // cherry배열 안의 값 하나하나를 요소라고 합니다. 요소에는 문자열의 글자처럼 0부터 시작하는 인덱스 번호가 붙습니다. 첫 요소는 fruits[0], 마지막 요소는 fruits[fruits.length - 1]입니다. fruits[10]처럼 없는 인덱스를 물으면 오류가 아니라 undefined가 나옵니다. 배열에는 어떤 종류의 값이든 담을 수 있고, 요소끼리 타입이 같지 않아도 되지만 실제로는 보통 같은 종류를 담습니다.
배열 바꾸기
문자열과 달리 배열은 그 자리에서 바꿀 수 있습니다. 인덱스에 대입하면 요소가 바뀝니다. fruits[1] = "blueberry"처럼 씁니다. 메서드 push는 끝에 요소를 더하고, pop은 마지막 요소를 빼서 돌려줍니다. unshift와 shift는 같은 일을 앞쪽에서 합니다. 배열을 const로 선언했어도 됩니다. const는 그 이름이 다른 배열을 가리키지 못하게 막을 뿐, 안의 내용을 얼리지는 않습니다.
const list = ["milk", "eggs"];
list.push("bread");
console.log(list.length); // 3
const last = list.pop();
console.log(last); // bread
console.log(list.join(", ")); // milk, eggs질문에 답하는 메서드도 둘 있습니다. includes(x)는 x가 배열에 있으면 true를 주고, indexOf(x)는 그 인덱스를 주되 없으면 -1을 줍니다. join(", ")은 모든 요소를 주어진 구분자로 이어 문자열 하나로 만듭니다. 목록을 깔끔하게 출력하는 가장 쉬운 방법입니다.
배열을 반복문으로 돌기
배열과 반복문은 짝입니다. 인덱스를 0부터 길이 바로 앞까지 도는 for 반복문은 모든 요소를 한 번씩 거칩니다. 위치는 필요 없고 값만 필요할 때는 for...of 반복문이 더 짧습니다.
const scores = [70, 85, 90, 55];
for (let i = 0; i < scores.length; i++) {
console.log(i, scores[i]);
}
let total = 0;
for (const s of scores) {
total += s;
}
console.log(total / scores.length); // 75조건이 <=가 아니라 i < scores.length인 점을 보세요. 요소가 넷이면 인덱스는 0부터 3까지이고, <=를 쓰면 끝을 한 칸 넘어서 읽습니다. 이렇게 하나 차이로 어긋나는 실수(off-by-one)는 프로그래밍 전체에서 가장 흔한 버그 가운데 하나입니다.
이름 둘, 배열 하나
숫자와 문자열은 다른 변수에 대입하면 복사되지만 배열은 그렇지 않습니다. const a = [1, 2]; const b = a; 다음에는 두 이름이 똑같은 배열 하나를 가리키므로, b.push(3)을 하면 a로 봐도 바뀌어 있습니다. 이제 a.length는 3입니다. 따로 복사본이 필요하면 const b = [...a];라고 씁니다. a의 요소를 새 배열에 펼쳐 담는다는 뜻입니다. 다음 단원의 객체도 똑같이 동작합니다.
풀이 예시. Math.max 없이 [4, 17, 9, 12]에서 가장 큰 수를 찾아봅니다. let best = nums[0]으로 시작해서 나머지를 돌며, 요소가 best보다 크면 best에 저장합니다. 반복이 끝나면 best는 17입니다. 지금까지의 최고를 기억하는 변수라는 같은 모양으로 가장 긴 낱말, 가장 싼 가격, 가장 이른 날짜도 찾습니다.
| 배열 | [ ] 안에 순서대로 담은 값의 목록 |
| 요소 | 배열 안의 값 하나 |
| arr[0] | 첫 번째 요소 |
| arr[arr.length - 1] | 마지막 요소 |
| push / pop | 끝에 더하기 / 끝에서 빼기 |
| includes | 값이 배열에 있으면 true |
| join | 요소를 문자열 하나로 이음 |
| for...of | 배열의 값을 차례로 도는 반복 |
| 하나 차이 오류 | 한 칸 넘치거나 모자라는 실수. 흔히 < 대신 <= |
- 무엇이 출력될까요?
const a = [10, 20, 30]; console.log(a[1]); - 무엇이 출력될까요?
const a = [10, 20, 30]; console.log(a.length); - 무엇이 출력될까요?
const a = ["x", "y", "z"]; console.log(a[a.length - 1]); - 무엇이 출력될까요?
const a = [1, 2]; a.push(3); a.push(4); console.log(a.length); - 무엇이 출력될까요?
const a = [5, 6, 7]; const x = a.pop(); console.log(x, a.length);- 7 2
- 5 2
- 7 3
- 무엇이 출력될까요?
const a = ["cat", "dog"]; console.log(a.indexOf("bird")); - 무엇이 출력될까요?
const a = ["a", "b", "c"]; console.log(a.join("-")); - 무엇이 출력될까요?
const a = [3, 4, 5]; let t = 0; for (const n of a) { t += n; } console.log(t); - 무엇이 출력될까요?
const a = [1, 2, 3]; a[0] = 9; console.log(a[0] + a[2]); - 무엇이 출력될까요?
const a = ["red", "green"]; console.log(typeof a[5]);- undefined
- 오류
- string
- arr의 모든 인덱스를 정확히 한 번씩 도는 반복문 머리는?
for (let i = 0; i < arr.length; i++)for (let i = 0; i <= arr.length; i++)for (let i = 1; i <= arr.length; i++)
- 배열은 [ ] 안에 값을 순서대로 담고, 인덱스는 0부터입니다.
- 마지막 요소는 arr[arr.length - 1]입니다.
- push와 pop은 끝에서 더하고 뺍니다. const 배열도 안은 바뀝니다.
- includes, indexOf, join으로 흔한 질문에 답합니다.
- i를 0부터 i < length까지 돌거나, 값만 필요하면 for...of를 씁니다.