JavaScript

자바스크립트 구조분해문법 (비구조화할당)

찹귤 2021. 10. 27. 18:00

구조분해는 기본적으로 값을 푸는 것입니다.

배열이나 객체의 속성이나 값을 구조분해하여 값을 변수에 담을 수 있게 하는 자바스크립트 문법입니다.

 

배열 구조 분해

배열이 갖고있는 값을 꺼내서 쓰려고 하면 직접 배열의 값을 지정해서 썼어야 합니다.

이렇게 쓴다면 코드도 길어지고, 한눈에 알아보기도 힘듭니다.

const food = ["kimchi","bulgogi","pasta"]

const koreanFood1 = food[0]; 
const koreanFood2 = food[1]; 
const foreignFood = food[2]; 

console.log(koreanFood1) //"kimchi"
console.log(koreanFood2) //"bulgogi"
console.log(foreignFood) //"pasta"

 

하지만 비구조화 할당을 통해서 다음과 같이 한눈에 보기 쉽게 쓸 수가 있습니다.

const food = ['kimchi', 'bulgogi', 'pasta'];

const [koreanFood1, koreanFood2, foreignFood] = food;
//or
const [koreanFood1, koreanFood2, foreignFood] = ['kimchi', 'bulgogi', 'pasta'];

console.log(koreanFood1); //"kimchi"
console.log(koreanFood2); //"bulgogi"
console.log(foreignFood); //"pasta"

 

그리고 기본값을 설정할 수가 있습니다.

배열의 3개의 요소를 구조분해한다고 하면 p와 q는 8과 9라는 값으로 설정되어 있는 반면에

배열의 세번째 요소인 r은 값이 설정 되어있지 않아서 undefined가 나옵니다.

const [p,q,r] = [8,9];
console.log(p,q,r) //8,9,undefined

 

이럴 때 다음과 같이 배열의 세번째 요소에 기본값을 설정한다면 값이 정상적으로 7이 나오는 것을 볼 수 있습니다.

const [p, q, r = 7] = [8, 9];
console.log(p, q, r);// 8,9,7

그리고 기본값이 이미 설정이 되어있는 요소라도 우측에 값이 설정이 되어있다면

우측에 있는 값이 우선으로 찍히게 됩니다.

const [p=2, q=2, r = 7] = [8, 9];
console.log(p, q, r);// 8,9,7

 

중첩구조분해

배열이나 객체에 다른 객체나 배열을 포함할 때, 다음의 방법을 사용하면 중첩으로 된 배열이나, 객체의 정보를 추출할 수 있습니다.

 

간단한 예시

중첩 구조분해를 하기 전에는 c의 값이 [5,6]이라는 배열 그 자체이기 때문에 콘솔을 찍었을 때

[5,6] 이라는 배열 자체의 값이 나온 것을 볼 수 있습니다.

하지만 우리는 배열 자체의 값이 아니라 배열 안의 요소의 값을 추출하고 싶다면

중첩 구조분해를 사용할 수 있습니다. 

중첩 구조분해를 하고나서는 배열 안의 배열의 요소인 c, d의 값을 추출한 것을 볼 수 있습니다.

//중첩 구조분해 하기 전
const nested = [2, 4, [5, 6]];
const [a,b,c] = nested;
console.log(a, b, c); //2,4,[5,6]

//중첩 구조분해 후
const nested = [2, 4, [5, 6]];
const [a,b, [c, d]] = nested;
console.log(a, b, c, d); //2,4,5,6

 

 

객체 구조 분해

만약에 person이라는 객체가 있는데, 그 객체 안의 name, job이라는 값을 꺼낸다고 가정을 해본다면

다음과 같이 꺼낼 수 있습니다.

구조분해를 쓴다면 구조분해하기 전보다 훨씬 더 간결하게 값을 추출할 수가 있습니다.

//구조분해하기 전
const person = {
  name: 'haram',
  job: 'designer',
};

console.log(person.name); //"haram"
console.log(person.job); //"designer"

//구조분해 후
const { name, job } = person;
console.log(name); //"haram"
console.log(job); //"designer"

 

구조분해를 할 때는 변수의 이름도 변경이 가능합니다.

다음과 같이 name을 nickname으로, job을 work로 변경하고서 

nickname, work를 콘솔로 찍으면 동일한 값이 나오는 것을 볼 수 있습니다.

const person = {
  name: 'haram',
  job: 'designer',
};

const { name: nickname, job: work } = person;
console.log(nickname, work); //"haram", "designer"

 

구조분해를 통해서 변수의 값을 변경할 수도 있습니다.

let a = 111;
let b = 222;
const obj = { a: 15, b: 17, c: 127 };
//중괄호로 줄을 시작할때는 괄호로 묶어야 오류가 안난다.
({ a, b } = obj);
console.log(a, b); //15, 17

 

중첩구조분해를 통해서 객체안의 객체의 값을 추출하는 복잡한 코드도 해결할 수 있습니다.

restaurant 객체가 있고, 레스토랑의 이름과 월요일(mon)의 open시간과 close시간을 추출하려고 한다면

다음과 쓸 수 있습니다.

보통 첫번째 방법을 많이 쓰는 것 같습니다. 이렇게 중첩구조분해를 통해서 딥한 객체의 값을 추출할 수 있습니다.

const restaurant = {
  name: 'Pasta heaven',
  openingHours: {
    mon: {
      open: '9:00',
      close: '22:00',
    },
    tues: {
      open: '10:00',
      close: '23:00',
    },
  },
};

//첫번째 방법
const {
  name,
  openingHours: {
    mon: { open, close },
  },
} = restaurant;
console.log(name, open, close); //"Pasta heaven", "9:00", "22:00"

//두번째 방법
const { name } = restaurant;
console.log(name); // "Pasta heaven"
const { open, close } = restaurant.openingHours.mon;
console.log(open, close); // "9:00", "22:00"

 

블로그 첫 포스팅인데 글 주변이 없어서 도움이 필요하신 분들한테 도움이 될 지 모르겠지만,

도움이 됐으면 좋겠습니다.

혹시나 잘못된 내용이 있다면 댓글로 달아주시면 수정하겠습니다.

감사합니다.