JS | ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํ• ๋‹น (Destructuring)

2021. 5. 12. 03:38ใ†๐Ÿ’ป ๊ฐœ๋ฐœ/JavaScript

'๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive' (36์žฅ)์„ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค

 

๊ฐ์ฒด๋ฅผ 1๊ฐœ ์ด์ƒ์˜ ๋ณ€์ˆ˜์— ๊ฐœ๋ณ„์ ์œผ๋กœ ํ• ๋‹นํ•˜๊ณ  ์‹ถ์„๋•Œ, ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์—์„œ ํ•„์š”ํ•œ ๊ฐ’๋งŒ ์ถ”์ถœํ•˜์—ฌ ๋ณ€์ˆ˜์— ํ• ๋‹น์‹œํ‚ค๋Š” ๋ฐฉ์‹์„ Destructuring Assignment, ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํ• ๋‹น์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด๋ฅผ ๊ฐ๊ฐ ๋ถ„ํ• ํ•ด์„œ ๋ณ€์ˆ˜์— ํ• ๋‹น์‹œํ‚ค๋Š” ๋ฐฉ์‹์„ ์•Œ์•„๋ณด์ž. 

 

1. ๋ฐฐ์—ด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง (ES6 ๊ธฐ์ค€)

const arr = [1, 2, 3];

// ES6 ๋ฐฐ์—ด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํ• ๋‹น 
const [one, two, three] = arr;
console.log(one, two, three);	// 1 2 3 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ณ€์ˆ˜ one, two, three๋ฅผ ์„ ์–ธํ•˜๊ณ  ๋ฐฐ์—ด arr๋ฅผ ๋น„๊ตฌ์กฐํ™”(๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง) ํ•˜์—ฌ ๋ณ€์ˆ˜์— ํ• ๋‹น์‹œ์ผœ ์ค€๋‹ค.

๋ฐฐ์—ด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํ• ๋‹น์„ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๋ณ€์ˆ˜์™€ ํ• ๋‹น ๋Œ€์ƒ ์–‘์ชฝ ๋ชจ๋‘ ๋ฐฐ์—ด์ด์–ด์•ผ ํ•œ๋‹ค. 

const [x, y] = [1, 2];
let x, y;
[x, y] = [1, 2];
const [a, b] = [1, 2]
console.log(a, b)	// 1 2

const [c, d] = [1];
console.log(c, d)	// 1 undefined

const [e, f] = [1, 2, 3];
console.log(e, f)	// 1 2
const [a, b, c = 3] = [1, 2];
console.log(a, b, c);	// 1 2 3

const [e, f = 10, g = 3] = [1, 2];
console.log(e, f, g);	// 1 2 3 

 

๋งŒ์•ฝ ์šฐ๋ณ€์— ์ดํ„ฐ๋Ÿฌ๋ธ” ํ˜•ํƒœ๋กœ ํ• ๋‹นํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. 

const [x, y];
const [a, b] = {};	// TypeError

{}๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ”์ด ์•„๋‹ˆ๊ธฐ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ! 

 

2. ๊ฐ์ฒด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง (ES6 ๊ธฐ์ค€)

๊ฐ์ฒด์˜ ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํ• ๋‹น์˜ ๊ฒฝ์šฐ, ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ์˜ ํ‚ค๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

const user = { firstName: 'Ahn', lastName: 'Lee' };
const { lastName, firstName } = user;
console.log(firstName, lastName);	// Ahn Lee

๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , user ๊ฐ์ฒด๋ฅผ ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ํ•˜์—ฌ ํ• ๋‹น์‹œ์ผœ์ค€ ๋ชจ์Šต์ด๋‹ค. 

const user = { firstName: 'Ahn', lastName: 'Lee' };
const { lastName: ln, firstName: fn } = user;
console.log(fn, ln);	// Ahn Lee

๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ํ‚ค์™€ ๋‹ค๋ฅธ ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ํ”„๋กœํผํ‹ฐ ๊ฐ’์„ ํ• ๋‹น๋ฐ›์œผ๋ ค๋ฉด ์ด๋ ‡๊ฒŒ!

 

const { firstName = 'Ahn', lastName } = { lastName: 'Lee' };
console.log(fistName, lastName);	// Ahn Lee
const todo = { id: 1, content: 'HTML', completed: true };
const { id } = todo;
console.log(id);	// 1

์ด๋ ‡๊ฒŒ ๊ฐ์ฒด ๋””์ŠคํŠธ์ฒ˜๋ง์€ ๊ฐ์ฒด์—์„œ ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ํ•„์š”ํ•œ ๊ฐ’๋งŒ ์ถ”์ถœํ•˜๊ณ  ์‹ถ์„๋•Œ ์œ ์šฉํ•˜๋‹ค 

function printTodo(todo) {
	console.log(`ํ• ์ผ ${todo.content}์€ ${todo.completed ? '์™„๋ฃŒ' : '๋น„์™„๋ฃŒ'} ์ƒํƒœ์ž…๋‹ˆ๋‹ค.`);
}
printTodo({ id: 1, content: 'HTML', completed: true});	// ํ• ์ผ HTML์€ ์™„๋ฃŒ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. 

์‹ค์ œ๋กœ ์œ„์™€๊ฐ™์ด ์‚ฌ์šฉํ–ˆ์„๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ณ„์† ๋ถˆ๋Ÿฌ์™€์•ผ ํ•ด์„œ ๋ถˆํŽธํ–ˆ๋Š”๋ฐ 

todo์— ๊ฐ์ฒด๋“ค์„ ํ• ๋‹น์‹œํ‚ค๊ณ  todo ํ‚ค์›Œ๋“œ๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ๊ฐ์ฒด๋“ค๋งŒ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ์ข€๋” ๊ฐ„๋‹จํ•ด์ง„๋‹ค 

function printTodo({ content, completed }) {
	console.log(`ํ• ์ผ ${content}์€ ${completed ? '์™„๋ฃŒ' : '๋น„์™„๋ฃŒ'} ์ƒํƒœ์ž…๋‹ˆ๋‹ค.`);
}
printTodo({ id: 1, content: 'HTML', completed: true});	// ํ• ์ผ HTML์€ ์™„๋ฃŒ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. 

 

๋งˆ์ง€๋ง‰์œผ๋กœ ์ค‘์ฒฉ๋œ ๊ฐ์ฒด์—์„œ์˜ ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง์ด๋‹ค. 

const user = {
	name: 'Lee', 
    	address: {
    	zipCode: '03068',
      city: 'Seoul'
    }
};
const { address: { city } } = user;
console.log(city);	// 'Seoul'

์ด ๊ฒฝ์šฐ์—๋Š” address ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ๋จผ์ € ๊ฐ์ฒด๋ฅผ ์ถ”์ถœํ•˜๊ณ , ์ด ๊ฐ์ฒด์˜ city ํ”„๋กœํผํ‹ฐ ํ‚ค๋กœ ๊ฐ’์„ ์ถ”์ถœํ•˜๋ฉด ๋œ๋‹ค.