JavaScript 컬렉션 - Array

2025. 9. 9. 17:38·FrontEnd/JavaScript

Array 한 줄 요약

Array는 "순서 있는 값 목록(인덱스로 접근 가능)"이다.

자바스크립트에서 가장 자주 쓰는 컬렉션이며, 순회/검색/변형 메서드가 매우 많다.

 

처음에는 메서드가 너무 많아서 복잡해 보이지만,
실제로는 아래 3가지만 먼저 잡으면 훨씬 쉬워진다.

  • 값 추가/삭제 (push, pop, splice)
  • 검색/확인 (includes, find)
  • 순회/변형 (map, filter, reduce)

먼저 감 잡기 (Array가 왜 중요한가?)

Array(배열)는 거의 모든 코드에서 등장한다.

  • API 응답 목록
  • 화면에 렌더링할 데이터 리스트
  • 검색 결과
  • 체크된 항목 목록
  • 정렬/필터링 대상 데이터

즉, "여러 값을 순서 있게 다룬다" 싶으면 대부분 Array부터 시작한다.


용어 10초 정리

블로그/문서에서 아래 단어가 자주 나오는데, 처음엔 이렇게 이해하면 충분하다.

  • 컬렉션(Collection): 값을 여러 개 담아두는 자료형/자료구조 (예: Array, Set, Map)
  • 이터러블(Iterable): for...of로 순회할 수 있는 값 (예: Array, Set, Map, 문자열)

즉, Array는 "컬렉션"이고, 동시에 "이터러블" 이다.

  • 컬렉션이라서 값을 여러 개 담을 수 있고
  • 이터러블이라서 for...of, 전개 연산자(...)를 사용할 수 있다

Array란 뭐냐? (진짜 핵심만)

한 줄로 정리하면:

"순서가 있는 값을 인덱스로 관리하는 컬렉션"

 

핵심 특징:

  • 순서 있음: 0부터 시작하는 인덱스로 접근 가능
  • 인덱스 접근 가능: arr[0], arr[1]처럼 위치 기반 접근
  • 메서드 많음: 추가/삭제/검색/변형 관련 메서드가 풍부함
  • 이터러블: for...of, 전개 연산자(...) 사용 가능
const arr = [10, 20, 30];

console.log(arr[0]); // 10

for (const v of arr) {
  console.log(v); // 10, 20, 30
}

const copy = [...arr];
console.log(copy); // [10, 20, 30]

배열에서 가장 먼저 알아야 할 관점 (중요)

메서드를 외우기 전에 이 기준부터 먼저 잡자.

1) 원본 배열을 바꾸는가? - MDN

  • 바꾸면: mutating method
  • 안 바꾸면: non-mutating-method

2) 새 배열을 반환하는가?

  • 예: map, filter, slice, concat

이 관점만 잡아도 실수(특히 사이드이펙트)가 많이 줄어든다.


자주 쓰는 메서드 먼저 보기

1) 기본 조작 메서드

메서드 원본 변경 설명
push() ✅ 끝에 요소 추가
pop() ✅ 끝 요소 제거 후 반환
shift() ✅ 첫 요소 제거 후 반환
unshift() ✅ 앞에 요소 추가
concat() ❌ 배열 병합 → 새 배열 반환
slice() ❌ 일부 구간 복사 → 새 배열 반환
splice() ✅ 요소 추가/제거/교체 (파괴적)
const arr = [1, 2, 3];

arr.push(4); // [1, 2, 3, 4]

const last = arr.pop();
console.log(last); // 4
console.log(arr);  // [1, 2, 3]

const sliced = arr.slice(1);
console.log(sliced); // [2, 3] (원본 그대로)

const merged = arr.concat([4, 5]);
console.log(merged); // [1, 2, 3, 4, 5]

2) 검색 관련 메서드

메서드 원본 변경 설명
includes() ❌ 값 포함 여부 (true/false)
indexOf() ❌ 값의 첫 인덱스
find() ❌ 조건을 만족하는 첫 요소
findIndex() ❌ 조건을 만족하는 첫 인덱스
const nums = [10, 20, 30, 40];

console.log(nums.includes(20)); // true
console.log(nums.indexOf(30));  // 2

const found = nums.find(x => x > 25);
const idx = nums.findIndex(x => x > 25);

console.log(found); // 30
console.log(idx);   // 2

팁: 값 자체를 찾으면 find, 위치(인덱스)가 필요하면 findIndex


3) 순회 & 변형 메서드

메서드 원본 변경 설명
forEach() ❌ 각 요소에 콜백 실행 (반환값 없음)
map() ❌ 각 요소를 변환 → 새 배열
filter() ❌ 조건을 만족하는 요소만 모아 새 배열
reduce() ❌ 누산하여 단일 값 반환
const arr = [1, 2, 3, 4];

arr.forEach(x => console.log(x));
// 1, 2, 3, 4

const doubled = arr.map(x => x * 2);
console.log(doubled); // [2, 4, 6, 8]

const biggerThanTwo = arr.filter(x => x > 2);
console.log(biggerThanTwo); // [3, 4]

const sum = arr.reduce((acc, x) => acc + x, 0);
console.log(sum); // 10

실무 감각 한 줄

  • 그냥 돌기만 하면 → forEach 또는 for...of
  • 모양 바꾸면 → map
  • 걸러내면 → filter
  • 하나로 모으면 → reduce

map + filter + reduce 조합만 잘 써도 데이터 처리 로직이 많이 깔끔해진다.


정적 메서드 vs 인스턴스 메서드 (헷갈림 방지)

