Python์ ์ฝํ ์ฐธ์กฐ๋ฅผ ํ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์ํ ์ฐธ์กฐ๋ฅผ ํด๊ฒฐํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ฑ์ ๋์ ๋๋ค. ์ค์ฉ์ ์ธ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์์๋ณด์ธ์.
Python ์ฝํ ์ฐธ์กฐ: ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ง์คํฐํ๊ธฐ
Python์ ์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๊ฐ๋ฐ์๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋๋ค. ๊ทธ๋ฌ๋ ํนํ ์ํ ์ฐธ์กฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋ฏธ๋ฌํ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด ๊ธฐ์ฌ์์๋ Python์ ์ฝํ ์ฐธ์กฐ ๊ฐ๋ ์ ์์ธํ ์ดํด๋ณด๊ณ , ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง ๋ฐ ์ํ ์ข ์์ฑ ์ ๊ฑฐ๋ฅผ ์ํด ์ด๋ฅผ ์ดํดํ๊ณ ํ์ฉํ๊ธฐ ์ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค. Python ํ๋ก์ ํธ์ ์ฝํ ์ฐธ์กฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํตํฉํ์ฌ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ, ์ค์ฉ์ ์ธ ์์ฉ ํ๋ก๊ทธ๋จ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ฐํ ์ฐธ์กฐ์ ์ฝํ ์ฐธ์กฐ ์ดํด
์ฝํ ์ฐธ์กฐ๋ฅผ ์ดํด๋ณด๊ธฐ ์ ์ Python์ ๊ธฐ๋ณธ ์ฐธ์กฐ ๋์์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ณ์์ ํ ๋นํ๋ฉด ๊ฐํ ์ฐธ์กฐ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ๊ฐ์ฒด์ ๋ํ ๊ฐํ ์ฐธ์กฐ๊ฐ ํ๋ ์ด์ ์กด์ฌํ๋ ํ ๊ฐ๋น์ง ์์ง๊ธฐ๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ์ง ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ์ฒด์ ๊ณ์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ ์กฐ๊ธฐ ํ ๋น ํด์ ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๋ค์์ ๊ฐ๋จํ ์๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค.
import gc
class MyObject:
def __init__(self, name):
self.name = name
def __del__(self):
print(f"Object {self.name} is being deleted")
obj1 = MyObject("Object 1")
obj2 = obj1 # obj2 now also strongly references the same object
del obj1
gc.collect() # Explicitly trigger garbage collection, though not guaranteed to run immediately
print("obj2 still exists") # obj2 still references the object
del obj2
gc.collect()
์ด ๊ฒฝ์ฐ, `obj1`์ ์ญ์ ํ ํ์๋ `obj2`๊ฐ ์ฌ์ ํ ๊ฐ์ฒด๋ฅผ ๊ฐํ๊ฒ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๋ ๋ฉ๋ชจ๋ฆฌ์ ๋จ์ ์์ต๋๋ค. `obj2`๋ฅผ ์ญ์ ํ๊ณ ์ ์ฌ์ ์ผ๋ก ๊ฐ๋น์ง ์์ง๊ธฐ(`gc.collect()`)๋ฅผ ์คํํ ํ์์ผ ๊ฐ์ฒด๊ฐ ์ต์ข ํ๋๊ณ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์๋ฉ๋๋ค. `__del__` ๋ฉ์๋๋ ๋ชจ๋ ์ฐธ์กฐ๊ฐ ์ ๊ฑฐ๋๊ณ ๊ฐ๋น์ง ์์ง๊ธฐ๊ฐ ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ ํ์๋ง ํธ์ถ๋ฉ๋๋ค.
์ด์ ๊ฐ์ฒด๊ฐ ์๋ก๋ฅผ ์ฐธ์กฐํ์ฌ ๋ฃจํ๋ฅผ ์์ฑํ๋ ์๋๋ฆฌ์ค๋ฅผ ์์ํด ๋ณด์ญ์์ค. ์ด๊ฒ์ด ์ํ ์ฐธ์กฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ณณ์ ๋๋ค.
์ํ ์ฐธ์กฐ์ ๊ณผ์
์ํ ์ฐธ์กฐ๋ ๋ ๊ฐ ์ด์์ ๊ฐ์ฒด๊ฐ ์๋ก์ ๋ํ ๊ฐํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ์ฌ ์ํ์ ์์ฑํ ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ฌํ ์๋๋ฆฌ์ค์์๋ ๊ฐ๋น์ง ์์ง๊ธฐ๊ฐ ์ด๋ฌํ ๊ฐ์ฒด๊ฐ ๋ ์ด์ ํ์ํ์ง ์๋ค๋ ๊ฒ์ ๊ฒฐ์ ํ์ง ๋ชปํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ก ์ด์ด์ง ์ ์์ต๋๋ค. Python์ ๊ฐ๋น์ง ์์ง๊ธฐ๋ ๊ฐ๋จํ ์ํ ์ฐธ์กฐ(ํ์ค Python ๊ฐ์ฒด๋ง ํฌํจ)๋ฅผ ์ฒ๋ฆฌํ ์ ์์ง๋ง, ํนํ `__del__` ๋ฉ์๋๊ฐ ์๋ ๊ฐ์ฒด๋ฅผ ํฌํจํ๋ ๋ณด๋ค ๋ณต์กํ ์ํฉ์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๋ค์์ ์ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์ ๋๋ค.
import gc
class Node:
def __init__(self, data):
self.data = data
self.next = None # Reference to the next Node
def __del__(self):
print(f"Deleting Node with data: {self.data}")
# Create two nodes
node1 = Node(10)
node2 = Node(20)
# Create a circular reference
node1.next = node2
node2.next = node1
# Delete the original references
del node1
del node2
gc.collect()
print("Garbage collection done.")
์ด ์์์ `node1`๊ณผ `node2`๋ฅผ ์ญ์ ํ ํ์๋ ๊ฐ ๋ ธ๋๊ฐ ์๋ก์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ ธ๋๊ฐ ์ฆ์(๋๋ ์ ํ) ๊ฐ๋น์ง ์์ง๋์ง ์์ ์ ์์ต๋๋ค. `__del__` ๋ฉ์๋๊ฐ ์์๋๋ก ํธ์ถ๋์ง ์์ ์ ์ฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ์์์ ๋ํ๋ ๋๋ค. ๊ฐ๋น์ง ์์ง๊ธฐ๋ ํนํ ๋ ๋ณต์กํ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ด ์๋๋ฆฌ์ค์์ ์ด๋ ค์์ ๊ฒช๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์ฝํ ์ฐธ์กฐ ์๊ฐ
์ฝํ ์ฐธ์กฐ๋ ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ ๊ณตํฉ๋๋ค. ์ฝํ ์ฐธ์กฐ๋ ๊ฐ๋น์ง ์์ง๊ธฐ๊ฐ ์ฐธ์กฐ๋ ๊ฐ์ฒด๋ฅผ ํ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ์ง ์๋ ํน์ํ ์ ํ์ ์ฐธ์กฐ์ ๋๋ค. ์ฆ, ๊ฐ์ฒด๊ฐ ์ฝํ ์ฐธ์กฐ๋ฅผ ํตํด์๋ง ์ ๊ทผํ ์ ์๋ ๊ฒฝ์ฐ ๊ฐ๋น์ง ์์ง ๋์์ด ๋ฉ๋๋ค.
Python์ `weakref` ๋ชจ๋์ ์ฝํ ์ฐธ์กฐ๋ก ์์ ํ๋ ๋ฐ ํ์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ํต์ฌ ํด๋์ค๋ ๊ฐ์ฒด์ ๋ํ ์ฝํ ์ฐธ์กฐ๋ฅผ ์์ฑํ๋ `weakref.ref`์ ๋๋ค.
์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
import weakref
import gc
class MyObject:
def __init__(self, name):
self.name = name
def __del__(self):
print(f"Object {self.name} is being deleted")
obj = MyObject("Weakly Referenced Object")
# Create a weak reference to the object
weak_ref = weakref.ref(obj)
# The object is still accessible through the original reference
print(f"Original object name: {obj.name}")
# Delete the original reference
del obj
gc.collect()
# Attempt to access the object through the weak reference
referenced_object = weak_ref()
if referenced_object is None:
print("Object has been garbage collected.")
else:
print(f"Object name (via weak reference): {referenced_object.name}")
์ด ์์์ ๊ฐํ ์ฐธ์กฐ `obj`๋ฅผ ์ญ์ ํ ํ ๊ฐ๋น์ง ์์ง๊ธฐ๋ ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ์ ์์ต๋๋ค. `weak_ref()`๋ฅผ ํธ์ถํ๋ฉด ๊ฐ์ฒด๊ฐ ์์ง ์กด์ฌํ๋ฉด ์ฐธ์กฐ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ณ , ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์์ง๋ ๊ฒฝ์ฐ `None`์ ๋ฐํํฉ๋๋ค. ์ด ๊ฒฝ์ฐ `gc.collect()`๋ฅผ ํธ์ถํ ํ `None`์ ๋ฐํํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ด๊ฒ์ด ๊ฐํ ์ฐธ์กฐ์ ์ฝํ ์ฐธ์กฐ์ ์ฃผ์ ์ฐจ์ด์ ์ ๋๋ค.
์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ์ข ์์ฑ ์ ๊ฑฐ
์ฝํ ์ฐธ์กฐ๋ ์ฌ์ดํด์ ์ฐธ์กฐ ์ค ์ ์ด๋ ํ๋๊ฐ ์ฝํ์ง ํ์ธํ์ฌ ์ํ ์ข ์์ฑ์ ํจ๊ณผ์ ์ผ๋ก ์ ๊ฑฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋น์ง ์์ง๊ธฐ๋ ์ฌ์ดํด์ ๊ด๋ จ๋ ๊ฐ์ฒด๋ฅผ ์๋ณํ๊ณ ํ์ํ ์ ์์ต๋๋ค.
`Node` ์์ ๋ฅผ ๋ค์ ์ดํด๋ณด๊ณ ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋๋ก ์์ ํด ๋ณด๊ฒ ์ต๋๋ค.
import weakref
import gc
class Node:
def __init__(self, data):
self.data = data
self.next = None # Reference to the next Node
def __del__(self):
print(f"Deleting Node with data: {self.data}")
# Create two nodes
node1 = Node(10)
node2 = Node(20)
# Create a circular reference, but use a weak reference for node2's next
node1.next = node2
node2.next = weakref.ref(node1)
# Delete the original references
del node1
del node2
gc.collect()
print("Garbage collection done.")
์ด ์์ ๋ ์์ ์์ `node2`๋ `node1`์ ๋ํ ์ฝํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํฉ๋๋ค. `node1`๊ณผ `node2`๊ฐ ์ญ์ ๋๋ฉด ๊ฐ๋น์ง ์์ง๊ธฐ๋ ๋ ์ด์ ๊ฐํ๊ฒ ์ฐธ์กฐ๋์ง ์์์ ์๋ณํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ์ ์์ต๋๋ค. ๋ ๋ ธ๋์ `__del__` ๋ฉ์๋๊ฐ ๋ชจ๋ ํธ์ถ๋์ด ๊ฐ๋น์ง ์์ง์ด ์ฑ๊ณต์ ์ผ๋ก ์ํ๋์์์ ๋ํ๋ ๋๋ค.
์ฝํ ์ฐธ์กฐ์ ์ค์ฉ์ ์ธ ์์ฉ ํ๋ก๊ทธ๋จ
์ฝํ ์ฐธ์กฐ๋ ์ํ ์ข ์์ฑ ์ ๊ฑฐ ์ธ์๋ ๋ค์ํ ์๋๋ฆฌ์ค์์ ์ ์ฉํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ๋๋ค.
1. ์บ์ฑ
์ฝํ ์ฐธ์กฐ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ ๋ ํญ๋ชฉ์ ์๋์ผ๋ก ์ ๊ฑฐํ๋ ์บ์๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์บ์๋ ์บ์๋ ๊ฐ์ฒด์ ๋ํ ์ฝํ ์ฐธ์กฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ฐ์ฒด๊ฐ ๋ ์ด์ ๋ค๋ฅธ ๊ณณ์์ ๊ฐํ๊ฒ ์ฐธ์กฐ๋์ง ์์ผ๋ฉด ๊ฐ๋น์ง ์์ง๊ธฐ๊ฐ ์ด๋ฅผ ํ์ํ ์ ์์ผ๋ฉฐ ์บ์ ํญ๋ชฉ์ ์ ํจํ์ง ์๊ฒ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์บ์๊ฐ ๊ณผ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋นํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์:
import weakref
class Cache:
def __init__(self):
self._cache = {}
def get(self, key):
ref = self._cache.get(key)
if ref:
return ref()
return None
def set(self, key, value):
self._cache[key] = weakref.ref(value)
# Usage
cache = Cache()
obj = ExpensiveObject()
cache.set("expensive", obj)
# Retrieve from cache
retrieved_obj = cache.get("expensive")
2. ๊ฐ์ฒด ๊ด์ฐฐ
์ฝํ ์ฐธ์กฐ๋ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋ ๋ ๊ฐ์ฒด์ ์๋ฆผ์ ๋ณด๋ด์ผ ํ๋ ์ต์ ๋ฒ ํจํด์ ๊ตฌํํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ์ต์ ๋ฒ๋ ๊ด์ฐฐ๋ ๊ฐ์ฒด์ ๋ํ ๊ฐํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๋ ๋์ ์ฝํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ต์ ๋ฒ๊ฐ ๋ถํ์ํ๊ฒ ๊ด์ฐฐ๋ ๊ฐ์ฒด๋ฅผ ์ ์งํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๊ด์ฐฐ๋ ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์์ง๋๋ฉด ์ต์ ๋ฒ๋ ์๋ฆผ ๋ชฉ๋ก์์ ์๋์ผ๋ก ์ ๊ฑฐ๋ ์ ์์ต๋๋ค.
3. ๋ฆฌ์์ค ํธ๋ค ๊ด๋ฆฌ
์ธ๋ถ ๋ฆฌ์์ค(์: ํ์ผ ํธ๋ค, ๋คํธ์ํฌ ์ฐ๊ฒฐ)๋ฅผ ๊ด๋ฆฌํ๋ ์ํฉ์์ ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ์์ค๊ฐ ์์ง ์ฌ์ฉ ์ค์ธ์ง ์ถ์ ํ ์ ์์ต๋๋ค. ๋ฆฌ์์ค ๊ฐ์ฒด์ ๋ํ ๋ชจ๋ ๊ฐํ ์ฐธ์กฐ๊ฐ ์ฌ๋ผ์ง๋ฉด ์ฝํ ์ฐธ์กฐ๊ฐ ์ธ๋ถ ๋ฆฌ์์ค ํด์ ๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์์ต๋๋ค. ์ด๋ ๋ฆฌ์์ค ๋์๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
4. ๊ฐ์ฒด ํ๋ก์ ๊ตฌํ
์ฝํ ์ฐธ์กฐ๋ ํ๋ก์ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋์ ํ๋ ๊ฐ์ฒด ํ๋ก์๋ฅผ ๊ตฌํํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ํ๋ก์๋ ๊ธฐ๋ณธ ๊ฐ์ฒด์ ๋ํ ์ฝํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ธฐ๋ณธ ๊ฐ์ฒด๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๊ฒฝ์ฐ ๊ฐ๋น์ง ์์ง๋ ์ ์์ผ๋ฉฐ ํ๋ก์๋ ๊ธฐ๋ณธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์ผ๋ถ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ฑฐ๋ ์์ธ๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค.
์ฝํ ์ฐธ์กฐ ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ฝํ ์ฐธ์กฐ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง ์๊ธฐ์น ์์ ๋์์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฃผ์ํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค์์ ์ผ๋์ ๋์ด์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก์ ๋๋ค.
- ์ ํ ์ฌํญ ์ดํด: ์ฝํ ์ฐธ์กฐ๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฌธ์ ๋ฅผ ๋ง๋ฒ์ฒ๋ผ ํด๊ฒฐํ์ง ์์ต๋๋ค. ์ด๋ ์ฃผ๋ก ์ํ ์ข ์์ฑ ์ ๊ฑฐ ๋ฐ ์บ์ ๊ตฌํ์ ์ ์ฉํฉ๋๋ค.
- ๊ณผ๋ํ ์ฌ์ฉ ๋ฐฉ์ง: ์ฝํ ์ฐธ์กฐ๋ฅผ ๋ฌด์ฐจ๋ณ์ ์ผ๋ก ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํด์ผ ํ ํน๋ณํ ์ด์ ๊ฐ ์๋ ํ ์ผ๋ฐ์ ์ผ๋ก ๊ฐํ ์ฐธ์กฐ๊ฐ ๋ ๋์ ์ ํ์ ๋๋ค. ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ์ดํดํ๊ณ ๋๋ฒ๊ทธํ๊ธฐ ์ด๋ ค์์ง ์ ์์ต๋๋ค.
None
ํ์ธ: ์ฐธ์กฐ๋ ๊ฐ์ฒด์ ์ก์ธ์คํ๊ธฐ ์ ์ ํญ์ ์ฝํ ์ฐธ์กฐ๊ฐ `None`์ ๋ฐํํ๋์ง ํ์ธํ์ญ์์ค. ์ด๋ ๊ฐ์ฒด๊ฐ ์ด๋ฏธ ๊ฐ๋น์ง ์์ง๋ ๊ฒฝ์ฐ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.- ์ค๋ ๋ฉ ๋ฌธ์ ์ธ์: ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ค๋ ๋ ์์ ์ฑ์ ์ฃผ์ํด์ผ ํฉ๋๋ค. ๊ฐ๋น์ง ์์ง๊ธฐ๋ ์ธ์ ๋ ์ง ์คํ๋ ์ ์์ผ๋ฉฐ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ก์ธ์คํ๋ ค๋ ๋์ ์ฝํ ์ฐธ์กฐ๋ฅผ ๋ฌดํจํํ ์ ์์ต๋๋ค. ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํ๋ ค๋ฉด ์ ์ ํ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ญ์์ค.
WeakValueDictionary
์ฌ์ฉ ๊ณ ๋ ค: `weakref` ๋ชจ๋์ ๊ฐ์ ๋ํ ์ฝํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ ๋์ ๋๋ฆฌ์ธ `WeakValueDictionary` ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์ฐธ์กฐ๋ ๊ฐ์ฒด๊ฐ ๋ ์ด์ ๊ฐํ๊ฒ ์ฐธ์กฐ๋์ง ์์ ๋ ํญ๋ชฉ์ ์๋์ผ๋ก ์ ๊ฑฐํด์ผ ํ๋ ์บ์ ๋ฐ ๊ธฐํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ๋๋ค. *ํค*๋ฅผ ์ฝํ๊ฒ ์ฐธ์กฐํ๋ `WeakKeyDictionary`๋ ์์ต๋๋ค.import weakref data = weakref.WeakValueDictionary() class MyClass: def __init__(self, value): self.value = value a = MyClass(10) data['a'] = a del a import gc gc.collect() print(data.items()) # will be empty weak_key_data = weakref.WeakKeyDictionary() class MyClass: def __init__(self, value): self.value = value a = MyClass(10) weak_key_data[a] = "Some Value" del a import gc gc.collect() print(weak_key_data.items()) # will be empty
- ์ฒ ์ ํ ํ ์คํธ: ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฌธ์ ๋ ๊ฐ์งํ๊ธฐ ์ด๋ ค์ธ ์ ์์ผ๋ฏ๋ก ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ ๋ ํนํ ์ฝ๋๋ฅผ ์ฒ ์ ํ๊ฒ ํ ์คํธํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์๋ณํ์ญ์์ค.
๊ณ ๊ธ ์ฃผ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
1. ํ์ด๋๋ผ์ด์
ํ์ด๋๋ผ์ด์ ๋ ๊ฐ์ฒด๊ฐ ๊ฐ๋น์ง ์์ง๋๊ธฐ ์ง์ ์ ์คํ๋๋ ์ฝ๋ฐฑ ํจ์์ ๋๋ค. `weakref.finalize`๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ๋ํ ํ์ด๋๋ผ์ด์ ๋ฅผ ๋ฑ๋กํ ์ ์์ต๋๋ค.
import weakref
import gc
class MyObject:
def __init__(self, name):
self.name = name
def __del__(self):
print(f"Object {self.name} is being deleted (del method)")
def cleanup(obj_name):
print(f"Cleaning up {obj_name} using finalizer.")
obj = MyObject("Finalized Object")
# Register a finalizer
finalizer = weakref.finalize(obj, cleanup, obj.name)
# Delete the original reference
del obj
gc.collect()
print("Garbage collection done.")
`cleanup` ํจ์๋ `obj`๊ฐ ๊ฐ๋น์ง ์์ง๋ ๋ ํธ์ถ๋ฉ๋๋ค. ํ์ด๋๋ผ์ด์ ๋ ๊ฐ์ฒด๊ฐ ํ๊ดด๋๊ธฐ ์ ์ ์คํํด์ผ ํ๋ ์ ๋ฆฌ ์์ ์ ์ํํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ํ์ด๋๋ผ์ด์ ์๋ ์ํ ์ข ์์ฑ ๋ฐ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ๋ ํนํ ๋ช ๊ฐ์ง ์ ํ ์ฌํญ๊ณผ ๋ณต์ก์ฑ์ด ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฅํ ๊ฒฝ์ฐ ํ์ด๋๋ผ์ด์ ๋ฅผ ํผํ๊ณ ๋์ ์ฝํ ์ฐธ์กฐ์ ๊ฒฐ์ ์ ๋ฆฌ์์ค ๊ด๋ฆฌ ๊ธฐ์ ์ ์์กดํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
2. ๋ถํ
๋ถํ์ ๊ฐ๋น์ง ์์ง ์ค์ธ ๊ฐ์ฒด๊ฐ ํ์ด๋๋ผ์ด์ ์ ์ํด ๋ค์ ์ด์๋๋ ๋๋ฌธ ๊ฒฝ์ฐ์ด์ง๋ง ์ ์ฌ์ ์ผ๋ก ๋ฌธ์ ๊ฐ ์๋ ๋์์ ๋๋ค. ํ์ด๋๋ผ์ด์ ๊ฐ ๊ฐ์ฒด์ ๋ํ ์๋ก์ด ๊ฐํ ์ฐธ์กฐ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ถํ์ ์์์น ๋ชปํ ๋์๊ณผ ๋ฉ๋ชจ๋ฆฌ ๋์๋ก ์ด์ด์ง ์ ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ํผํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
3. ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ง
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฌธ์ ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์๋ณํ๊ณ ์ง๋จํ๋ ค๋ฉด Python ๋ด์์ ๋ฉ๋ชจ๋ฆฌ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค. `memory_profiler` ๋ฐ `objgraph`์ ๊ฐ์ ํจํค์ง๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น, ๊ฐ์ฒด ์ ์ง ๋ฐ ์ฐธ์กฐ ๊ตฌ์กฐ์ ๋ํ ์์ธํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๊ทผ๋ณธ ์์ธ์ ํ์ ํ๊ณ , ์ต์ ํํ ์ ์๋ ์ ์ฌ์ ์ธ ์์ญ์ ์๋ณํ๊ณ , ์ฝํ ์ฐธ์กฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๊ด๋ฆฌํ๋ ๋ฐ ํจ๊ณผ์ ์ธ์ง ํ์ธํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์ฝํ ์ฐธ์กฐ๋ Python์์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ , ์ํ ์ข ์์ฑ์ ์ ๊ฑฐํ๊ณ , ํจ์จ์ ์ธ ์บ์๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ์ ๋๋ค. ์ฝํ ์ฐธ์กฐ๊ฐ ์๋ํ๋ ๋ฐฉ์์ ์ดํดํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ๋์ฑ ๊ฐ๋ ฅํ๊ณ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ Python ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์์๋๋ก ๋์ํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ฝํ ์ฐธ์กฐ๋ฅผ ์ ์คํ๊ฒ ์ฌ์ฉํ๊ณ ์ฝ๋๋ฅผ ์ฒ ์ ํ ํ ์คํธํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ์์์น ๋ชปํ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ์ฝํ ์ฐธ์กฐ๋ฅผ ์ญ์ฐธ์กฐํ ํ ํญ์ `None`์ ํ์ธํ์ญ์์ค. ์ฃผ์ํด์ ์ฌ์ฉํ๋ฉด ์ฝํ ์ฐธ์กฐ๋ Python ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ์์ ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
Python ํ๋ก์ ํธ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์ฝํ ์ฐธ์กฐ์ ์ ๋ต์ ์ ์ฉ์ ํฌํจํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ์ ์ ๋ํ ํ์คํ ์ดํด๋ ์ํํธ์จ์ด์ ํ์ฅ์ฑ, ์์ ์ฑ ๋ฐ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๋ณด์ฅํ๋ ๋ฐ ์ ์ ๋ ์ค์ํด์ง๋๋ค. ์ด๋ฌํ ๊ณ ๊ธ ๊ฐ๋ ์ ์์ฉํ๊ณ ๊ฐ๋ฐ ์ํฌํ๋ก์ ํตํฉํจ์ผ๋ก์จ ์ฝ๋์ ํ์ง์ ๋์ด๊ณ ์ฑ๋ฅ๊ณผ ๋ฆฌ์์ค ํจ์จ์ฑ ๋ชจ๋์ ์ต์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ ์ ์์ต๋๋ค.