edubun English

배열

배열은 여러 값을 순서대로 한 이름 아래 모아 둡니다. ["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의 요소를 새 배열에 펼쳐 담는다는 뜻입니다. 다음 단원의 객체도 똑같이 동작합니다.

이 사이트의 실습 상자는 배열을 ["a","b"]나 [1,2,3]처럼 붙여서 출력합니다. 브라우저 개발자 도구의 콘솔은 빈칸을 넣는 등 다르게 보여 줄 수 있습니다. 출력을 정확히 정하고 싶으면 join을 쓰세요.

풀이 예시. 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배열의 값을 차례로 도는 반복
하나 차이 오류한 칸 넘치거나 모자라는 실수. 흔히 < 대신 <=
  1. 무엇이 출력될까요?
    const a = [10, 20, 30];
    console.log(a[1]);
  2. 무엇이 출력될까요?
    const a = [10, 20, 30];
    console.log(a.length);
  3. 무엇이 출력될까요?
    const a = ["x", "y", "z"];
    console.log(a[a.length - 1]);
  4. 무엇이 출력될까요?
    const a = [1, 2];
    a.push(3);
    a.push(4);
    console.log(a.length);
  5. 무엇이 출력될까요?
    const a = [5, 6, 7];
    const x = a.pop();
    console.log(x, a.length);
    • 7 2
    • 5 2
    • 7 3
  6. 무엇이 출력될까요?
    const a = ["cat", "dog"];
    console.log(a.indexOf("bird"));
  7. 무엇이 출력될까요?
    const a = ["a", "b", "c"];
    console.log(a.join("-"));
  8. 무엇이 출력될까요?
    const a = [3, 4, 5];
    let t = 0;
    for (const n of a) {
      t += n;
    }
    console.log(t);
  9. 무엇이 출력될까요?
    const a = [1, 2, 3];
    a[0] = 9;
    console.log(a[0] + a[2]);
  10. 무엇이 출력될까요?
    const a = ["red", "green"];
    console.log(typeof a[5]);
    • undefined
    • 오류
    • string
  11. 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를 씁니다.