์ฐธ์กฐ ์นด์ดํ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ ์ฌ์ธต ๋ถ์, ์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํ ์ฅ์ , ํ๊ณ์ ๋ฐ ๊ตฌํ ์ ๋ต ํ๊ตฌ. ์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํ ๊ธฐ๋ฒ ํฌํจ.
์ฐธ์กฐ ์นด์ดํ ์๊ณ ๋ฆฌ์ฆ: ์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ตฌํ
์ฐธ์กฐ ์นด์ดํ ์ ๋ฉ๋ชจ๋ฆฌ ๋ด์ ๊ฐ ๊ฐ์ฒด๊ฐ ์์ ์ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ์ ์๋ฅผ ์ ์งํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฒ์ ๋๋ค. ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ด ๋๋ฉด ๋ ์ด์ ๋ค๋ฅธ ๊ฐ์ฒด์์ ์ฐธ์กฐํ์ง ์๋๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ํด๋น ๊ฐ์ฒด๋ฅผ ์์ ํ๊ฒ ํด์ ํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ๋ฌ ์ฅ์ ์ ์ ๊ณตํ์ง๋ง, ํนํ ์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ์์ ์ด๋ ค์์ ์ง๋ฉดํฉ๋๋ค. ์ด ๊ธ์์๋ ์ฐธ์กฐ ์นด์ดํ , ์ฅ์ , ํ๊ณ์ ๋ฐ ์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ตฌํ ์ ๋ต์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ฐธ์กฐ ์นด์ดํ ์ด๋?
์ฐธ์กฐ ์นด์ดํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ํ ํํ์ ๋๋ค. ์ฌ์ฉ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์ฐพ๊ธฐ ์ํด ์ฃผ๊ธฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์บํ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์์กดํ๋ ๋์ , ์ฐธ์กฐ ์นด์ดํ ์ ๋๋ฌํ ์ ์๊ฒ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฆ์ ํ์ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๋ด์ ๊ฐ ๊ฐ์ฒด์๋ ํด๋น ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ(ํฌ์ธํฐ, ๋งํฌ ๋ฑ)์ ์๋ฅผ ๋ํ๋ด๋ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ์์ต๋๋ค. ๊ธฐ๋ณธ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฐธ์กฐ ์นด์ดํธ ์ฆ๊ฐ: ๊ฐ์ฒด์ ๋ํ ์๋ก์ด ์ฐธ์กฐ๊ฐ ์์ฑ๋ ๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ์ฆ๊ฐํฉ๋๋ค.
- ์ฐธ์กฐ ์นด์ดํธ ๊ฐ์: ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ์ ๊ฑฐ๋๊ฑฐ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ๊ฐ์ํฉ๋๋ค.
- ํด์ : ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ ๋๋ฌํ๋ฉด ํด๋น ๊ฐ์ฒด๊ฐ ๋ ์ด์ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ๋ถ๋ถ์์ ์ฐธ์กฐ๋์ง ์์์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๊ฐ์ฒด๋ฅผ ํด์ ํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
์์: Python์ ๊ฐ๋จํ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์ (Python์ ์ฃผ๋ก ์ถ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ์ฌ์ฉํ์ง๋ง ์ฆ๊ฐ์ ์ธ ์ ๋ฆฌ๋ฅผ ์ํด ์ฐธ์กฐ ์นด์ดํ ๋ ์ฌ์ฉํฉ๋๋ค).
obj1 = MyObject()
obj2 = obj1 # obj1์ ์ฐธ์กฐ ์นด์ดํธ ์ฆ๊ฐ
del obj1 # MyObject์ ์ฐธ์กฐ ์นด์ดํธ ๊ฐ์; obj2๋ฅผ ํตํด ๊ฐ์ฒด์ ์ฌ์ ํ ์ ๊ทผ ๊ฐ๋ฅ
del obj2 # MyObject์ ์ฐธ์กฐ ์นด์ดํธ ๊ฐ์; ์ด๊ฒ์ด ๋ง์ง๋ง ์ฐธ์กฐ์๋ค๋ฉด ๊ฐ์ฒด๋ ํด์ ๋จ
์ฐธ์กฐ ์นด์ดํ ์ ์ฅ์
์ฐธ์กฐ ์นด์ดํ ์ ์ถ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฒ์ ๋นํด ๋ช ๊ฐ์ง ์ค๋๋ ฅ ์๋ ์ฅ์ ์ ์ ๊ณตํฉ๋๋ค.
- ์ฆ๊ฐ์ ์ธ ํ์: ๊ฐ์ฒด๊ฐ ๋๋ฌํ ์ ์๊ฒ ๋์๋ง์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์๋์ด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๊ณ ๊ธฐ์กด ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ๊ด๋ จ๋ ๊ธด ์ง์ฐ์ ํผํฉ๋๋ค. ์ด๋ฌํ ๊ฒฐ์ ๋ก ์ ๋์์ ์ค์๊ฐ ์์คํ ๋๋ ์๊ฒฉํ ์ฑ๋ฅ ์๊ตฌ ์ฌํญ์ด ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์ ์ฉํฉ๋๋ค.
- ๋จ์์ฑ: ๊ธฐ๋ณธ ์ฐธ์กฐ ์นด์ดํ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ์ด ๋น๊ต์ ๊ฐ๋จํ์ฌ ์๋ฒ ๋๋ ์์คํ ๋๋ ๋ฆฌ์์ค๊ฐ ์ ํ๋ ํ๊ฒฝ์ ์ ํฉํฉ๋๋ค.
- ์ฐธ์กฐ ์ง์ญ์ฑ: ๊ฐ์ฒด๋ฅผ ํด์ ํ๋ฉด ์ข ์ข ์ฐธ์กฐํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ ํด์ ๋์ด ์บ์ ์ฑ๋ฅ์ด ํฅ์๋๊ณ ๋ฉ๋ชจ๋ฆฌ ๋จํธํ๊ฐ ์ค์ด๋ญ๋๋ค.
์ฐธ์กฐ ์นด์ดํ ์ ํ๊ณ
์ฅ์ ์๋ ๋ถ๊ตฌํ๊ณ ์ฐธ์กฐ ์นด์ดํ ์ ํน์ ์๋๋ฆฌ์ค์์ ์ค์ฉ์ฑ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ๋ช ๊ฐ์ง ํ๊ณ๊ฐ ์์ต๋๋ค.
- ์ค๋ฒํค๋: ์ฐธ์กฐ ์นด์ดํธ ์ฆ๊ฐ์ ํนํ ๊ฐ์ฒด ์์ฑ ๋ฐ ์ญ์ ๊ฐ ๋น๋ฒํ ์์คํ ์์ ์๋นํ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํฌ ์ ์์ต๋๋ค. ์ด ์ค๋ฒํค๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
- ์ํ ์ฐธ์กฐ: ๊ธฐ๋ณธ ์ฐธ์กฐ ์นด์ดํ ์ ๊ฐ์ฅ ์ค์ํ ํ๊ณ๋ ์ํ ์ฐธ์กฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ ๊ฐ ์ด์์ ๊ฐ์ฒด๊ฐ ์๋ก ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ, ํ๋ก๊ทธ๋จ์ ๋๋จธ์ง ๋ถ๋ถ์์ ๋ ์ด์ ์ ๊ทผํ ์ ์๋๋ผ๋ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ ๋๋ฌํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํฉ๋๋ค.
- ๋ณต์ก์ฑ: ํนํ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์ฐธ์กฐ ์นด์ดํ ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌํํ๋ ค๋ฉด ๋ ์ด์ค ์ปจ๋์ ์ ํผํ๊ณ ์ ํํ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์ ์คํ ๋๊ธฐํ๊ฐ ํ์ํฉ๋๋ค. ์ด๋ ๊ตฌํ์ ๋ณต์ก์ฑ์ ๋ํ ์ ์์ต๋๋ค.
์ํ ์ฐธ์กฐ ๋ฌธ์
์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ ๋จ์ํ ์ฐธ์กฐ ์นด์ดํ ์ ์ํฌ๋ ์ค๊ฑด์ ๋๋ค. A์ B ๋ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. A๋ B๋ฅผ ์ฐธ์กฐํ๊ณ B๋ A๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ A๋ B๋ฅผ ์ฐธ์กฐํ์ง ์๋๋ผ๋ ์ฐธ์กฐ ์นด์ดํธ๋ ์ต์ 1์ด๋ฏ๋ก ํด์ ๋์ง ์์ต๋๋ค. ์ด๋ A์ B๊ฐ ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋ ์ํ๋ก ์ ์ง๋์ง๋ง ์ ๊ทผํ ์ ์์ด ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐ์์ํต๋๋ค.
์์: Python์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
class Node:
def __init__(self, data):
self.data = data
self.next = None
node1 = Node(1)
node2 = Node(2)
node1.next = node2
node2.next = node1 # ์ํ ์ฐธ์กฐ ์์ฑ
del node1
del node2 # ๋ฉ๋ชจ๋ฆฌ ๋์: ๋
ธ๋์ ๋ ์ด์ ์ ๊ทผํ ์ ์์ง๋ง ์ฐธ์กฐ ์นด์ดํธ๋ ์ฌ์ ํ 1์
๋๋ค.
์ค๋งํธ ํฌ์ธํฐ(์: `std::shared_ptr`)๋ฅผ ์ฌ์ฉํ๋ C++๊ณผ ๊ฐ์ ์ธ์ด๋ ์ ์คํ๊ฒ ๊ด๋ฆฌํ์ง ์์ผ๋ฉด ์ด ๋์์ ๋ณด์ผ ์ ์์ต๋๋ค. `shared_ptr`์ ์ฌ์ดํด์ ํด์ ๋ฅผ ๋ฐฉํดํฉ๋๋ค.
์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ต
์ํ ์ฐธ์กฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฐธ์กฐ ์นด์ดํ ๊ณผ ํจ๊ป ์ฌ๋ฌ ์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฒ์ ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด์ ์ฌ์ดํด์ ์๋ณํ๊ณ ๋์ด ํด์ ๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
1. ๋งํฌ ์ค ์ค์ ์๊ณ ๋ฆฌ์ฆ
๋งํฌ ์ค ์ค์ ์๊ณ ๋ฆฌ์ฆ์ ์ฐธ์กฐ ์นด์ดํ ์์คํ ์์ ์ํ ์ฐธ์กฐ๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์กฐ์ ํ ์ ์๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ธฐ๋ฒ์ ๋๋ค. ๋ ๋จ๊ณ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ๋งํฌ ๋จ๊ณ: ํ๋ก๊ทธ๋จ์์ ์ง์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฐ์ฒด์ธ ๋ฃจํธ ๊ฐ์ฒด ์งํฉ์์ ์์ํ์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์ํํ๋ฉฐ ๋๋ฌ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋งํฌํฉ๋๋ค.
- ์ค์ ๋จ๊ณ: ๋งํฌ ๋จ๊ณ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ค์บํ์ฌ ๋งํฌ๋์ง ์์ ๊ฐ์ฒด๋ฅผ ์๋ณํฉ๋๋ค. ์ด๋ฌํ ๋งํฌ๋์ง ์์ ๊ฐ์ฒด๋ ๋๋ฌํ ์ ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ด ํด์ ๋ฉ๋๋ค.
์ฐธ์กฐ ์นด์ดํ ์ ๋งฅ๋ฝ์์ ๋งํฌ ์ค ์ค์ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด์ ์ฌ์ดํด์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ผ์์ ์ผ๋ก 0์ผ๋ก ์ค์ ํ ๋ค์ ๋งํฌ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค. ๋งํฌ ๋จ๊ณ ํ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ผ๋ก ์ ์ง๋๋ฉด ํด๋น ๊ฐ์ฒด๊ฐ ๋ฃจํธ ๊ฐ์ฒด์์ ๋๋ฌํ ์ ์์ผ๋ฉฐ ๋๋ฌํ ์ ์๋ ์ฌ์ดํด์ ์ผ๋ถ์์ ์๋ฏธํฉ๋๋ค.
๊ตฌํ ๊ณ ๋ ค ์ฌํญ:
- ๋งํฌ ์ค ์ค์ ์๊ณ ๋ฆฌ์ฆ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ํน์ ์๊ณ๊ฐ์ ๋๋ฌํ ๋ ํธ๋ฆฌ๊ฑฐ๋ ์ ์์ต๋๋ค.
- ๋ฌดํ ๋ฃจํ๋ฅผ ํผํ๊ธฐ ์ํด ๋งํฌ ๋จ๊ณ์์ ์ํ ์ฐธ์กฐ๋ฅผ ์ ์คํ๊ฒ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ด ์๊ณ ๋ฆฌ์ฆ์ ํนํ ์ค์ ๋จ๊ณ์์ ์ ํ๋ฆฌ์ผ์ด์ ์คํ์ ์ง์ฐ์ ์ ๋ฐํ ์ ์์ต๋๋ค.
2. ์ฌ์ดํด ๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ
์ฌ๋ฌ ํน์ ์๊ณ ๋ฆฌ์ฆ์ด ๊ฐ์ฒด ๊ทธ๋ํ์ ์ฌ์ดํด์ ๊ฐ์งํ๊ธฐ ์ํด ํน๋ณํ ์ค๊ณ๋์์ต๋๋ค. ์ด๋ฌํ ์๊ณ ๋ฆฌ์ฆ์ ์ฐธ์กฐ ์นด์ดํ ์์คํ ์์ ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด์ ์ฌ์ดํด์ ์๋ณํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
a) ํ์์ ๊ฐํ๊ฒ ์ฐ๊ฒฐ๋ ๊ตฌ์ฑ ์์ ์๊ณ ๋ฆฌ์ฆ
ํ์์ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐฉํฅ ๊ทธ๋ํ์์ ๊ฐํ๊ฒ ์ฐ๊ฒฐ๋ ๊ตฌ์ฑ ์์(SCC)๋ฅผ ์๋ณํ๋ ๊ทธ๋ํ ์ํ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. SCC๋ ๋ชจ๋ ์ ์ ์ด ๋ค๋ฅธ ๋ชจ๋ ์ ์ ์์ ๋๋ฌ ๊ฐ๋ฅํ ๋ถ๋ถ ๊ทธ๋ํ์ ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋งฅ๋ฝ์์ SCC๋ ๊ฐ์ฒด ์ฌ์ดํด์ ๋ํ๋ผ ์ ์์ต๋๋ค.
์๋ ๋ฐฉ์:
- ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ฒด ๊ทธ๋ํ์ ๊น์ด ์ฐ์ ํ์(DFS)์ ์ํํฉ๋๋ค.
- DFS ์ค์ ๊ฐ ๊ฐ์ฒด์๋ ๊ณ ์ ํ ์ธ๋ฑ์ค์ lowlink ๊ฐ์ด ํ ๋น๋ฉ๋๋ค.
- lowlink ๊ฐ์ ํ์ฌ ๊ฐ์ฒด์์ ๋๋ฌํ ์ ์๋ ๊ฐ์ฅ ์์ ์ธ๋ฑ์ค๋ฅผ ๋ํ๋ ๋๋ค.
- DFS๊ฐ ์คํ์ ์ด๋ฏธ ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ฉด ํ์ฌ ๊ฐ์ฒด์ lowlink ๊ฐ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
- DFS๊ฐ SCC ์ฒ๋ฆฌ๋ฅผ ์๋ฃํ๋ฉด ์คํ์์ SCC์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ํํ๊ณ ์ฌ์ดํด์ ์ผ๋ถ๋ก ์๋ณํฉ๋๋ค.
b) ๊ฒฝ๋ก ๊ธฐ๋ฐ ๊ฐํ ๊ตฌ์ฑ ์์ ์๊ณ ๋ฆฌ์ฆ
๊ฒฝ๋ก ๊ธฐ๋ฐ ๊ฐํ ๊ตฌ์ฑ ์์ ์๊ณ ๋ฆฌ์ฆ(PBSCA)์ ๋ฐฉํฅ ๊ทธ๋ํ์์ SCC๋ฅผ ์๋ณํ๋ ๋ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ํนํ ํฌ์ ๊ทธ๋ํ์ ๊ฒฝ์ฐ ์ผ๋ฐ์ ์ผ๋ก ํ์์ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ์ค์ฉ์ ์ผ๋ก ๋ ํจ์จ์ ์ ๋๋ค.
์๋ ๋ฐฉ์:
- ์๊ณ ๋ฆฌ์ฆ์ DFS ์ค์ ๋ฐฉ๋ฌธํ ๊ฐ์ฒด์ ์คํ์ ์ ์งํฉ๋๋ค.
- ๊ฐ ๊ฐ์ฒด์ ๋ํด ๋ฃจํธ ๊ฐ์ฒด์์ ํ์ฌ ๊ฐ์ฒด๊น์ง ์ด์ด์ง๋ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํฉ๋๋ค.
- ์๊ณ ๋ฆฌ์ฆ์ด ์คํ์ ์ด๋ฏธ ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ฉด ํ์ฌ ๊ฐ์ฒด๊น์ง์ ๊ฒฝ๋ก์ ์คํ์ ์๋ ๊ฐ์ฒด๊น์ง์ ๊ฒฝ๋ก๋ฅผ ๋น๊ตํฉ๋๋ค.
- ํ์ฌ ๊ฐ์ฒด๊น์ง์ ๊ฒฝ๋ก๊ฐ ์คํ์ ์๋ ๊ฐ์ฒด๊น์ง์ ๊ฒฝ๋ก์ ์ ๋์ฌ์ธ ๊ฒฝ์ฐ ํ์ฌ ๊ฐ์ฒด๊ฐ ์ฌ์ดํด์ ์ผ๋ถ์์ ์๋ฏธํฉ๋๋ค.
3. ์ง์ฐ ์ฐธ์กฐ ์นด์ดํ
์ง์ฐ ์ฐธ์กฐ ์นด์ดํ ์ ์ฐธ์กฐ ์นด์ดํธ ์ฆ๊ฐ ์์ ์ ์ค๋ฒํค๋๋ฅผ ๋์ค์ผ๋ก ๋ฏธ๋ฃจ์ด ์ค์ด๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ์ด๋ ์ฐธ์กฐ ์นด์ดํธ ๋ณ๊ฒฝ์ ๋ฒํผ๋งํ๊ณ ์ผ๊ด ์ฒ๋ฆฌํ์ฌ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
๊ธฐ๋ฒ:
- ์ค๋ ๋ ๋ก์ปฌ ๋ฒํผ: ๊ฐ ์ค๋ ๋๋ ์ฐธ์กฐ ์นด์ดํธ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฅํ ๋ก์ปฌ ๋ฒํผ๋ฅผ ์ ์งํฉ๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ์ฃผ๊ธฐ์ ์ผ๋ก ๋๋ ๋ฒํผ๊ฐ ๊ฝ ์ฐจ๋ฉด ์ ์ญ ์ฐธ์กฐ ์นด์ดํธ์ ์ ์ฉ๋ฉ๋๋ค.
- ์ฐ๊ธฐ ์ฅ๋ฒฝ: ์ฐ๊ธฐ ์ฅ๋ฒฝ์ ๊ฐ์ฒด ํ๋์ ๋ํ ์ฐ๊ธฐ๋ฅผ ๊ฐ๋ก์ฑ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฐ๊ธฐ ์์ ์ด ์ ์ฐธ์กฐ๋ฅผ ์์ฑํ๋ฉด ์ฐ๊ธฐ ์ฅ๋ฒฝ์ด ์ฐ๊ธฐ๋ฅผ ๊ฐ๋ก์ฑ๊ณ ์ฐธ์กฐ ์นด์ดํธ ์ฆ๊ฐ๋ฅผ ์ง์ฐ์ํต๋๋ค.
์ง์ฐ ์ฐธ์กฐ ์นด์ดํ ์ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์์ง๋ง ๋ฉ๋ชจ๋ฆฌ ํ์๋ฅผ ์ง์ฐ์์ผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ ์ ์์ต๋๋ค.
4. ๋ถ๋ถ ๋งํฌ ์ค ์ค์
์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ํ ์ ์ฒด ๋งํฌ ์ค ์ค์์ ์ํํ๋ ๋์ , ํน์ ๊ฐ์ฒด ๋๋ ๊ฐ์ฒด ๊ทธ๋ฃน์์ ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด์ ๊ฐ์ด ๋ ์์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ํด ๋ถ๋ถ ๋งํฌ ์ค ์ค์์ ์ํํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ ๊ด๋ จ๋ ์ง์ฐ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
๊ตฌํ:
- ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ดํด์ ์ผ๋ถ์ผ ๊ฐ๋ฅ์ฑ์ด ๋์ ๊ฐ์ฒด ์งํฉ์์ ์์ํฉ๋๋ค.
- ์ด๋ฌํ ๊ฐ์ฒด์์ ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์ํํ๋ฉฐ ๋๋ฌ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋งํฌํฉ๋๋ค.
- ๊ทธ๋ฐ ๋ค์ ๋งํฌ๋ ์์ญ์ ์ค์ํ์ฌ ๋งํฌ๋์ง ์์ ๊ฐ์ฒด๋ฅผ ํด์ ํฉ๋๋ค.
๋ค์ํ ์ธ์ด์์ ์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ตฌํ
์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๊ตฌํ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ธฐ๋ณธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์์คํ ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์๋ฅผ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
Python
Python์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํด ์ฐธ์กฐ ์นด์ดํ ๊ณผ ์ถ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ํจ๊ป ์ฌ์ฉํฉ๋๋ค. ์ฐธ์กฐ ์นด์ดํ ๊ตฌ์ฑ ์์๋ ๊ฐ์ฒด์ ์ฆ๊ฐ์ ์ธ ํด์ ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์ถ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ํ ์ฐธ์กฐ๋ฅผ ๊ฐ์งํ๊ณ ๋์ต๋๋ค.
Python์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ `gc` ๋ชจ๋์ ๊ตฌํ๋์ด ์์ต๋๋ค. `gc.collect()` ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์๋์ผ๋ก ํธ๋ฆฌ๊ฑฐํ ์ ์์ต๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ ๊ธฐ์ ์ผ๋ก ์๋์ผ๋ก ์คํ๋๊ธฐ๋ ํฉ๋๋ค.
์์:
import gc
class Node:
def __init__(self, data):
self.data = data
self.next = None
node1 = Node(1)
node2 = Node(2)
node1.next = node2
node2.next = node1 # ์ํ ์ฐธ์กฐ ์์ฑ
del node1
del node2
gc.collect() # ์ฌ์ดํด์ ๋๊ธฐ ์ํด ๊ฐ๋น์ง ์ปฌ๋ ์
๊ฐ์ ์คํ
C++
C++์๋ ๋ด์ฅ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก `new` ๋ฐ `delete`๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค.
C++์์ ์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๊ตฌํํ๋ ค๋ฉด ์ฌ์ดํด ๊ฐ์ง ๊ธฐ๋ฅ์ด ์๋ ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ `std::weak_ptr`์ ์ฌ์ฉํ์ฌ ์ฌ์ดํด์ ๋๋ ๊ฒ์ ๋๋ค. `weak_ptr`์ ์์ ์ด ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํค์ง ์๋ ์ค๋งํธ ํฌ์ธํฐ์ ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ดํด์ ๊ฐ์ฒด๋ฅผ ํด์ ๋์ง ์๋๋ก ๋ฐฉ์งํ๋ฉด์ ์์ฑํ ์ ์์ต๋๋ค.
์์:
#include
#include
class Node {
public:
int data;
std::shared_ptr next;
std::weak_ptr prev; // ์ฌ์ดํด์ ๋๊ธฐ ์ํด weak_ptr ์ฌ์ฉ
Node(int data) : data(data) {}
~Node() { std::cout << "Node destroyed with data: " << data << std::endl; }
};
int main() {
std::shared_ptr node1 = std::make_shared(1);
std::shared_ptr node2 = std::make_shared(2);
node1->next = node2;
node2->prev = node1; // ์ฌ์ดํด์ด ์์ฑ๋์ง๋ง prev๋ weak_ptr์
๋๋ค.
node2.reset();
node1.reset(); // ์ด์ ๋
ธ๋๊ฐ ํ๊ดด๋ฉ๋๋ค.
return 0;
}
์ด ์์์ `node2`๋ `node1`์ ๋ํ `weak_ptr`์ ๋ณด์ ํฉ๋๋ค. `node1`๊ณผ `node2`๊ฐ ๋ชจ๋ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ๊ณต์ ํฌ์ธํฐ๊ฐ ํ๊ดด๋๊ณ ์ฝํ ํฌ์ธํฐ๊ฐ ์ฐธ์กฐ ์นด์ดํธ์ ๊ธฐ์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๊ฐ ํด์ ๋ฉ๋๋ค.
Java
Java๋ ๋ด๋ถ์ ์ผ๋ก ์ถ์ ๋ฐ ์ผ๋ถ ํํ์ ์ฐธ์กฐ ์นด์ดํ ์ ๋ชจ๋ ์ฒ๋ฆฌํ๋ ์๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ํ ์ฐธ์กฐ๊ฐ ๊ด๋ จ๋ ๊ฐ์ฒด๋ฅผ ํฌํจํ์ฌ ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์งํ๊ณ ํ์ํ๋ ์ญํ ์ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก Java์์ ์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ช ์์ ์ผ๋ก ๊ตฌํํ ํ์๋ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์๋ํ๋ ๋ฐฉ์์ ์ดํดํ๋ฉด ๋ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ํ๋กํ์ผ๋ฌ์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋น์ง ์ปฌ๋ ์ ํ๋์ ๋ชจ๋ํฐ๋งํ๊ณ ์ ์ฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ์๋ณํ ์ ์์ต๋๋ค.
JavaScript
JavaScript๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํด ๊ฐ๋น์ง ์ปฌ๋ ์ (์ข ์ข ๋งํฌ ์ค ์ค์ ์๊ณ ๋ฆฌ์ฆ)์ ์์กดํฉ๋๋ค. ์ฐธ์กฐ ์นด์ดํ ์ ์์ง์ด ๊ฐ์ฒด๋ฅผ ์ถ์ ํ๋ ๋ฐฉ์์ ์ผ๋ถ์ด์ง๋ง, ๊ฐ๋ฐ์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ง์ ์ ์ดํ์ง ์์ต๋๋ค. ์์ง์ ์ฌ์ดํด์ ๊ฐ์งํ ์ฑ ์์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ฃผ๊ธฐ๋ฅผ ๋ฆ์ถ ์ ์๋ ์๋์น ์๊ฒ ํฐ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ๋ง๋๋ ๊ฒ์ ์ฃผ์ํ์ญ์์ค. ๋ ์ด์ ํ์ํ์ง ์์ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋์ผ๋ฉด ์์ง์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ํ์ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ฐธ์กฐ ์นด์ดํ ๋ฐ ์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ์ํ ์ฐธ์กฐ ์ต์ํ: ์ํ ์ฐธ์กฐ ์์ฑ์ ์ต์ํํ๋๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํฉ๋๋ค. ์ฌ์ดํด์ ์์ ํ ํผํ๊ธฐ ์ํด ๋์ฒด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๊ธฐ๋ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ฝํ ์ฐธ์กฐ ์ฌ์ฉ: ์ฝํ ์ฐธ์กฐ๋ฅผ ์ง์ํ๋ ์ธ์ด์์๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ดํด์ ๋์ต๋๋ค. ์ฝํ ์ฐธ์กฐ๋ ์์ ์ด ๊ฐ๋ฆฌํค๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํค์ง ์์ ๊ฐ์ฒด๊ฐ ์ฌ์ดํด์ ์ผ๋ถ์ด๋๋ผ๋ ํด์ ํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ฌ์ดํด ๊ฐ์ง ๊ตฌํ: ๋ด์ฅ๋ ์ฌ์ดํด ๊ฐ์ง ๊ธฐ๋ฅ์ด ์๋ ์ธ์ด์์ ์ฐธ์กฐ ์นด์ดํ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ฌ์ดํด ๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ์ฌ ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด์ ์ฌ์ดํด์ ์๋ณํ๊ณ ๋์ต๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ชจ๋ํฐ๋ง: ์ ์ฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๊ฐ์งํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ชจ๋ํฐ๋งํฉ๋๋ค. ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋๋ก ํด์ ๋์ง ์๋ ๊ฐ์ฒด๋ฅผ ์๋ณํฉ๋๋ค.
- ์ฐธ์กฐ ์นด์ดํ ์์ ์ต์ ํ: ์ง์ฐ ์ฐธ์กฐ ์นด์ดํ ๋๋ ์ฐ๊ธฐ ์ฅ๋ฒฝ๊ณผ ๊ฐ์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐฉ์์ผ๋ก ์ฐธ์กฐ ์นด์ดํ ์์ ์ ์ต์ ํํ์ฌ ์ค๋ฒํค๋๋ฅผ ์ค์ ๋๋ค.
- ์ ์ถฉ์ ๊ณ ๋ ค: ์ฐธ์กฐ ์นด์ดํ ๊ณผ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฒ ๊ฐ์ ์ ์ถฉ์ ์ ํ๊ฐํฉ๋๋ค. ์ฐธ์กฐ ์นด์ดํ ์ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ์ ์ ํ์ด ์๋ ์ ์์ต๋๋ค. ๊ฒฐ์ ์ ๋ด๋ฆด ๋ ์ฐธ์กฐ ์นด์ดํ ์ ๋ณต์ก์ฑ, ์ค๋ฒํค๋ ๋ฐ ํ๊ณ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
๊ฒฐ๋ก
์ฐธ์กฐ ์นด์ดํ ์ ์ฆ๊ฐ์ ์ธ ํ์์ ๋จ์์ฑ์ ์ ๊ณตํ๋ ์ ์ฉํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ํ ์ฐธ์กฐ๋ฅผ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ ๊ฒ์ ์ค์ํ ํ๊ณ์ ๋๋ค. ๋งํฌ ์ค ์ค์ ๋๋ ์ฌ์ดํด ๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ฐ์ ์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ธฐ๋ฒ์ ๊ตฌํํ๋ฉด ์ด ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ํ ์์ด ์ฐธ์กฐ ์นด์ดํ ์ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค. ์ฐธ์กฐ ์นด์ดํ ๊ณผ ๊ด๋ จ๋ ์ ์ถฉ์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํ๋ ๊ฒ์ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ์ํํธ์จ์ด ์์คํ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๊ตฌ ์ฌํญ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ์ํ ์ฐธ์กฐ์ ๋ฌธ์ ๋ฅผ ์ํํ๊ธฐ ์ํด ์ํ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํ์ํ ๊ณณ์ ํตํฉํ์ฌ ์๊ตฌ ์ฌํญ์ ๊ฐ์ฅ ์ ํฉํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต์ ์ ํํ์ญ์์ค. ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๋ณด์ฅํ๊ณ ์ ์ฌ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ํ๋กํ์ผ๋งํ๊ณ ์ต์ ํํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.