초보자가 자주 헷갈리는 포인트라서 딱 이렇게 기억하면 된다.

  • 정적 메서드: Array.메서드() → 배열을 만들거나 판별할 때
  • 인스턴스 메서드: arr.메서드() → 이미 있는 배열을 다룰 때

정적 메서드 (배열 만드는/체크하는 쪽)

Array.from()

유사 배열 또는 이터러블을 진짜 배열로 변환

console.log(Array.from('hi')); // ['h', 'i']

const set = new Set([1, 2, 3]);
console.log(Array.from(set)); // [1, 2, 3]

Array.of()

전달한 인자들을 요소로 갖는 새 배열 생성

console.log(Array.of(1, 2, 3)); // [1, 2, 3]
console.log(Array.of('a'));     // ['a']

Array.isArray()

값이 배열인지 확인

console.log(Array.isArray([1, 2])); // true
console.log(Array.isArray('hi'));   // false

복사에서 진짜 많이 헷갈리는 부분 (얕은 복사 vs 깊은 복사)

배열 복사는 자주 쓰지만,
중첩 배열/객체가 있는 순간 실수가 잘 난다.

const arr = [[1, 2], 3];

얕은 복사 (shallow copy)

  • 바깥 배열만 새로 만들고
  • 안쪽 객체/배열은 참조를 공유함

대표 예: slice(), concat(), map(), 전개 연산자(...) → 스프레드 연산자

const shallow = arr.slice();
shallow[0][0] = 9;

console.log(arr); // [[9, 2], 3] ← 원본도 바뀜

깊은 복사 (deep copy)

  • 안쪽까지 전부 새로 복사해서
  • 원본과 복사본이 독립적으로 동작

ES2021+ 환경에서는 structuredClone() 사용 가능

const deep = structuredClone(arr);
deep[0][0] = 5;

console.log(arr);  // [[9, 2], 3]  (원본 유지)
console.log(deep); // [[5, 2], 3]

체크 포인트: 중첩 구조를 다룰 때는 항상
"지금 복사가 얕은 복사인가, 깊은 복사인가?" 를 먼저 확인하자.


Array 사용할 때 내 체크리스트

실제 코드를 짤 때는 아래 순서로 생각하면 실수를 줄이기 좋다.

  • 배열을 만들어야 하나?
    • 유사 배열/이터러블이면 → Array.from()
    • 값 몇 개 빠르게 만들면 → [] 또는 Array.of()
  • 원본을 바꿔도 되나?
    • 괜찮으면 → push, splice 같은 파괴 메서드 사용
    • 애매하면 → slice, concat, map, filter 같은 새 배열 반환 메서드 우선
  • 중첩 데이터인가?
    • 맞다면 → 얕은 복사/깊은 복사 구분 필수 (structuredClone() 고려)
  • 순회만 필요한가, 변형도 필요한가?
    • 순회만 → for...of, forEach
    • 변형 → map, filter, reduce
  • 최신 메서드 사용 가능한 환경인가?
    • 원본 보존 정렬 → toSorted()
    • 뒤에서 찾기 → findLast(), findLastIndex()

오늘 내용 한 줄씩 다시 정리

  • Array = 순서 있는 값 목록(인덱스로 접근 가능)
  • 메서드를 외우기 전에 먼저 원본 변경 여부부터 구분하자
  • 실무에서는 includes, find, map, filter, reduce 체감 사용량이 높다
  • Array.from, Array.of, Array.isArray는 "만들기/체크" 쪽에서 자주 쓴다
  • 중첩 구조 복사는 얕은 복사 vs 깊은 복사를 꼭 구분하자
저작자표시 변경금지 (새창열림)

'FrontEnd > JavaScript' 카테고리의 다른 글

JavaScript 컬렉션 - Set  (0) 2025.12.10
JavaScript 기본기 정리 – 반복문·배열·문자열·Math 한 장에 모으기  (0) 2025.11.04
JavaScript 컬렉션 - Map  (0) 2025.09.09
JavaScript 컬렉션 - Object  (0) 2025.09.09
JavaScript 반복문 한 번에 정리하기  (0) 2025.09.09
'FrontEnd/JavaScript' 카테고리의 다른 글
  • JavaScript 컬렉션 - Set
  • JavaScript 기본기 정리 – 반복문·배열·문자열·Math 한 장에 모으기
  • JavaScript 컬렉션 - Map
  • JavaScript 컬렉션 - Object
프론트엔드 개발자 jbeat
프론트엔드 개발자 jbeat
프론트엔드 개발자 블로그인데 일상도 쪼그으믐
  • 프론트엔드 개발자 jbeat
    jbeat 님의 블로그
    프론트엔드 개발자 jbeat
  • 전체
    오늘
    어제
    • 분류 전체보기 (44)
      • FrontEnd (43)
        • TypeScript (6)
        • JavaScript (18)
        • Next.js (3)
        • React (1)
        • Testing (2)
        • Third Party (1)
        • web (10)
        • Tooling (1)
        • coding test (0)
        • A.I (1)
      • 일상 (1)
        • wedding (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 인기 글

  • 태그

    omit
    CrossOrigin
    타입스크립트
    고차함수
    yjs
    배열
    이터러블
    TypeScript
    Next.js
    WebSocket
    코테
    javascript
    playwright
    주니어
    Utility
    preconnect
    CRDT
    컬렉션
    Android
    pick
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
프론트엔드 개발자 jbeat
JavaScript 컬렉션 - Array
상단으로

티스토리툴바