객체 구조 분해 할당 (destructuring)

이윤희·2025년 1월 5일

React/Next 일기

목록 보기
15/52

방금 질문했던 것에서...
GPT가 객체 구조 분해 할당을 알려줬는데, 거기서 의문점이 하나 생겼다.
내가 만든 아무 변수명이 어떤 요소인줄 알고 data 객체에서 요소와 매칭시킬 수 있는거지?> 생각해보니 id라는 키 값으로 매칭했나 보다.
그래서 하나 더 물어봤다.

제가 임의로 만든 변수명 id가 아닌, props.shoes 객체 안에 있는 id라는 키 값을 전달해야만 하는 건가요?

GPT

좋은 질문이에요! 객체 구조 분해 할당은 자바스크립트에서 객체를 다룰 때 매우 유용한 개념입니다. 이걸 하나하나 알기 쉽게 풀어서 설명드릴게요.


1. 객체 구조 분해 할당이란?

객체 구조 분해 할당(Object Destructuring)은 객체에서 필요한 키의 값을 쉽게 변수로 추출하는 방법입니다.

예를 들어, 이런 객체가 있다고 가정해 봅시다:

const person = {
  name: "Alice",
  age: 25,
  city: "New York"
};

이 객체에서 nameage를 변수로 꺼내려면 원래는 이렇게 해야 했습니다:

const name = person.name;
const age = person.age;

console.log(name); // Alice
console.log(age); // 25

하지만 객체 구조 분해 할당을 사용하면, 훨씬 간단하게 쓸 수 있습니다:

const { name, age } = person;

console.log(name); // Alice
console.log(age); // 25

위 코드는 다음과 같은 일을 합니다:

  • person 객체에서 nameage라는 키를 찾아서 해당 값을 각각 name, age라는 변수에 저장합니다.

2. 중요한 점: 키 이름과 변수 이름의 관계

구조 분해 할당을 사용할 때, 객체의 키 이름(key)과 변수 이름이 정확히 일치해야 합니다.

예를 들어:

const { city } = person;
console.log(city); // New York

위 코드에서 city라는 변수는 person 객체의 city 키와 연결됩니다. 키 이름이 일치하지 않으면 값이 저장되지 않습니다.

const { country } = person;
console.log(country); // undefined (person 객체에는 "country"라는 키가 없음)

3. useParams()와 구조 분해 할당

useParams()는 React Router에서 URL 파라미터를 가져오는 데 사용됩니다. 예를 들어, URL이 다음과 같을 때:

/detail/2

useParams()는 URL에서 파라미터를 추출해 객체로 반환합니다. 이 경우 반환값은 다음과 같습니다:

{ id: "2" }

이 반환값에서 id라는 값을 가져오고 싶다면, 구조 분해 할당을 사용할 수 있습니다:

const { id } = useParams();

위 코드는 다음과 같은 일을 합니다:
1. useParams()가 반환한 객체(예: { id: "2" })에서 id라는 키를 찾아 그 값을 id라는 변수에 저장합니다.
2. 이제 id 변수에 "2"라는 값이 들어갑니다.

왜 키 이름을 맞춰야 하나요?

useParams()가 반환하는 객체는 { id: "2" } 형태이기 때문에, 키 이름이 id로 정해져 있습니다. 만약 키 이름이 id가 아니라 productId라면, 구조 분해 할당에서도 productId를 사용해야 합니다:

const { productId } = useParams(); // 이 경우, 반환 객체가 { productId: "2" } 여야 함

하지만 반환 객체에 없는 키 이름(예: foo)을 사용하면 undefined가 됩니다:

const { foo } = useParams();
console.log(foo); // undefined

4. 제가 임의로 만든 변수명을 쓸 수 있나요?

만약 반환 객체의 키 이름과 변수 이름을 다르게 쓰고 싶다면, 별칭(alias)을 사용할 수 있습니다.

const { id: productId } = useParams();

이 코드는 다음과 같이 동작합니다:
1. useParams()가 반환한 객체(예: { id: "2" })에서 id라는 키를 찾습니다.
2. 그 값을 productId라는 변수에 저장합니다.
3. 이제 productId에는 "2"가 들어가게 됩니다.

예제:

const { id: productId } = useParams();
console.log(productId); // "2"

이렇게 하면 반환 객체의 키 이름과 상관없이 변수 이름을 원하는 대로 바꿀 수 있습니다.


5. 질문에 대한 답변

제가 임의로 만든 변수명 id가 아닌, props.shoes 객체 안에 있는 id라는 키 값을 전달해야만 하는 건가요?

답:

네, 반드시 객체의 키 이름과 일치해야 합니다. useParams()가 반환하는 객체의 키 이름이 id라면, 구조 분해 할당에서 변수 이름도 id로 써야 값이 제대로 할당됩니다.

만약 키 이름과 변수 이름을 다르게 쓰고 싶다면 별칭(alias)을 사용해야 합니다.


6. 구조 분해 할당의 요약

  • 객체 구조 분해 할당은 객체에서 특정 키의 값을 바로 변수로 꺼낼 때 사용합니다.
  • 구조 분해 할당에서 변수 이름은 객체의 키 이름과 정확히 일치해야 합니다.
  • 키 이름과 다른 변수 이름을 사용하려면 별칭(alias) 문법을 사용합니다.
  • React Router의 useParams()와 함께 사용할 때도 반환 객체의 키 이름과 일치하는 변수명을 써야 값이 제대로 할당됩니다.

7. 실제 코드에서의 정리

import { useParams } from "react-router-dom";

function Detail(props) {
  // useParams()의 반환값이 { id: "2" }라면
  const { id } = useParams(); // id는 문자열 "2"가 됩니다.

  // 찾기
  const foundProduct = props.shoes.find((product) => {
    return product.id === parseInt(id); // id는 문자열이므로 숫자로 변환
  });

  return foundProduct ? (
    <div>상품 정보: {foundProduct.title}</div>
  ) : (
    <div>상품을 찾을 수 없습니다.</div>
  );
}

0개의 댓글