๐Ÿ“ฆ ์•Œ์“ธ์‹ ํŒŒ: ํŒŒ์ด์„ ์˜ ๋ณ€์ˆ˜

๋ฐฐ์ฃผ์›…ยท2020๋…„ 1์›” 5์ผ
0

๐Ÿค”์•Œ์“ธ์‹ ํŒŒ

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

๋งค๋…„ ์ƒˆํ•ด ๋ชฉํ‘œ๋กœ ๋ธ”๋กœ๊ทธ ๊ธ€ ์ž‘์„ฑํ•˜๊ธฐ๋ฅผ ๋ชฉํ‘œ๋กœ ์žก๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์„ฑ๊ฒฉ์ƒ ๋ธ”๋กœ๊ทธ ๊ธ€์— ๋งŽ์€ ์ •๋ณด๋ฅผ ์ ์–ด์•ผ ํ–ˆ๊ณ , ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ธ”๋กœ๊ทธ ๊ธ€ ์“ฐ๊ธฐ๋Š” ๋งค์šฐ ๋ฌด๊ฑฐ์šด ํƒœ์Šคํฌ๋กœ ์ž๋ฆฌ์žก์•˜๋‹ค. ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ธ‰ํ•œ ์ผ์ด๋‚˜ ํ”ผ๊ณคํ•œ ์ƒํ™ฉ์ด ์ƒ๊ธฐ๋ฉด ๋ธ”๋กœ๊ทธ ๊ธ€ ์“ฐ๊ธฐ๋Š” ๋’ท์ „์œผ๋กœ ๋ฏธ๋ค„์ง€๊ณค ํ–ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์˜ฌํ•ด ๋ชฉํ‘œ์ค‘ ํ•˜๋‚˜์ธ ๋งค ์ฃผ ํ•˜๋‚˜์˜ ๋ธ”๋กœ๊ทธ ๊ธ€ ์“ฐ๊ธฐ์—๋Š”, ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋งˆ์ฃผ์น˜๋Š” ๊ถ๊ธˆ์ฆ์„ ๊พธ์ค€ํžˆ ๋ธ”๋กœ๊ทธ์— ๋‚จ๊ฒจ ๋ณด์ž! ๋ผ๋Š” ์ˆจ์€ ๋ชฉํ‘œ๊ฐ€ ํ•˜๋‚˜ ๋” ์ˆจ์–ด ์žˆ๋‹ค. ๋˜ ๊ทธ๋Ÿฌ๋ฉด์„œ ๋‚ด๊ฐ€ ๋จธ๋ฆฌ์†์—๋งŒ ๋‹ด๋˜ ์ง€์‹์„ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋ ค๋Š” ๊ฒƒ๋„ ์žˆ๋‹ค.


์ด๋ฒˆ์ฃผ ์•Œ์“ธ์‹ ํŒŒ๋Š” ํŒŒ์ด์„ ์˜ ๋ณ€์ˆ˜์™€ ๋ฉ”๋ชจ๋ฆฌ์— ๊ด€ํ•œ ์ด์•ผ๊ธฐ์ด๋‹ค. ์ „๋ฌธ๊ฐ€๋ฅผ ์œ„ํ•œ ํŒŒ์ด์„  ์Šคํ„ฐ๋””๋ฅผ ์ค€๋น„ํ•˜๋ฉด์„œ ํฅ๋ฏธ๋กœ์› ๋˜ ๋‚ด์šฉ์„ ์ ๋Š”๋‹ค. ์–ธ๊ธ‰ํ•  ๋‚ด์šฉ์ค‘ ์ผ๋ถ€๋Š” ์ „๋ฌธ๊ฐ€๋ฅผ ์œ„ํ•œ ํŒŒ์ด์„ ์—์„œ ๊ฐ€์ ธ์™€ ๋ณด์•˜๋‹ค.

ํŒŒ์ด์„  ๋ณ€์ˆ˜ ํ• ๋‹น์€, ์ƒ์ž์— ๋‹ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค

๋Œ€๋ถ€๋ถ„ ์šฐ๋ฆฌ๋Š” ๋ณ€์ˆ˜ ๊ฐœ๋…์„ ๋ฐฐ์šธ ๋•Œ, ํŠน์ • ์ƒ์ž์— ๋ฌผ๊ฑด์„ ๋‹ด๋Š” ๊ทธ๋ฆผ์„ ๋– ์˜ฌ๋ฆฌ๊ฒŒ ๋ฐฐ์šด๋‹ค. ๊ฐ’์„ ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ์ž๊ฐ€ ๋ฐ”๋กœ ๋ณ€์ˆ˜์ด๋ฉฐ, ์ƒ์ž ์•ˆ์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๋ฌผ๊ฑด์ด ๋ณ€์ˆ˜ ์•ˆ์— ์žˆ๋Š” ๊ฐ’์ด๋ผ๊ณ  ๋ฐฐ์šด๋‹ค.

ํŒŒ์ด์„ ์˜ ๋ณ€์ˆ˜ ํ• ๋‹น์€ ์•ฝ๊ฐ„ ๋Š๋‚Œ์ด ๋‹ค๋ฅด๋‹ค. ๊ฐ์ฒด๊ฐ€ ์šฐ์„  ์ƒ์„ฑ๋˜๋ฉฐ, ๊ทธ ๊ฐ์ฒด์— ๋ณ€์ˆ˜๊ฐ€ ๋ณ„๋ช…์ฒ˜๋Ÿผ ๋ถ™๋Š”๋‹ค. ์ฒ˜์Œ ๋ณด๋ฉด ์œผ์ž‰? ๋ฌด์Šจ ์†Œ๋ฆฌ์ง€? ์‹ถ๋‹ค. ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด, ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ ์™€ ๋ณด์•˜๋‹ค.

