September 19, 2020
์๋ฐ์คํฌ๋ฆฝํธ Koans ๊ณผ์ ๋ฅผ ๋ค์ ์ฒ์ฒํ ํ๋ฉฐ ์ฝ์ด๋ณด๋ค๊ฐ 07๋ฒ ์ฃผ์ object ๋งจ ์๋์ ์๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ ์์ค์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค.
it('Object๋ฅผ ํจ์์ ์ธ์๋ก ์ ๋ฌํ ๊ฒฝ์ฐ, reference๊ฐ ์ ๋ฌ๋ฉ๋๋ค.', function() {
const obj = {
mastermind: 'Joker',
henchwoman: 'Harley',
relations: ['Anarky', 'Duela Dent', 'Lucy'],
twins: {
'Jared Leto': 'Suicide Squad',
'Joaquin Phoenix': 'Joker',
'Heath Ledger': 'The Dark Knight',
'Jack Nicholson': 'Tim Burton Batman',
},
}
function passedByReference(refObj) {
refObj.henchwoman = 'Adam West'
}
passedByReference(obj)
expect(obj.henchwoman).toBe('Adam West')
const assignedObj = obj
assignedObj['relations'] = [1, 2, 3]
expect(obj['relations']).toEqual([1, 2, 3])
const copiedObj = Object.assign({}, obj) // Object.assign(target, source);
copiedObj.mastermind = 'James Wood'
expect(obj.mastermind).toBe('Joker')
obj.henchwoman = 'Harley'
expect(copiedObj.henchwoman).toBe('Adam West')
delete obj.twins['Jared Leto']
expect('Jared Leto' in copiedObj.twins).toBe(false)
})
์ฝ๋ ๋งจ ์๋์ toBe ๋์ true ๋ก ์ ์๋๋ฐ false ๊ฐ ๋ง๋ค๋ ๊ฒ์ ๋์ ํ ๋ฉ๋์ด ์๋๋ค๋ ๊ฒ์ด ๋ฌธ์ ์๋ค.
delete obj.twins['Jared Leto']
expect('Jared Leto' in copiedObj.twins).toBe(false)
์๋ฌด๋ฆฌ ์๊ฐํด๋ ๋ฏฟ๊ธฐ์ง ์์์ ์ฝ์๋ก๋ ์ฐ์ด์ ์คํํด ๋ดค๋๋ฐ ๋ง์ฐฌ๊ฐ์ง๋ค. ์์ผ๊น?
์ด ๋ฌธ์ ์์ ๋ด๊ฐ ์ดํดํ๊ณ ์๋ ๋ถ๋ถ์ const copiedObj = Object.assign({}, obj) ์ ํตํด ๋ณต์ฌ๋ copiedObj ๋ณ์๋, obj ๋ณ์์๋ ๋ค๋ฅธ ์ฃผ์์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด ๋ผ๊ณ ์ดํดํ๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์, copiedObj.mastermind = โJames Woodโ; ๋ฅผ ํตํด copiedObj ์ ํค mastermind ์ ๊ฐ์ด โJames Woodโ ๋ก ๋ฐ๋์ด๋, obj ๋ณ์์ ํค mastermind ๋ ์ฌ์ ํ โJokerโ ์ธ ๊ฒ์ด๋ค.
์ฆ ๋ ๋ณ์๋ ์๋ก ์๊ด์ด ์๋ ๊ฒ์ธ๋ฐ,
ํ์ง๋ง, delete obj.twins[โJared Letoโ]; ๋ฅผ ํตํด obj ๊ฐ์ฒด ๋ด ๋ญ๊ฐ ์ง์์ก๋ค ํ๋๋ผ๋, copiedObj ๋ณ์์๋ ์ ํ ์ํฅ์ ์ฃผ์ง ์๋ ๊ฑฐ ์ผํ ๋ฐ ์ฝ์์ ์ง์ ์ฐ์ด๋ณด๋ copiedObj ์ ๊ฐ์ฒด์์๋ copiedObj.twins[โJared Letoโ] ๊ฐ ์ง์์ก๋ค๋ ๊ฒ์ด ๋ฉ๋์ด ์๋๋ ๊ฒ์ด์๋ค.
๊ทธ๋์ ํฌํ ๋ฐ์คํฌ์ ์ง๋ฌธ์ ํ๋ค.
์ ์๋๊ป์๋ ๊น์ ๋ณต์ฌ์ ์์ ๋ณต์ฌ๋ฅผ ํค์๋๋ก ๊ฒ์ํด์ ๊ณต๋ถํด ๋ณด๋ผ ํ์ จ๋ค.
๊ทธ๋์ ํค์๋ ๊ฒ์์ ํด๋ณด๋, ์ฌ๋ฌ ํ์ด์ง์์ ํ์ธํด ๋ณด์๋๋ฐ ์ค๋ช ์ด ๋๋ฌด ์ด๋ ค์ ์ฝ๋ค๊ฐ ๊ป๋ค.
์ ์ฌ์ดํธ์์ ์์ ๋ณต์ฌ์ ๊น์ ๋ณต์ฌ์ ์๋ฏธ๋ฅผ ์งง๊ฒ ๋ค๋ฃจ๋ ๋ฌธ์ฅ์ ๊ทธ๋๋ก ์ฎ๊ฒจ ์๋ค.
์์ ๋ณต์ฌ๋, ๊ฐ์ฒด์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ๋ง ๋ณต์ฌํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
Object์ ๋ด์ฅ๊ฐ์ฒด์ธ assign() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํฉ๋๋ค.
๊น์ ๋ณต์ฌ๋, nestedํ ๊ฐ์ฒด์ ๋ชจ๋ ํ์ ๊ฐ์ฒด๊น์ง ๋ณต์ฌํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
JSON.parse()์ JSON.stringify() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํฉ๋๋ค.
์์ ๋ณต์ฌ ์ชฝ ๋ฌธ์ฅ์ ์ฝ๋ค๊ฐ assign() ํจ์๋ฅผ ๋ณด๊ณ ์๊น ๊ฐ์ ๋ณต์ฌํด ์ฃผ๋ ๋ฐ ์ผ๋,
๋ฅผ ๋ ์ฌ๋ฆฌ๊ณ ์ดํดํด ๋ณด๊ธฐ ์ํด ์ฝ์ ์ฐฝ์ ์ด์ด ๋ค์ ์ ๋ ฅํด๋ณด๊ธฐ ์์ํ๋ค.
ํฌํ ๋ฐ์คํฌ์ ๊ณ ๋ฏผ์ ํ๋ฉด์ ๋จ๊ธด ๊ธ์ ๊ทธ๋๋ก ์ฎ๊ฒจ์๋ ์ข์ ๊ฑฐ ๊ฐ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ค๋ธ์ ํธํ(๋ฐฐ์ด, ๊ฐ์ฒด, ํจ์) ์ ์์์ ๋ณ์์ ํ ๋นํ๋ฉด, ๋ฉ๋ชจ๋ฆฌ ์์ ์ด๋ค ๋ฐฐ์ด์ ์ฃผ์๋ฅผ ๋ณ์๊ฐ ๋ฐ๋ผ๋ณด๊ณ ์์ผ๋ฏ๋ก ๋ณ์์ ์ค๋ธ์ ํธํ์ ํ ๋นํ ๋ค๋ ๊ฒ ์์ฒด๊ฐ ํด๋น ์ค๋ธ์ ํธ์ ์ฃผ์๋ฅผ ํ ๋น ํ๋ค ๋ผ๊ณ ์ดํดํ๊ณ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ฝ,
const obj1 = {key:'value', key2:'value2};
const obj2 = obj;
๊ณผ ๊ฐ์ ํํ๋ก ์ ์ธ์ ํ๋ฉด ๋ณ์ obj1 ํ๊ณ obj2 ๊ฐ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ์์ ์ฃผ์๋ฅผ ์ฐธ์กฐ (ref) ํ๋ค๊ณ ๋ฐฐ์ ์ต๋๋ค.
๋์ ์ด๋ ๊ฒ ๋๋ฉด obj2 ์ ํค๊ฐ์ ์์ ํ๋ฉด obj1 ๋ ๋์ผ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก obj1 ๋ obj2 ์ ์์ ์ฌํญ ๋๋ก ๋ฐ๋๊ฒ ๋ฉ๋๋ค.
์๋ง ๋์ค์ ๊ฐ๋ฐ์๊ฐ ๋์์ ๋, ์๋ณธ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ๋ณ์์ ๊ทธ ๋ณ์์ ๋๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ณ๋๋ก ๋์ด์ ๊ด๋ฆฌํ๊ณ ์์ ์ ํด์ผ ์๋ณธ์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฏ๋ก, ์๋ฐ์คํฌ๋ฆฝํธ์ ์ค๋ธ์ ํธ ์๋ฃํ์ ์ํด์ ๋ณต์ฌ ๋ผ๋ ๊ฐ๋ ์ ๋์ ํ๊ฒ ๋์ง ์์๋ ํฉ๋๋ค.
๊ฐ์ฒด ์๋ฃํ์์์ ๋ณต์ฌ๋ Object.assign({}, obj); ์ ์ด์ฉํ๋๋ฐ, ์ด๊ฒ์ด ์์ ๋ณต์ฌ์ธ ์ด์ ๋ ๊ทธ ๊ฐ์ฒด ๋ด ํค:๊ฐ ์ 1๋จ๊ณ ํํ๋ง์ ๋ณต์ฌํด ์ค๊ธฐ ๋๋ฌธ์ด๋ผ๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
์ฝ์๋ก ์ง์ ์ด๋ป๊ฒ ๋์ค๋์ง ํ์ธํด ๋ณด์์ต๋๋ค.
const obj = {
mastermind: 'Joker',
henchwoman: 'Harley',
relations: ['Anarky', 'Duela Dent', 'Lucy'],
twins: {
'Jared Leto': 'Suicide Squad',
'Joaquin Phoenix': 'Joker',
'Heath Ledger': 'The Dark Knight',
'Jack Nicholson': 'Tim Burton Batman',
},
};
const copiedObj = Object.assign({}, obj);
copiedObj.mastermind = 'James Wood';
copiedObj
{mastermind: "James Wood", henchwoman: "Harley", relations: Array(3), twins: {โฆ}}
obj
{mastermind: "Joker", henchwoman: "Harley", relations: Array(3), twins: {โฆ}}
obj.henchwoman = 'codestates';
obj
{mastermind: "Joker", henchwoman: "codestates", relations: Array(3), twins: {โฆ}}
copiedObj
{mastermind: "James Wood", henchwoman: "Harley", relations: Array(3), twins: {โฆ}}
copiedObj.relations = ['tiger','lion','bear'];
copiedObj.relations
(3) ["tiger", "lion", "bear"]
obj.relations
(3) ["Anarky", "Duela Dent", "Lucy"]
์ด๋ ๋ฏ ๋ณต์ฌ๊ฐ ์ ์ด๋ฃจ์ด์ ธ์ ๋ณ์ copiedObj ๊ฐ ๋ฌด์์ ์์ ํด๋ ์๋ณธ์ธ ๋ณ์ obj ์ ์๋ฌด ์ํฅ์ ์์ฃผ๊ณ ๋ณ์ ์ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์์ง์ด๋ ๊ฑฐ ์ฒ๋ผ ๋ณด์ ๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ฐ๋ก ์๋ ์ฝ๋๋ฅผ ์คํํ๋ฉด,
obj.twins["Heath Ledger"] = "Code Knight";
"Code Knight"
obj.twins
{Jared Leto: "Suicide Squad", Joaquin Phoenix: "Joker", Heath Ledger: "Code Knight", Jack Nicholson: "Tim Burton Batman"}
copiedObj.twins
{Jared Leto: "Suicide Squad", Joaquin Phoenix: "Joker", Heath Ledger: "Code Knight", Jack Nicholson: "Tim Burton Batman"}
์์ ๋ณต์ฌ์ ์๋ฏธ๋ฅผ ์ด๋ ดํ์ด ์ดํดํ ๋ฐ๋ก๋ ์ด๋ค ๊ฐ์ฒด๋ฅผ Object.assign({}, obj); ๋ก ๋ณต์ฌํ๋ฉด ๊ฐ์ฒด์ 1๋จ๊ณ ํํ์์๋ ๋ณต์ฌ๊ฐ ์ผ์ด๋์ง๋ง,
๊ฐ์ฒด์ 2๋จ๊ณ ๊ทธ๋ฌ๋๊น ๊ฐ์ฒด์ ํค ๋ฐธ๋ฅ๊ฐ ๋ ๊ฐ์ฒด์ผ๋,
2๋จ๊ณ ๊ฐ์ฒด์ ๊ฐ์ ๋ณต์ฌ๊ฐ ์ผ์ด๋์ง ์๊ณ 2๋จ๊ณ ๋ด์์๋ obj, copiedObj ๋ณ์๊ฐ ๋์ผํ ์ฃผ์๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ๋๋ค๊ณ ํฉ๋๋ค.
์ฝ๊ฒ ๋งํ๋ฉด ๊ฐ์ฒด ๋ด ํค ๋ฐธ๋ฅ์ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด ๊ทธ 2๋จ๊ณ ๊ฐ์ฒด ๋ฐ๊นฅ ๊ป๋ฐ๊ธฐ๋ง ๋ณต์ฌ๊ฐ ๋๋ค ์ด๋ ๊ฒ ์๊ฐํ๋ฉด ๋ ๊ฑฐ ๊ฐ์ต๋๋ค.
์ฌํผ ๊ทธ๋์ obj ์ 2๋จ๊ณ์ (2๋จ๊ฐ์ฒด?!) ํค๋ฐธ๋ฅ์ ์ ๊ทผํด ์์ ์ ํ๋ฉด ๊ทธ 2๋จ๊ณ ์์์ ๋งํผ์ ๋์ผํ ์ฃผ์๋ฅผ ๋ฐ๋ผ๋ณด๋ฏ๋ก copiedObj ๋ ๋๊ฐ์ด ๋ฐ๋์ด ๋ฒ๋ฆฐ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค.
์์ ํ ๋ณต์ฌ๊ฐ ์ผ์ด๋์ง ์์ ๋ง๊ทธ๋๋ก โ์์ ๋ณต์ฌโ ์ธ ์ฉ์ด๊ฐ ์ดํด๊ฐ ๋์์ต๋๋ค.
๊น์ ๋ณต์ฌ๋ฅผ ํ๋ ค๋ฉด.
๊น์ ๋ณต์ฌ๋, nestedํ ๊ฐ์ฒด์ ๋ชจ๋ ํ์ ๊ฐ์ฒด๊น์ง ๋ณต์ฌํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
JSON.parse()์ JSON.stringify() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํฉ๋๋ค
๊น์ ๋ณต์ฌ๋ ์๋ํด ๋ณด์ง ์์์ง๋ง ์์ ๋ณต์ฌ์ ๋ํด ์ผ๋ง ์ ๋ ์ดํด๊ฐ ๋์์ต๋๋ค. ๊ทธ๋ ๋ค๋ ๊ฒ์ ํ์ ์ ๊ฐ๋ฉด์ ์์ ๋ณต์ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ๊ฐ๊ธ์ ํผํด์ผ ๊ฒ ๋ค๋ ๋ง๋ ๋๊ฒ ๋ค์.
๊ฐ์ฌํฉ๋๋ค.
์์ ๋ณต์ฌ์ ๋ํด ์ด๋ ์ ๋ ์ดํดํ ์ ์์ด ์ข์๋ค.