โœ๐Ÿป [Code Camp_TIL] 15์ผ์ฐจ: ๋ฐ์ดํ„ฐ ๋ณต์‚ฌ, ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž

code_Jยท2023๋…„ 4์›” 16์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
22/41
post-thumbnail

๋ฐ์ดํ„ฐ ๋ณต์‚ฌ


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

let aaa = "์ฒ ์ˆ˜"
let bbb = aaa

console.log(aaa) // ์ฒ ์ˆ˜
console.log(bbb) // ์ฒ ์ˆ˜

์—ฌ๊ธฐ์„œ ๋ณต์‚ฌ๋ณธ์ธ bbb์˜ ๊ฐ’์„ ์žฌํ• ๋‹นํ•˜๋ฉด, ์›๋ณธ์ธ aaa์˜ ๊ฐ’์€ ๋ณ€ํ•˜์ง€ ์•Š๊ณ , bbb์˜ ๊ฐ’๋งŒ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

bbb = "์˜ํฌ"

console.log(aaa) // ์ฒ ์ˆ˜
console.log(bbb) // ์˜ํฌ

ํ•˜์ง€๋งŒ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์€ ๋ณต์‚ฌ๋ณธ์„ ๋ฐ”๊พธ๋ฉด ์›๋ณธ์ด ๋ฐ”๋€๋‹ค.

let child1 = {
	name: "์ฒ ์ˆ˜",
	age: 8,
	school: "๋‹ค๋žŒ์ฅ์ดˆ๋“ฑํ•™๊ต"
}
let child2 = child1

child2 // {name: '์ฒ ์ˆ˜', age: 8, school: '๋‹ค๋žŒ์ฅ์ดˆ๋“ฑํ•™๊ต'}

// ๋ฐ์ดํ„ฐ ์žฌํ• ๋‹น
child2.name = "์˜ํฌ"

child1 // {name: '์˜ํฌ', age: 8, school: '๋‹ค๋žŒ์ฅ์ดˆ๋“ฑํ•™๊ต'}
child2 // {name: '์˜ํฌ', age: 8, school: '๋‹ค๋žŒ์ฅ์ดˆ๋“ฑํ•™๊ต'}

๊ฐ์ฒด์™€ ๋ฐฐ์—ด์€ ๋ฌธ์ž์—ด, ์ˆซ์ž, boolean ๊ฐ’๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ๊ฐ’ ์ž์ฒด๊ฐ€ ์•„๋‹Œ, ๊ฐ’์„ ๋‹ด๊ณ  ์žˆ๋Š” ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋œ๋‹ค๋Š” ํŠน์„ฑ์ด ์žˆ๋‹ค!

์›๋ณธ๊ณผ ๋ณต์‚ฌ๋ณธ์ด ๊ฐ๊ฐ ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, child2์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด child1์˜ ๊ฐ’๋„ ๊ฐ™์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์ด๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๊ฐ์ฒด์™€ ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์‚ฌ์‹ค ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค๋Š” ๊ฐœ๋…์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์›๋ณธ ๊ฐ์ฒด์™€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๋ฟ์ด๋‹ค!

// child3์— child2 ๋ณต์‚ฌ
let child3 = {
    name: child2.name,
    age: child2.age,
    school: child2.school
}

child3 // {name: '์˜ํฌ', age: 8, school: '๋‹ค๋žŒ์ฅ์ดˆ๋“ฑํ•™๊ต'}

// child3์˜ name ๋ณ€๊ฒฝ
child3.name = "ํ›ˆ์ด"

child3 // {name: 'ํ›ˆ์ด', age: 8, school: '๋‹ค๋žŒ์ฅ์ดˆ๋“ฑํ•™๊ต'}
child2 // {name: '์˜ํฌ', age: 8, school: '๋‹ค๋žŒ์ฅ์ดˆ๋“ฑํ•™๊ต'}

์œ„์™€ ๊ฐ™์ด child2์™€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๋Š” child3์ด๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ , child3์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด, child2์™€ child3์€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ฃผ์†Œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.


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


์œ„์—์„œ child2๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ child3์„ ๋งŒ๋“ค ๋•Œ์ฒ˜๋Ÿผ ์›๋ณธ child2์˜ ๋ชจ๋“  ๊ฐ’์„ ๋”ฐ๋กœ๋”ฐ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กœ์šด ๊ณผ์ •์ด๋‹ค. ๊ฐ์ฒด์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๊ทธ๋Ÿด ๊ฒƒ์ด๋‹ค. ์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž์ด๋‹ค. ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์จ์ค„ ์ˆ˜ ์žˆ๋‹ค.