>>> class A:
...  	def __init__(self):
...      	print(f"A id: {id(self)}")
>>> x = A()
A id: 4519628752
>>> y = A() * 10
A id: 4519649488
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for *: 'A' and 'int'
    

๋‹น์—ฐํžˆ ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค. ํ•˜์ง€๋งŒ ์œ ์‹ฌํžˆ ์˜ค๋ฅ˜์˜ ์ˆœ์„œ๋ฅผ ๋ณด์ž. ์šฐ์„  A ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๊ทธ ์ดํ›„, A ๊ฐ์ฒด์— __mul__ ๋ฉ”์†Œ๋“œ๊ฐ€ ์—†๋‹ค๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋‚ด๋Š” ์ค‘์ด๋‹ค. ์ฆ‰, ๋จผ์ € ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ ๋œ ์ดํ›„์— ์ง€์ •ํ•œ ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์ด ์ด๋ฆ„ํ‘œ์ฒ˜๋Ÿผ ๊ฐ์ฒด์— ๋ถ™๊ฒŒ ๋œ๋‹ค. ์ด๊ฒƒ์ด ํŒŒ์ด์„ ์—์„œ ์˜๋ฏธํ•˜๋Š” ๋ณ€์ˆ˜์˜ ์„ ์–ธ์ด๋‹ค.

Python์˜ ๊ธฐ๋ณธ copy๋Š” shallow copy

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ด์„ ์—์„œ ํŠน์ • ๋ณ€์ˆ˜์— ๊ธฐ์กด์— ์žˆ๋˜ ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ์—๋Š” ์–•์€ ๋ณต์‚ฌ (Shallow copy)๊ฐ€ ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค. ์ƒˆ๋กœ์šด ์ƒ์ž์— ๊ฐ’์„ ๋‹ด๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๊ธฐ์กด์— ์žˆ๋˜ ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด ์ด๋ฆ„ํ‘œ๋ฅผ ๋ถ™ํžˆ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

>>> x = A()
A id: 4519649744
>>> y = x
>>> id(y)
4519649744
>>> x is y 
True

ํŒŒ์ด์„ ์—์„œ is ์—ฐ์‚ฐ์ž๋Š”, ๋‘ ๋ณ€์ˆ˜์˜ id ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ ํŒŒ์ด์„  ๊ตฌํ˜„์ฒด๋งˆ๋‹ค id์˜ ์ •์˜๊ฐ€ ๋‹ค๋ฅด์ง€๋งŒ, ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” cpython์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์œ„์น˜์™€ id์˜ ๊ฐ’์ด ๋™์ผํ•˜๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ด์„  ๋‚ด๋ถ€์—์„œ ์ „์—ญ์œผ๋กœ ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ์ฒด (์˜ˆ: True, False, None)์™€ ๊ฐ’์„ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” is ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•˜๊ณ  ์žˆ๋‹ค.

์ด๋ฅผ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฐ”๋กœ ํ•˜๋‚˜์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด ์ค€ ํ›„, ์ƒˆ ๋ณ€์ˆ˜์— append ํ•จ์ˆ˜๋ฅผ ๋ถ™ํ˜€๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

>>> x = [1, 2, 3]
>>> y = x
>>> y.append(4)
>>> x
[1, 2, 3, 4]

ํŒŒ์ด์„ ์˜ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ

์ด ํƒ€๋ž˜๋Š” ํ•˜๋‚˜์˜ ๊ธ€์— ๋”ฐ๋กœ ํ’€์–ด๋‚˜๊ฐ€๋ ค๊ณ  ํ•˜์ง€๋งŒ, ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ์–ด๋ณด๋ ค ํ•œ๋‹ค.
ํŒŒ์ด์„ ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ํ•ด์ œํ•˜๋Š” ๋ช…๋ น์–ด๋กœ del์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณค ํ•˜์ง€๋งŒ, ์ •ํ™•ํžˆ๋Š”
ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ„๋ช…์„ ์ œ๊ฑฐ ํ•ด์ฃผ๋Š” ๋ช…๋ น์— ๊ฐ€๊น๋‹ค.


ํ‰์†Œ์ฒ˜๋Ÿผ ๊ธ€์— ํž˜์„ ์ฃผ์ง€ ์•Š์•„์„œ ์ด์ •๋„๋กœ๋„ ๊ดœ์ฐฎ์„๊นŒ ์‹ถ์ง€๋งŒ. ์šฐ์„  ์ฒซ ๊ธ€์€ ๊ฐ€๋ณ๊ฒŒ ๊ฐ€๋ณ๊ฒŒ ๐Ÿ™‚

profile
๊ณต๋ถ€ํ•˜์ž ๋จน๊ณ ์‚ด์ž ์˜ค๋Š˜๋„ ๋ฐฉ์‹ค๋ฐฉ์‹ค ๋ฐ์€ ๋Œ€ํ•œ๋ฏผ๊ตญ์˜ ํ•˜๋Š˜

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