λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄/Python

Mutable과 Immutable 객체

by μ„œμ•„λž‘πŸ˜ 2024. 4. 29.

 

νŒŒμ΄μ¬μ—μ„œ λ³€μˆ˜λŠ” 두 가지 νƒ€μž…μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€: mutable(κ°€λ³€)κ³Ό immutable(λΆˆλ³€)μž…λ‹ˆλ‹€. 이 λ‘˜μ€ λ³€μˆ˜κ°€ λ³€κ²½ κ°€λŠ₯ν•œμ§€ 여뢀에 따라 κ΅¬λΆ„λ©λ‹ˆλ‹€.

Immutable 객체

  • Immutable κ°μ²΄λŠ” ν•œ 번 μƒμ„±λ˜λ©΄ 값을 λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€. 즉, λ³€μˆ˜κ°€ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλœ ν›„μ—λŠ” κ·Έ 값을 λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • μ£Όμš” immutable 데이터 νƒ€μž…μœΌλ‘œλŠ” int(μ •μˆ˜), float(뢀동 μ†Œμˆ˜μ  수), str(λ¬Έμžμ—΄), tuple(νŠœν”Œ) 등이 μžˆμŠ΅λ‹ˆλ‹€.
x = 5  # int λ³€μˆ˜λŠ” immutable
y = "Hello"  # str λ³€μˆ˜λ„ immutable

# 값을 λ³€κ²½ν•˜λ €κ³  ν•˜λ©΄ μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.
x = x + 1  # x 값을 λ³€κ²½ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μƒˆλ‘œμš΄ 값이 ν• λ‹Ήλ©λ‹ˆλ‹€.
y[0] = 'h'  # λ¬Έμžμ—΄μ€ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • immutable 객체인 νŠœν”Œμ€ μ €μž₯된 값을 μˆ˜μ •ν–ˆμ„ λ•Œ μƒˆλ‘œμš΄ νŠœν”Œμ΄ λ§Œλ“€μ–΄μ§€λŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.(객체의 μ£Όμ†Œκ°€ μƒˆλ‘­κ²Œ 할당됨)
  • λ”°λΌμ„œ immutable κ°μ²΄λŠ” λ³€κ²½ λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— call by reference의 output이 될 수 μ—†μŠ΅λ‹ˆλ‹€.
  • μƒˆλ‘­κ²Œ λ§Œλ“  객체λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ‘œ λŒ€μ²΄ν•©μ‹œλ‹€.

 

Mutable 객체

  • Mutable κ°μ²΄λŠ” 값을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 즉, λ³€μˆ˜κ°€ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλœ 후에도 값을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ£Όμš” mutable 데이터 νƒ€μž…μœΌλ‘œλŠ” list(리슀트), dict(사전), set(집합) 등이 μžˆμŠ΅λ‹ˆλ‹€.
a = [1, 2, 3]  # λ¦¬μŠ€νŠΈλŠ” mutable
b = {'name': 'John', 'age': 30}  # 사전도 mutable

# 값을 λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
a[0] = 100  # 리슀트 λ‚΄μ˜ κ°’ λ³€κ²½
b['age'] = 31  # 사전 λ‚΄μ˜ κ°’ λ³€κ²½
  • μˆ˜μ • κ°€λŠ₯ν•œ κ°μ²΄λŠ” idκ°€ λ°”λ€Œμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • mutable κ°μ²΄λŠ” 레퍼런슀λ₯Ό ν†΅ν•œ κ°’ 변경을 ν—ˆμš©ν•˜κΈ° λ•Œλ¬Έμ— Call by reference에 μ˜ν•œ κ°’ 변경이 κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

μ΄λŸ¬ν•œ 차이둜 인해 ν”„λ‘œκ·Έλž˜λ°ν•  λ•Œ λ³€μˆ˜μ˜ νƒ€μž…μ„ κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€. Immutable λ³€μˆ˜λŠ” 값이 λ³€ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ•ˆμ •μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Mutable λ³€μˆ˜λŠ” 동적인 데이터λ₯Ό μ²˜λ¦¬ν•  λ•Œ μœ μš©ν•˜μ§€λ§Œ, 값이 자주 λ³€κ²½λ˜λ―€λ‘œ μ‹ μ€‘ν•˜κ²Œ 닀루어야 ν•©λ‹ˆλ‹€.

ν•¨μˆ˜λ₯Ό 잘 μ •μ˜ν•˜λ €λ©΄ 파이썬 λ‚΄μ—μ„œ μ°Έμ‘°ν•˜λŠ” 객체의 성격을 κ΅¬λΆ„ν•΄μ„œ ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄μ•Όλ§Œ ν•©λ‹ˆλ‹€.

 

λŒ“κΈ€