let child3 = {
  name: child2.name,
  age: child2.age,
  school: child2.school
}

// ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž ์‚ฌ์šฉ!
let child3 = {...child2}

์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋ฉด, ๋ณต์‚ฌ๋ณธ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋„ ์›๋ณธ์˜ ๊ฐ’์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค!

let child4 = {
	...child2
}

child4 // {name: '์˜ํฌ', age: 8, school: '๋‹ค๋žŒ์ฅ์ดˆ๋“ฑํ•™๊ต'}

์ฆ‰ child4์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋„ child2์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.


profile2๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•ด์„œ profile1์˜ name ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋”๋‹ˆ, profile1์˜ name๋งŒ ๋ฐ”๋€Œ๊ณ , profile2์˜ name์€ ๊ทธ๋Œ€๋กœ์ด๋‹ค.

let profile1 = {
    name: "์ฒ ์ˆ˜",
    age: 8,
    school: "๊ณต๋ฃก์ดˆ๋“ฑํ•™๊ต",
    hobby: {
        first: "์ˆ˜์˜",
        second: "ํ”„๋กœ๊ทธ๋ž˜๋ฐ"
    }
}

let profile2 = {
    ...profile1
}

profile1.name = "์˜ํฌ"

profile1 
// {name: '์˜ํฌ', age: 8, school: '๊ณต๋ฃก์ดˆ๋“ฑํ•™๊ต', hobby: {โ€ฆ}}
profile2 
// {name: '์ฒ ์ˆ˜', age: 8, school: '๊ณต๋ฃก์ดˆ๋“ฑํ•™๊ต', hobby: {โ€ฆ}}

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ์ฒด ์•ˆ์— ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ(์ค‘์ฒฉ ๊ฐ์ฒด) ๋ณต์‚ฌ๊ฐ€ ์ž˜ ์ด๋ฃจ์–ด์งˆ๊นŒ?

์˜ํฌ์˜ ์ฒซ ๋ฒˆ์งธ ์ทจ๋ฏธ๋ฅผ ์ถ•๊ตฌ๋กœ ๋ฐ”๊ฟ”๋ณด์ž.

profile1.hobby.first = "์ถ•๊ตฌ"

profile1
// {name: "์˜ํฌ", age: 8, school: "๊ณต๋ฃก์ดˆ๋“ฑํ•™๊ต", 
// hobby: {
//   first: "์ถ•๊ตฌ", second: "ํ”„๋กœ๊ทธ๋ž˜๋ฐ"}
// }

profile2
// {name: "์ฒ ์ˆ˜", age: 8, school: "๊ณต๋ฃก์ดˆ๋“ฑํ•™๊ต",
//    hobby: {
//        first: "์ถ•๊ตฌ",
//        second: "ํ”„๋กœ๊ทธ๋ž˜๋ฐ"
//    }
// }

๋ถ„๋ช… ์˜ํฌ์˜ ์ฒซ ๋ฒˆ์งธ ์ทจ๋ฏธ๋งŒ ๋ณ€๊ฒฝํ–ˆ๋Š”๋ฐ ์ฒ ์ˆ˜์˜ ์ฒซ ๋ฒˆ์งธ ์ทจ๋ฏธ๊นŒ์ง€ ๋ฐ”๋€Œ์–ด๋ฒ„๋ ธ๋‹ค. hobby๋ผ๋Š” ๊ฐ์ฒด๋„ ์ฃผ์†Œ๋กœ ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค. profile1์˜ hobby ๊ฐ์ฒด์™€ profile2์˜ hobby ๊ฐ์ฒด๋Š” ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์„ ๋ฐ”๊พธ๋ฉด ๊ฐ™์ด ๋ฐ”๋€Œ์–ด๋ฒ„๋ฆฐ๋‹ค.

์ด์ฒ˜๋Ÿผ ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•œ ๋ณต์‚ฌ๋Š” ์–•์€ ๋ณต์‚ฌ(Shallow-Copy)๋ผ๊ณ  ํ•œ๋‹ค.


๊นŠ์€ ๋ณต์‚ฌ

๊ทธ๋ ‡๋‹ค๋ฉด ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž๋กœ ๋ณต์‚ฌํ•ด์ฃผ์ง€ ๋ชปํ•˜๋Š” ๋ถ€๋ถ„๊นŒ์ง€ ๋ณต์‚ฌํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ JSON.stringify๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค์–ด์ค€ ํ›„์—, ๋‹ค์‹œ JSON.parse๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค!



profile
Web FE ๊ฐœ๋ฐœ์ž ์ทจ์ค€์ƒ

0๊ฐœ์˜ ๋Œ“๊ธ€