๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[React] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ• ์ •๋ฆฌ#2

by ๋…น์ฐจ๋ง›๊ฐœ๊ตฌ๋ฆฌ 2022. 8. 3.

์Šคํ”„๋ ˆ๋“œ ๋ ˆ์ŠคํŠธ ์—ฐ์‚ฐ์ž ( Spread & Rest Operators ) ( ... )

์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž(Spread)

Spread( ํŽผ์น˜๋‹ค, ํผ๋œจ๋ฆฌ๋‹ค )๋ผ๋Š” ๋‹จ์–ด๋‹ต๊ฒŒ ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ํŽผ์ณ ๋†“์Šต๋‹ˆ๋‹ค

์˜ˆ๋ฅผ ๋“ค์–ด oldArray๊ฐ€ ์žˆ๋Š”๋ฐ ์ด oldArray๋ฐฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ์›์†Œ๋“ค์„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•˜๊ณ 

๊ทธ๋ฆฌ๊ณ  ๊ฑฐ๊ธฐ์— ์›์†Œ 4๋ฅผ ๋” ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

// ๋ฐฐ์—ด const numbers = [1, 2, 3]; const newNumbers = [...numbers, 4]; console.log(newNumbers); //๊ฒฐ๊ณผ --> [ 1, 2, 3, 4]

์•„์ฃผ ์‰ฝ๊ฒŒ ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜, ์•ˆ์ „ํ•˜๊ฒŒ ์ด์ „ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ์ฒด์—

ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๐Ÿ™‹๐Ÿปโ€โ™‚๏ธ

// ๊ฐ์ฒด const person = { name: 'Max' }; const newPerson = { ...person, age: 28 } console.log(newPerson); --> [object Object] { age: 28, name: "Max" }

๋ ˆ์ŠคํŠธ ์—ฐ์‚ฐ์ž(Rest)

๋ ˆ์ŠคํŠธ(Rest) ์—ฐ์‚ฐ์ž๋ž€ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด ํ•จ์ˆ˜์— ์ „๋‹ฌ๋œ ๋ฌดํ•œ ๊ฐœ์ˆ˜์˜ ์ธ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

์ธ์ˆ˜๋ฅผ ๋ฐ›์•„๋“ค์—ฌ ๊ทธ ์ธ์ˆ˜๋ฅผ ์ธ์‡„ํ•˜๋Š” ํ•จ์ˆ˜์˜ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ €, ์ธ์ˆ˜(arguments)๊ฐ€ ํ•˜๋‚˜๋ผ๋ฉด?๐Ÿ‘‡๐Ÿป

const rest = (a) =>{ console.log(a) } rest(2) ---> 2

์ด๋ ‡๊ฒŒ ์ธ์ˆ˜๊ฐ’์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ์ฝ˜์†”์— 2๊ฐ€ ์ถœ๋ ฅ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘๋ฒˆ์งธ๋กœ ์ธ์ˆ˜(arguments)๊ฐ€ ๋‘๊ฐœ๋ผ๋ฉด?๐Ÿ‘‡๐Ÿป

const rest = (a, b) =>{ console.log(a) console.log(b) console.log(a, b) } rest(2,5) ---> 2 ---> 5 ---> 2 5

์ด๋Ÿฐ์‹์œผ๋กœ ์ฒ˜๋ฆฌ ๋ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ N ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Rest ์—ฐ์‚ฐ์ž์ธ๋ฐ {...}์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌ๋œ ์ž…๋ ฅ๊ฐ’์„ ๋ฐฐ์—ด๋กœ ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค.

const filter = (...args) => { return args.filter(el => el ===1); } console.log(filter(1,2,3)); --> [1] console.log(filter(2,3)); --> [] console.log(filter(2,3,1)); --> [1]

์œ„์™€ ๊ฐ™์ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ถ€๋ถ„์— (...args)๋ฅผ ๋„ฃ์–ด ํ•„ํ„ฐ๋ฅผ ํ†ตํ•ด ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค.๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป๐Ÿ“

๋ฐฐ์—ด ๋ฉ”์†Œ๋“œ๋ฅผ filter()์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , filter๋Š” ๋ฐฐ์—ด์—์„œ ์ „๋‹ฌ๋˜๋Š” ๋ชจ๋“  ์›์†Œ๋“ค์— ๋Œ€ํ•ด ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค๊ทธ๋ž˜์„œ ์›์†Œ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์›์†Œ๊ฐ€ 1๊ณผ ๊ฐ™์€์ง€, ์•„๋‹Œ์ง€๋ฅผtrue๋‚˜ false๋กœ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค
์ธ์ž์™€ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ํ—ท๊ฐˆ๋ฆฐ๋‹ค๋ฉด?!

