[220608 / Day 25] React : copy, JSON, map
1. copy
1) deep copy
- ์ค์ ๊ฐ์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ณต์ฌํ๋ ๊ฒ์ ์๋ฏธ
- ์์ํ์ :
let a = 10;
let b = a;
a = 30;
console.log(a) // 30
console.log(b) // 10
2) shadow copy
- ์ฃผ์ ๊ฐ์ ๋ณต์ฌํ๋ค๋ ์๋ฏธ
- ๊ฐ์ฒด object :
let a = { value: 1 }
let newA = a;
newA.value = 2;
console.log(a === newA) // true
→ a ์ newA ๋ ๊ฐ์ ์ฃผ์๋ฅผ ์นดํผํจ ๊ทธ๋์ value: 2 ๋ผ๊ณ ์ฃผ์ ์์ ๊ฐ์ด ๋ฐ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์ํ์ ์ฒ๋ผ ๊ฐ๊ฐ a = value: 1 ์ด๊ณ newA = value: 2 ๋ก ๋ณต์ฌ๋์ด ๋ค๋ฅด๊ฒ ๋ฐ๋๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ ์ฃผ์ ์์ ๊ฐ์ ๋ฐ๊ฟ์ค ๊ฒ์ด๋ผ a, newA ๊ฐ์ ๊ฐ์
3) ๊ฐ์ฒด๋ฅผ deep copy ํ๋ ๋ฐฉ๋ฒ
- Object.assign() : ์ถ์ฒ ๊ฐ์ฒด๋ค์ ๋ชจ๋ ์ด๊ฑฐ ๊ฐ๋ฅํ ์์ฒด ์์ฑ์ ๋ณต์ฌํด ๋์ ๊ฐ์ฒด์ ๋ถ์ฌ๋ฃ๊ณ ๋์ ๊ฐ์ฒด๋ฅผ ๋ฐํ, 1๋จ๊ณ๊น์ง๋ง ์นดํผ๋จ / ๊ฐ์ฒด๋ฅผ ํฉ์น๋ ๊ฒ์ด ๊ฐ๋ฅ, ํฉ์น ๋๋ 2๊ฐ์ ๊ฐ์ฒด๊ฐ ๊ฐ์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๊ทธ ๊ฐ์ ๋ฎ์ด์ฐ๊ธฐ ํด์ฃผ๋ฉฐ, ๊ฐ์ฒด์ ๋ณต์ ์์๋ ์ฌ์ฉ
const obj = { num: 1 }
const newObj = Object.assign({}, obj) // ๋ฐ์ชฝ์ง๋ฆฌ ๋์นดํผ ์๋ฒฝํ ๋์นดํผ๋ ์๋
console.log(obj) // 1
console.log(newObj) // 1 ์นดํผ
newObj.num = 10;
console.log(newObj) // 10 ์ผ๋ก ๋ณ๊ฒฝ
console.log(obj === newObj) // false -> obj=1 newObj=10 ๋ ผ์นดํผ
→ ๋ณต์ฌ๋ ๋์ง๋ง ๋ณ๊ฒฝํ๋ฉด ๋ฐ์ ์๋จ, newObj ์ obj ๊ณผ ํฉ์น ์ฒซ๋ฒ์งธ ์ธ์๊ฐ์ ๋ฐํ, ๋ฐ๋ผ์ obj ์ ๋ณํ ์์, ๊ทธ๋ฆฌ๊ณ deep copy ๋ ์๋กญ๊ฒ ํ๋ ๋ณต์ฌ ๋ถ์ฌ๋ฃ๊ธฐ๋ก ์๊ธฐ๋ ๊ฑฐ๋ผ ์ฃผ์๊ฐ ๋ฌ๋ผ์ ธ์ ์ด๋ป๊ฒ๋ false ๊ฐ ๋ธ
const user = {
name: '์ฒ ์',
hobby: {
a: 'game',
b: 'music',
},
}
const newUser = Object.assign({}, user);
newUser.hobby.a = 'book'; // user, newuser ๊ฐ์ด ๋ฐ๋
newUser.name = '์ํฌ'; // 1๋จ๊ณ ์นดํผ๋ง ๋์ด newuser ๋ง ๋ฐ๋
console.log(user)
console.log(newUser)
console.log(user == newUser) // ์ํฌ๊น์ง, false
→ deep copy ๋ ์ค์ ๊ฐ์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ณต์ฌํด์ 1๋จ๊ณ์์ ๊ฐ์ ๋ฐ๋์ง๋ง ์ด์ค, ์ผ์ค ๊ตฌ์กฐ๋ก ๊ฐ๊ฒ ๋๋ฉด ์๋์ฐ ์นดํผ๊ฐ ๋์ด ๊ฐ์ด ๋ฐ๋
- … ์คํ๋ ๋ ์ฐ์ฐ์ : ๋ณต์ฌํ๊ณ ์ถ์ ๊ฐ์ฒด ์ด๋ฆ ์์ … ๋ง ์ ์ด์ฃผ๋ฉด ๋ณต์ฌ
const item = {
type: 101,
color: {
a: 'red',
b: 'blue',
},
};
const newItem = { ...item };
console.log(item) // type: 101~
console.log(newItem) // type: 101~
// ๋๊ฐ์ด ๋์ด
newItem.type = 202;
console.log(item) // type: 101~
console.log(newItem) // type: 202~
// item.type ์ ๋ฐ๋์ง ์์
newItem.color.a = 'green';
console.log(item) // green
console.log(newItem) // green
// ๋๊ฐ ๋ค ๋ฐ๋
→ deep copy ๋ ์ค์ ๊ฐ์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ณต์ฌํด์ 1๋จ๊ณ์์ ๊ฐ์ ๋ฐ๋์ง๋ง ์ด์ค, ์ผ์ค ๊ตฌ์กฐ๋ก ๊ฐ๊ฒ ๋๋ฉด ์๋์ฐ ์นดํผ๊ฐ ๋์ด ๊ฐ์ด ๋ฐ๋
2. JSON
- ๋ฐฑ์๋์์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ค ๋์ ์๋ฃํํ, ๊ฐ์ฒด์ ๋๊ฐ์ ๋ชจํ, ํค๊ฐ์ ๋ง๋ค์ด์ฃผ๊ณ ํ๋กํผํฐ ์ ๋ ฅ
- stringify ๋ฉ์๋์ parse ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ์๋ฒฝํ ์นดํผ๊ฐ ๋จ
- ์ฒ์๋ถํฐ parse ์ฐ๋ฉด ๋์ง ์๋? parse ๋ ๋ฌธ์์ด์ ์ค๋ธ์ ํธ๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฑฐ๋ผ ๊ผญ stringify, parse ํด์ค์ผ ์๋ฒฝํ๊ฒ ์นดํผ๋จ
- ๋ฐฉ๋ํ ์๋ฃ๋ ์ ์ฉํ์ง ์์ ๋ ๋๋ง ์ค๋๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์, ๋จ ์ด๋ฐ ๊ฒฝ์ฐ ๋ง๋ค ํ๋ฉด ์ด์ฉ ์ ์์ด ์ฌ์ฉ, ์์ฃผ ๋ง์ด ์ ๊ธฐ์ตํด๋๊ฒ
- ๋จ์ ์ ํจ์, ๋ฉ์๋๋ ์นดํผ ์๋จ ์ธ๋ํ์ธ๋ ๋์ด. ๋ฐ๋ผ์ ์๋ฃํ์ ์ธ ์ ์์ง๋ง ํจ์, ๋ฉ์๋ ๋ค์ด๊ฐ๋ฉด ๋ฌธ์ ๊ฐ ์๊น
1) JSON.stringify()
- JavaScript ๊ฐ์ด๋ ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์์ด๋ก ๋ณํ. ์ ํ์ ์ผ๋ก, replacer๋ฅผ ํจ์๋ก ์ ๋ฌํ ๊ฒฝ์ฐ ๋ณํ ์ ๊ฐ์ ๋ณํํ ์ ์๊ณ , ๋ฐฐ์ด๋ก ์ ๋ฌํ ๊ฒฝ์ฐ ์ง์ ํ ์์ฑ๋ง ๊ฒฐ๊ณผ์ ํฌํจ
- ์์ : JSON.stringify( value [, replacer [, space ] ] )
const obj = {
name: '์ฒ ์',
address: '์์ธ',
hobby: {
a: 'game',
b: 'music',
}
}
// stringify
const newObj = JSON.stringify(obj);
console.log(newObj)
// -> {"name":"์ฒ ์","address":"์์ธ","hobby":{"a":"game","b":"music"}}
2) JSON.parse()
- JSON ๋ฌธ์์ด์ ๊ตฌ๋ฌธ์ ๋ถ์ํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ์์ JavaScript ๊ฐ์ด๋ ๊ฐ์ฒด๋ฅผ ์์ฑ. ์ ํ์ ์ผ๋ก, reviver ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌํ ๊ฒฝ์ฐ, ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ์ ์ ๋ณํ ๊ฐ๋ฅ
- ์์ : JSON.parse( text [, reviver ] )
// parse
const newObj2 = JSON.parse(JSON.stringify(obj));
console.log(newObj2) // ๋ฌธ์์ด -> ์ค๋ธ์ ํธ
3. map ๋ฐ๋ณต๋ฌธ
- foreach ์ ๊ฒฝ์ฐ ๊ฐ๊ฐ์ element ์ ํ์ ์ ele ํ๋ํ๋์ ์คํํด์ฃผ๋๋ฐ ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํดํ์ง ์์ง๋ง map ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํดํด์ค
- foreach ์ map ์ ์ฌ์ฉ๋ฒ์ ๋์ผ :
[ ].forEach((ele,index,arr)=>{})
[ ].map((ele,index,arr)=>{})
const arr = [
{ id: 1, item: 'type1' },
{ id: 2, item: 'type2' },
{ id: 3, item: 'type3' },
{ id: 4, item: 'type4' },
{ id: 5, item: 'type5' },
]
arr.forEach((ele) => {
console.log(ele)
});
arr.map((ele) => {
console.log(ele)
});
- for๋ฌธ, ๋ฐ๋ณต๋ฌธ์ ๋์ฒดํ์ฌ ์ฌ์ฉํ๋ค๋ฉด ์์ฃผ ์ ์ฉํ๋ค
- react ์์ ๋ฐ๋ณต๋๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด์ ๋ด์ฅ ํจ์์ธ map( ) ์ ์ฌ์ฉ
1) react ์ ์ ์ฉํ foreach
const arr = [1, 2, 3];
let lis1 = arr.forEach((ele,key) => <li>{ele}</li>);
- foreach : 3๋ฒ์ ํจ์๊ฐ ์ ์ฉ. <li> [1] , <li> [2], <li> [3]. → lis1 ๋ณ์์ ์ ์ฅ. ํ์ง๋ง ๋ฆฌํด ๊ฐ์ด ์์ด ์ถ๋ ฅx
2) react ์ ์ ์ฉํ map
const arr = [1, 2, 3];
let lis1 = arr.map((ele, key) => <li key={key}>{ele}</li>);
- map : ๋ฆฌํด๊ฐ์ ํจ์ ์์ ๊ฐ์ด ๋ชจ๋ ๋ฆฌํด, ์ถ๋ ฅ
- ์์์ key ๋ ์ด๋ค ํญ๋ชฉ์ ์ถ๊ฐ๋ณ๊ฒฝํ ๋ ์๋ณ์๋ก ์ฌ์ฉํ๊ธฐ ์ํด์ key ๊ฐ์ ์ ์ฉ
3) map ๋ฌธ์์ key?
- map ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ผญ ๋ค์ด๊ฐ์ผ ํจ
- ๋ ๊ฐ์ ์์๊ฐ ๋ฐ๋ณตํด์ ์๊ฒผ์ ๋ ๊ทธ ์ค ์ด๋ค ์์์ ๋ณํ๊ฐ ์ผ์ด๋๋ฉด ๊ทธ ์์๋ฅผ ์๋ณํด์ผ ํจ
- react ๋ ๊ฐ์ ๋์ ์ด์ฉํด ๋ฌ๋ผ์ง ์์ฑ์ ๋น๊ตํด์ ์ ๋ฐ์ดํธํ๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ ์ปดํฌ๋ํธ๋ ๋๊ฐ์ ์ ์์ง๋ง ์๋ณ์๋ ๋ฌ๋ผ์ผ ํจ. ์ฆ, key ๊ฐ์ ์ ๋ฃ์ด์ฃผ๋ฉด ์๋ฌ๋๊ณ ๋์ ํ์ง ์์
- ์ด๋ค ํญ๋ชฉ์ ์ถ๊ฐ ๋ณ๊ฒฝํ ๋ ์๋ณ์๋ก ์ฌ์ฉํ๊ธฐ ์ํด์ key ๊ฐ์ ์ ์ฉํด์ผ ํจ
- key ๊ฐ์ ๊ณ ์ ํ ๊ฐ์ด์ด์ผ ํจ, index ๊ฐ์ key ๊ฐ์ผ๋ก ์ฐ๋ฉด ์๋จ
- index ์ id ๋ ํ๋ฆผ. index ๋ ๋ฒํธ, id ๋ ๊ณ ์ ํ key ๊ฐ.
- ๋ฐ์์จ ๊ฐ๋ค ์ค์์ key ๊ฐ์ผ๋ก ์จ์ผ ํ๋๋ฐ index ์ ๊ฒฝ์ฐ ์ด๋ค ์์๊ฐ ์ถ๊ฐ ๋์ ๋ index ๋ฒํธ๋ ์์ ๋ ์ ์์.
- ๋ฐ๋ผ์ ์์๊ฐ ์ถ๊ฐ๋๋ฉด ๋ฒํธ๊ฐ ๋ฐ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ชป๋ ๊ณณ์ ์ ์ฉ๋ ์ ์์ ํ์ง๋ง id ๋ ๋ณ๊ฒฝ๋์ง ์๊ธฐ ๋๋ฌธ์ key ๊ฐ์ผ๋ก ๋ง์ด ์ฌ์ฉ
4. react ์ public ํด๋?
์ด๋ฏธ์ง ํ์ผ src ์ ๋ฃ์ด๋ ๋์ง๋ง ์๋ณธ ์ด๋ฏธ์ง ํ์ผ์ ์ด๋ค ์์๋ ์ ํ๊ณ ์ถ์ง ์๋ค ํ๋ฉด ํผ๋ธ๋ฆญ ํด๋.
ํ์ง๋ง ํผ๋ธ๋ฆญ์ ๋ฃ์ผ๋ฉด ๋์ค์ ๋น๋ฉํ ๋ ๋น๋ฉ ํ์ผ์ ๋ณต์ฌ๋์ด ๋ฌธ์ ๊ฐ ์๊ธธ ์๋ ์์
๋ฐ๋ผ์ ํน๋ณํ๊ฒ ์ค์ํ ํ์ผ์ด๋ฉด ํผ๋ธ๋ฆญ ๋ณ ์ค์ํ ํ์ผ์ด ์๋๋ฉด src