๋ฆฌ์คํธ ๋ณต์ฌํ๊ธฐ
๋ณ์๋ ๊ฐ์ฒด๋ฅผ ๋ด๋ ๊ทธ๋ฆ์ด ์๋๋ผ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์ด๋ฆ์ ๋๋ค. ๋ฐ๋ผ์ ๋ณ์๋ฅผ ๋ค๋ฅธ ๋ณ์์ ๋์ ํ๋ฉด ๋ ๋ณ์๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค. ๋ค์ ๋งํด, ํ๋์ ๊ฐ์ฒด๋ฅผ ๋ ๊ฐ์ ์ด๋ฆ์ด ๊ฐ๋ฆฌํค๋ ๊ฒ์ด์ง ๊ฐ์ฒด ์์ฒด๊ฐ ๋ ๊ฐ๊ฐ ๋ ๊ฒ์ ์๋๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ถ๋ณํ ๊ฐ์ฒดimmutable object์์๋ ํ ๋ณ์์ ์ ๋ฐ์ดํฐ๋ฅผ ๋์ ํด๋ ๋ค๋ฅธ ๋ณ์์ ์ํฅ์ ๋ฏธ์น์ง ์์ง๋ง, ๋ฆฌ์คํธ ๊ฐ์ ๋ณํ ๊ฐ์ฒดmutable object์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ด๋ ์ฅ์ ์ด ๋๊ธฐ๋ ํ๊ณ , ๋จ์ ์ด ๋๊ธฐ๋ ํฉ๋๋ค. ์ฐ์ ์ฌ๊ธฐ๊น์ง ์ฝ๋๋ก ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
>>> mu_a = [2020, 'year']
>>> mu_b = mu_a
>>> mu_b.append(['hi', 'hello'])
>>> mu_a
[2020, 'year', ['hi', 'hello']]
์์ ๋ณต์ฌ
๋ฆฌ์คํธ๋ ๋ณํ ๊ฐ์ฒด์ด๋ฏ๋ก mu_b๋ฅผ ๋ฐ๊ฟ๋ mu_a๊น์ง ๋ฐ๋๋๋ค. mu_a๋ mu_b๋ ๊ฐ์ ๋ณํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ง๋ง ์ด๋ฐ ๋์์ ์ํ์ง ์์ ๋๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ ๊ฐ๋ก ๋ณต์ฌํ๊ณ , ์ด ๋์ ๊ฐ๊ฐ mu_a์ mu_b๊ฐ ๊ฐ๋ฆฌํค๊ฒ ํ ์๋ ์์๊น์? ๋ฐ๋ก ์ด๊ฒ์ด ์์ ๋ณต์ฌshallow copy์ ๊ฐ๋ ์ ๋๋ค. ๋ฆฌ์คํธ ๋ฉ์๋ ๊ฐ์ด๋ฐ copy()๊ฐ ์์ ๋ณต์ฌ๋ฅผ ์ํํฉ๋๋ค. ๋ค์ ์ฝ๋๋ฅผ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
>>> mu_a = [2020, ['hi', 'hello']]
>>> mu_b = mu_a.copy()
์ฌ๊ธฐ์ mu_a์ mu_b๋ ํ๋์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ ๊ฐ์ ์ด๋ฆ์ด ์๋๋๋ค. id() ๋๋ is ์ฐ์ฐ์๋ก ๋์ ๋น๊ตํ๋ฉด False๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
>>> mu_a is mu_b
False
ํ์ง๋ง ์์๋ค์ ์ ์ฒด์ฑ์ ๊ฐ์ต๋๋ค.
>>> mu_a[0] is mu_b[0]
True
>>> mu_a[1] is mu_b[1]
True
๊ทธ๋ฆฌ๊ณ mu_b๋ฅผ ๋ฐ๊พธ๋๋ผ๋ mu_a๋ ๊ทธ๋๋ก์ ๋๋ค. ๋ฐ๋ก ์ด๊ฒ์ด ์์ ๋ณต์ฌ์ ํน์ง์ ๋๋ค.
>>> mu_b.append('year')
>>> mu_b
[2020, ['hi', 'hello'], 'year']
>>> mu_a
[2020, ['hi', 'hello']]
์์ ๋ณต์ฌ์๋ ํ ๊ฐ์ง ํ์ ์ด ์์ต๋๋ค. ์์ ์์ฒด์ ์ ์ฒด์ฑ์ด ๊ฐ๊ธฐ ๋๋ฌธ์ ์์๊ฐ ๋ณํ ๊ฐ์ฒด์ด๋ฉด ๋ณํ ๊ฐ์ฒด์ ํน์ฑ์ ๋ฐ๋ฅธ๋ค๋ ๊ฒ์ ๋๋ค. ๋ค์ ์ฝ๋๋ฅผ ๋ณผ๊น์?
>>> mu_b[1][1] = 'bye'
>>> mu_b
[2020, ['hi', 'bye'], 'year']
>>> mu_a
[2020, ['hi', 'bye']]
mu_b[1]์ด ๋ฆฌ์คํธ๋ผ์ ๋ณํ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ mu_b[1][1]์ ๋ฐ๊พธ์์ง๋ง mu_a[1][1]๋ ๋ฐ๋ ๊ฒ๋๋ค.
๊น์ ๋ณต์ฌ
์ด๋ฅผ ๋ณด์ํ ๋ณต์ฌ๊ฐ ๊น์ ๋ณต์ฌdeep copy์ ๋๋ค. ๊น์ ๋ณต์ฌ๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ ๋ ๋ณํ์ฑ์ ๋ฐ์ง๋๋ค. ๋ถ๋ณํ ๊ฐ์ฒด๋ ์ ์ฒด์ฑ์ ๊ทธ๋๋ก ๊ฐ์ ธ์ค๊ณ , ๋ณํ ๊ฐ์ฒด๋ ์ ์์น์ ์๋ก ๋ง๋๋ ๊ฑฐ์ฃ . ๋ฐ๋ผ์ ์ด๋ ํ์ชฝ์ ์์ ํ๋๋ผ๋ ๋ค๋ฅธ ํ๋์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ํ์ด์ฌ์์ ๊น์ ๋ณต์ฌ๋ copy ๋ชจ๋์ deepcopy()๊ฐ ๋ด๋นํฉ๋๋ค.
>>> import copy
>>> mu_a = [2020, ['hi', 'hello']]
>>> mu_b = copy.deepcopy(mu_a)
>>> mu_a is mu_b
False
>>> mu_a[0] is mu_b[0]
True
>>> mu_a[1] is mu_b[1]
False
๋ถ๋ณํ ๊ฐ์ฒด๋ ๋ณํ๋ ์ ์์ผ๋ ์ ์ฒด์ฑ์ ๊ทธ๋๋ก ๊ฐ์ ธ์๊ณ , ๋ณํ ๊ฐ์ฒด๋ ๋ฏธ์ฐ์ ์ฌ๊ณ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์๋ก ๋ง๋ค์ด์ก์ต๋๋ค. ๋ค์ ์ฝ๋๋ฅผ ํ์ธํด ๋ณด์ธ์.
>>> mu_b[1][1] = 'bye'
>>> mu_b
[2020, ['hi', 'bye']]
>>> mu_a
[2020, ['hi', 'hello']]
์ด๋ ๋ฏ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ ๋๋ ๊น์ ๋ณต์ฌ๋ฅผ ์ํํด์ผ ํ์ค ์ธ๊ณ์ ๋ณต์ฌ์ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ผ ์ ์์ต๋๋ค. ํ์ง๋ง ์ธ์ ๋ชจ๋ ๊ฒ์๋ ์ฅ์ ์ด ์์ผ๋ฉด ๋จ์ ๋ ์๋ ๋ฒ, ๊น์ ๋ณต์ฌ์๋ ๋จ์ ์ด ์์ต๋๋ค. ๋ฐ๋ก ๋น์ธ๊ณ ๋๋ฆฌ๋ค๋ ๊ฒ๋๋ค. ๋น์ธ๋ค๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ์์์ ๋ง์ด ์๋นํ๋ค๋ ๋ป์ ๋๋ค. ๋ฌผ๋ก ๋๋ฆฌ๋ค๋ ๊ฒ์ ์์ ๋ณต์ฌ์ ๋นํด ๊ทธ๋ ๋ค๋ ๊ฑฐ์ฃ .
๋ง์ง๋ง์ผ๋ก ํ๋ง๋ ๋ง๋ถ์ด์๋ฉด, ํ์ด์ฌ์๋ ์์ ๋ณต์ฌ๋ฅผ ์ํํ๋ ํจ์๊ฐ ๋ณ๋๋ก ์ ๊ณต๋ฉ๋๋ค. ๋์น์ฑ์์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง copy ๋ชจ๋์ copy()์ ๋๋ค. list ๋ชจ๋์ copy()๋ ๋ง ๊ทธ๋๋ก ๋ฆฌ์คํธ์๋ง ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋์ง๋ง, copy ๋ชจ๋์ copy()์ deepcopy()๋ ๊ฐ์ฒด์ ์ฌ์ฉํ ์ ์๋ ํจ์์ ๋๋ค.
'...' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS]์๋ฐ์คํฌ๋ฆฝํธ ๋์์ ์ผ์์ผ์ฒด! - V8, Web API, Event Loop (7) | 2021.05.03 |
---|---|
[OS] ๋ ์ด์ ์ด๋ฒ๋ฒํ์ง๋ง์!! ์ค๋ ๋์ ํ๋ก์ธ์ค (13) | 2021.04.26 |
[Node.js] uuid ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ๋ฐ ์ฌ์ฉํ๊ธฐ (0) | 2021.04.12 |
Node.js์ ๊ดํ 10๊ฐ์ง ํํ - ๋ผ์ด์ธ ๋ฌ๊ณผ Deno.js (8) | 2021.04.11 |
[JavaScript] ๊ธฐ๋ค๋ ค! ๋จน์ด! async/await ์ดํดํ๊ธฐ (6) | 2021.03.28 |