const rest(a) { // ์—ฌ๊ธฐ์„œ a ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ
  console.log(a); // ์—ฌ๊ธฐ์„œ a ๋Š” ์ธ์ž
}
rest('arguments'); // ์—ฌ๊ธฐ์„œ 'hello world' ๋Š” ์ธ์ž

Spread์™€ Rest๋ฅผ ์ž˜์“ฐ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์‘์šฉ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

const rest = (...args) => { return args.filter(el => el === 1); } const num = [1, 2, 3, 4, 5, 6]; const result = rest(...num); console.log(result);

 


 

๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น( Destructuring )

์Šคํ”„๋ ˆ๋“œ๋Š” ๋ชจ๋“  ์›์†Œ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ƒˆ ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด ๋˜๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ์‚ฌ์šฉํ•˜๋Š”์–ด๋–ค ๊ฒƒ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์€ ์›์†Œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ•˜๋‚˜์”ฉ๋งŒ ๊ฐ€์ ธ์™€์„œ ๋ณ€์ˆ˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค,

๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด๋ฅผ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

const numbers = [1,2,3]; [num1, num2] = numbers; console.log(num1,num2); --> 1, 2 const numbers = [1,2,3]; [num1, ,num3] = numbers; //[num1, ,num2] = numbers; ๋ณ€์ˆ˜์ด๋ฆ„์€ ์ƒ๊ด€์—†์Œ console.log(num1,num2); -->1, 3

๊ฐ์ฒด๋˜ํ•œ ๊ฐ™๋‹ค

cosnt numbers = {a: 42, b: true}; var {a, b} = numbers; console.log(a); // 42 console.log(b); // true
๋ฐฐ์—ด์—์„œ ํŠน์ • ์›์†Œ๋‚˜ ๊ฐ์ฒด์—์„œ ํŠน์ • ์†์„ฑ์„ ์ถ”์ถœํ•˜๋Š” ํŽธํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ž˜ ๊ธฐ์–ตํ•˜์ž!!
Spread & Rest

 


 

์ฐธ์กฐํ˜• ๋ฐ ์›์‹œํ˜• ๋ฐ์ดํ„ฐ ํƒ€์ž…

 

const number = 1; const num2 = number; console.log(num2) ---> 1

๋งŒ์•ฝ ์ด๋Ÿฐ ์‹์œผ๋กœ number๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๋ฉด, ์ด๊ฒƒ์€ ๊ธฐ๋ณธํ˜•์ž…๋‹ˆ๋‹ค

์ด ๋ง์€ ์‹ค์ œ๋กœ number์˜ ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์ด๊ณ  ๊ทธ๊ฒƒ์ด num2์ž…๋‹ˆ๋‹ค

number, string, boolean ์ด๋Ÿฐ ๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๊ธฐ๋ณธํ˜• ์ž๋ฃŒ ํƒ€์ž…์ด๊ณ , ์žฌํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ๋ณ€์ˆ˜๋ฅผ
๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ’์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค,

 

๊ฐ์ฒด์™€ ๋ฐฐ์—ด์€ ์ฐธ์กฐํ˜• ์ž๋ฃŒ ํƒ€์ž…์ž…๋‹ˆ๋‹ค๋ฌด์Šจ ๋œป์ธ์ง€ ํ•œ๋ฒˆ ๋ณด์—ฌ ๋“œ๋ฆด๊ป˜์š”

const person = { name: 'Max' }; const secondPerson = person; console.log(secondPerson); --> [object Object] { name: "Max" }

๊ฐ์ฒด person์„ ์ƒ์„ฑํ–ˆ๊ณ  name ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค, ๊ทธ๋Ÿฐ ๋‹ค์Œ secondPerson์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ ๊ฐ’์œผ๋กœ person์„

ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค ์ฝ˜์†” ์ถœ๋ ฅํ•จ์ˆ˜์— secondPerson์„์ „๋‹ฌํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ person๊ณผ ๊ฐ™์€ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š”๋ฐ,

์‚ฌ์‹ค ๊ฐ์ฒด person์„ ๋ณต์‚ฌํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ ,

๊ฐ์ฒด person์€ ( ๐Ÿ‘‰๐Ÿป { name : 'Max' }  ๋ถ€๋ถ„ ) ์‹ค์ œ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์žˆ๊ณ  

์ƒ์ˆ˜ person  ( ๐Ÿ‘‰๐Ÿป const person = )์—๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค 

