[JavaScript][TIL] 구조 분해 할당

Trippy·2023년 11월 1일
1

JavaScript

목록 보기
20/28
post-thumbnail

구조 분해 할당이란?

객체배열은 자바스크립트에서 가장 많이 쓰이는 자료 구조이다.

키를 가진 데이터 여러 개를 하나의 엔티티에 저장할 땐 객체를, 컬렉션에 데이터를 순서대로 저장할 땐 배열을 사용한다.

개발을 하다 보면 함수에 객체나 배열을 전달해야 하는 경우가 생기곤 한다. 가끔은 객체나 배열에 저장된 데이터 전체가 아닌 일부만 필요한 경우도 생긴다.

이럴 때 객체나 배열을 변수로 "분해"할 수 있게 해주는 특별한 분법인 구조 분해 할당 을 사용할 수 있다.

이 외에도 함수의 매개변수가 많거나 매개 변수 기본값이 필요한 경우 등에서 구조 분해는 그 진가를 발휘할 수 있다.

배열 분해하기

// 이름과 성을 요소로 가진 배열
let arr = ["Giwook", "jeong"]

// 구조 분해 할당을 이용해
// firstName엔 arr[0]을
// surname엔 arr[1]을 할당하였습니다.
let [firstName, surname] = arr;

alert(firstName); // Giwook
alert(surname);  // Jeong

이제 인덱스를 이용해 배열에 접근하지 않고도 변수로 이름과 성을 사용할 수 있다.

아래 예시처럼 split같은 반환 값이 배열인 메서드를 함께 활용해도 좋다.

let [firstName, surname] = "Giwwok Jeong".split(' ');

'분해'는 '파괴'를 의미하지 않는다

구조 분해 할당이란 명칭은 어떤 것을 복사한 이후에 변수로 분해해준다는 의미 때문에 붙여졌다. 이 과정에서 분해 대상은 수정 또는 파괴되지 않는다.

배열의 요소를 직접 변수에 할당하는 것보다 코드 양이 줄어든다는 점만 다르다.

쉼표를 사용하여 요소 무시하기

// 두 번째 요소는 필요하지 않음
let [first, , third] = ["a", "b", "c", "d"];

alert( third ); // c

두 번째 요소는 생략되었지만, 세 번째 요소는 third라는 변수에 할당된 것을 확인할 수 있다.

할당 연산자 우측엔 모든 이터러블이 올 수 있다.

배열뿐만 아니라 모든 이터러블에 구조 분해 할당을 적용할 수 있다.

let [a, b, c] = "abc"; // ["a", "b", "c"]
let [one, two, three] = new Set([1, 2, 3]);

.entries() 로 반복하기

이 메서드와 구조 분해를 조합하면 객체의 키와 값을 순회해 변수로 분해 할당할 수 있다.

let user = {
  name: "Giwook",
  age: 27
};

// 객체의 키와 값 순회하기
for (let [key, value] of Object.entries(user)) {
  alert(`${key}:${value}`); // name:Giwook, age:27 차례대로 출력
}

map에도 물론 이 메서드를 활용할 수 있다.

let user = new Map();
user.set("name", "Giwook");
user.set("age", "27");

for (let [key, value] of user) {
  alert(`${key}:${value}`); // name:Giwook, then age:27
}

...로 나머지 요소 가져오기

배열 앞쪽 값 몇 개만 필요하고 그 이후 이어지는 나머지 값들은 한데 모아서 저장하고 싶을 떄가 있다.

let [name1, name2, ...rest] = ["a", "b", "c", "d"];

alert(name1); // a
alert(name2); // b

// `rest`는 배열.
alert(rest[0]); // c
alert(rest[1]); // d
alert(rest.length); // 2

기본값

할당하고자 하는 변수의 개수가 분해하고자 하는 배열의 길이보다 크더라도 에러가 발생하지 않는다.
할당할 값이 없으면 undefined로 취급되기 때문이다.

let [first, second] = [];

alert(first); // undefined
alert(second); // undefined

=을 이용하면 할당할 값이 없을 떄 기본으로 할당해 줄 값인 기본값을 설정할 수 있다.

// 기본값
let [name = "a", surname = "default"] = ["first"];

alert(name);    // first (배열에서 받아온 값)
alert(surname); // default (기본값)

복잡한 표현식이나 함수 호출도 기본값이 될 수 있다. 이렇게 기본식으로 표현식이나 함수를 설정하면 할당할 값이 없을 때 표현식이 평가되거나 함수가 호출된다.

기본값으로 두 개의 prompt 함수를 할당한 예시를 살펴보면, 값이 제공되지 않았을 때만 함수가 호출되므로 prompt는 한 번만 호출된다.

// name의 prompt만 실행됨
let [surname = prompt('성을 입력하세요.'), name = prompt('이름을 입력하세요.')] = ["정"];

alert(surname); // 김 (배열에서 받아온 값)
alert(name);    // '이름을 입력하세요' (prompt에서 받아온 값)
profile
감금 당하고 개발만 하고 싶어요

1개의 댓글

comment-user-thumbnail
2023년 11월 1일

분해는 파괴를 의미하지 않는다 요건 처음 알았어요 굳굳👍👍

답글 달기