Ch.23 JS 핵심 패턴 — 배열 메서드 마스터

구조분해와 스프레드

객체와 배열의 구조분해 할당을 사용할 수 있다useState가 배열 구조분해인 이유를 설명할 수 있다스프레드 연산자로 불변 업데이트 패턴을 적용할 수 있다

const { name, age } = user; 이 문법이 뭐지?

AI가 생성한 React 코드에 중괄호와 점 세 개(...)가 가득합니다. 읽을 수 없으면 수정도 불가능합니다.

구조분해와 스프레드, 어떻게 읽을까?

구조분해 — 객체/배열에서 값을 꺼내는 문법. 스프레드 — 배열/객체를 펼치는 문법. React의 필수 패턴입니다.


article

핵심 내용

객체에서 원하는 속성만 변수로 꺼내는 문법입니다

// 별칭(alias) — 다른 이름으로 받기
const { name: userName, age: userAge } = user;
console.log(userName); // "Kim"

// 기본값 — 없는 속성에 기본값 설정
const { name, role = "user" } = user;
console.log(role); // "user" (없으므로 기본값)

// 중첩 구조분해
const response = {
  data: {
    user: { name: "Kim", settings: { theme: "dark" } }
  }
};
const { data: { user: { settings: { theme } } } } = response;
console.log(theme); // "dark"
// React에서 가장 많이 보는 구조분해 — props
function UserCard({ name, age, email }) {
  return (
    <div>
      <h2>{name}</h2>
      <p>{age}세</p>
      <p>{email}</p>
    </div>
  );
}

// props.name, props.age 대신
// { name, age }로 바로 꺼내 씁니다

useState가 배열 구조분해라는 걸 알면 React가 더 쉬워집니다

// 배열 구조분해 기본
const colors = ["red", "green", "blue"];
const [first, second, third] = colors;
// first = "red", second = "green", third = "blue"

// 건너뛰기
const [, , last] = colors;
// last = "blue"

// useState는 이것과 같다!
// useState(0)은 [0, setter함수]를 반환
const [count, setCount] = useState(0);
// count = 0, setCount = 상태변경함수
// 나머지 패턴 (rest)
const [head, ...tail] = [1, 2, 3, 4, 5];
// head = 1, tail = [2, 3, 4, 5]

// 함수 반환값 구조분해
function getMinMax(arr) {
  return [Math.min(...arr), Math.max(...arr)];
}
const [min, max] = getMinMax([3, 1, 4, 1, 5]);
// min = 1, max = 5

객체 vs 배열 구조분해 객체 구조분해는 이름으로 매칭 (순서 무관). 배열 구조분해는 순서로 매칭 (이름은 자유).

... (점 세 개)는 배열/객체를 펼치는 연산자입니다

// 배열 스프레드
const a = [1, 2, 3];
const b = [4, 5, 6];

// 복사
const copy = [...a];
// [1, 2, 3] (원본과 별개)

// 합치기
const merged = [...a, ...b];
// [1, 2, 3, 4, 5, 6]

// 요소 추가
const withNew = [...a, 99];
// [1, 2, 3, 99]
// 객체 스프레드
const user = { name: "Kim", age: 25 };

// 복사
const copy = { ...user };

// 덮어쓰기 (뒤에 오는 값이 우선)
const updated = { ...user, age: 26 };
// { name: "Kim", age: 26 }

// 속성 추가
const withRole = { ...user, role: "admin" };
// { name: "Kim", age: 25, role: "admin" }
// React 불변 업데이트 패턴 — 가장 중요!
const [todos, setTodos] = useState([
  { id: 1, text: "공부", done: false },
]);

// 추가
setTodos([...todos, { id: 2, text: "운동", done: false }]);

// 수정 (id가 1인 항목의 done을 true로)
setTodos(todos.map((t) =>
  t.id === 1 ? { ...t, done: true } : t
));

// 삭제
setTodos(todos.filter((t) => t.id !== 1));

바이브 코더 팁 AI 코드에서 `{ ...obj, key: newValue }` 패턴을 자주 봅니다. "기존 것을 복사하고, 이 부분만 바꾼다"로 읽으세요.

const [count, setCount] = useState(0)에서 사용된 문법은?

{ ...user, age: 30 }은 원본 user 객체의 age를 30으로 수정한다

React에서 state 배열에 새 항목을 추가하는 올바른 방법은?

edit_note

정리 노트

구조분해 & 스프레드 핵심 정리

구조분해 할당

객체 구조분해
const { name, age } = user 처럼 필요한 속성만 추출
배열 구조분해
const [first, second] = arr 처럼 순서대로 추출
기본값
const { name = '익명' } = user 처럼 기본값 설정 가능

스프레드 연산자

배열 스프레드
[...arr, newItem]으로 원본 유지하며 새 배열 생성
객체 스프레드
{...obj, key: value}로 원본 유지하며 속성 변경
React 필수
상태 업데이트 시 스프레드로 새 객체/배열을 만들어야 감지됨

React에서 상태를 업데이트할 때는 push 대신 반드시 스프레드로 새 배열을 만드세요.

퀴즈와 인터랙션으로 더 깊이 학습하세요

play_circle인터랙티브 레슨 시작