๊ทธ๋ž˜์„œ person์„ secondPerson์— ํ• ๋‹นํ•˜๋ฉด ํฌ์ธํ„ฐ๊ฐ€ ๋ณต์‚ฌ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

const person = { name: 'Max' }; const secondPerson = person; person.name = 'Menu'; console.log(secondPerson); -->[object Object] { name: "Menu" }

๋งŒ์•ฝ ๋ณต์‚ฌ๋œ ๊ฒƒ์„  person.name์„ Menu๋กœ ๋ฐ”๊พผ๋‹ค๋ฉด

์—ฌ์ „ํžˆMax๊ฐ€ ์ถœ๋ ฅ๋  ๊ฑฐ๋ผ๊ณ  ์ฐฉ๊ฐํ•˜๋Š”๋ฐ, person์„ ๋ณต์‚ฌํ•ด์„œ secondPerson์— ์ €์žฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—

์ด๋ฆ„์ด ๋ฐ”๋€” ๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๋ฉด name์— Menu๊ฐ€

์ถœ๋ ฅ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค, ์‹ฌ์ง€์–ด ์ €๋Š” secondPerson์„ ์ถœ๋ ฅํ–ˆ๋Š”๋ฐ๋„ ๋ง์ด์˜ˆ์š”,

๊ทธ๋ž˜์„œ secondPerson์˜ ์ด๋ฆ„๋„ ๋ฐ”๋€Œ์—ˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” ๋‹จ์ง€ ํฌ์ธํ„ฐ๋ฅผ ๋ณต์‚ฌํ–ˆ๊ณ  person์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค๐Ÿ‘๐Ÿป๐Ÿ‘๐Ÿป

 

๋งŒ์•ฝ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ์ด๋ ‡๊ฒŒ ๋ณต์‚ฌํ•œ๋‹ค๋ฉด, ํ•œ ์•ฑ์— ์žˆ๋Š” ์ฃผ์†Œ์—์„œ ๊ฐ์ฒด๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค
๊ทธ๋ฆฌ๊ณ  ์‹ค์ˆ˜๋กœ ์•ฑ์˜ ๋‹ค๋ฅธ ์ฃผ์†Œ์— ์žˆ๋Š” ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ์กฐ์ž‘ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค
๊ทธ๋ž˜์„œ "๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ฐฉ๋ฒ•" ์œผ๋กœ ๋ณต์‚ฌํ•˜๋Š” ๋ฒ•์„ ์•„๋ž˜์—์„œ ๋ฐฐ์šฐ๊ฒ ์Šต๋‹ˆ๋‹ค,
์ด ๋ง์€ ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹Œ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ธ๋ฐ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

 

const person = { name: 'Max' }; const secondPerson = { ...person }; person.name = 'Menu'; console.log(secondPerson); --> [object Object] { name: "Max" }// menu๋กœ ๋ฐ”๊ฟจ๋Š”๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ 

์ž, ์œ„์˜ ์ฝ”๋“œ์—์„œ ๋ณด๋“ฏ ์ด์ œ ์—ฌ๊ธฐ์— person ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ”„๋กœํผํ‹ฐ( name: 'Max' )๋ฅผ ์Šคํ”„๋ ˆ๋“œ(...person) ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ๊ทธ๋Ÿฌ๋ฉด person๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ํ”„๋กœํผํ‹ฐ์™€ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ์ƒˆ๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด์— ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ,

์ค‘๊ด„ํ˜ธ๋ฅผ ์จ์„œ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค const secondPerson = { ...person };

 

์ด์ œ ์ฝ˜์†” ์ถœ๋ ฅ ํ•จ์ˆ˜๋กœ secondPersond์„ ์ถœ๋ ฅํ•ด๋„ ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค

ํฌ์ธํ„ฐ๊ฐ€ ์•„๋‹Œ ์ง„์งœ ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๐Ÿค˜๐Ÿป๊ฐ์ฒด์™€ ๋ฐฐ์—ด์ด ์ฐธ์กฐํ˜• ์ž๋ฃŒ ํƒ€์ž…์ด๋ผ๋Š” ๊ฒƒ์„ ๊ผญ ๊ธฐ์–ตํ•ด ๋‘์„ธ์š”
๋งŒ์•ฝ ์žฌํ• ๋‹นํ•œ๋‹ค๋ฉด, ๊ฐ’์ด ์•„๋‹Œ ํฌ์ธํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด๊ณ 
๊ทธ๋ž˜์„œ ์ง„์งœ๋กœ ๋ณต์‚ฌํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ์ „์ฒด ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณต์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค

 

728x90