11.1 Method Resolution Order
๋ฉ์๋ ํด๊ฒฐ ์์ (Method Resolution Order, MRO)๋ Python์ด ํด๋์ค ๊ณ์ธต ๊ตฌ์กฐ์์ ๋ฉ์๋์ ์์ฑ์ ์ฐพ๋ ์์๋ฅผ ๊ฒฐ์ ํด. ์ด๊ฑด ํนํ ๋ค์ค ์์์ ์ฌ์ฉํ ๋ ์ค์ํ๊ฑฐ๋ , ํด๋์ค๊ฐ ์ฌ๋ฌ ๋ถ๋ชจ ํด๋์ค์์ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์์ ๋ฐ์ ์ ์์์.
์ฝ๊ฒ ๋งํด์, Python์ด ํด๋์ค ์์ ํธ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ์ํ๋์ง์ ๋ํ ์๊ฒฉํ ๊ณ ์ ๋ ์์(ํน์ ์๊ณ ๋ฆฌ์ฆ)๊ฐ ์์ด. ์ด ์๊ณ ๋ฆฌ์ฆ์ ๋ฉ์๋๋ฅผ ์ฐพ๋ ์ฌ๋ฐ๋ฅธ ์์๋ฅผ ๋ณด์ฅํด, ์ด๊ฑธ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ํ ์ ์์ด:
C3 ์ ํํ ์๊ณ ๋ฆฌ์ฆ
C3 ์ ํํ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์์ ๊ฒฐํฉํ์ฌ MRO๋ฅผ ๊ฒฐ์ ํด:
- ์์ ์ ํด๋์ค.
- ๋ถ๋ชจ ํด๋์ค ๋ฆฌ์คํธ๋ฅผ ๋์ด๋ ์์๋๋ก.
- ๋ถ๋ชจ ํด๋์ค์ MRO๋ฅผ ๊ฐ์ ์์๋ก.
C3 ์ ํํ ์๊ณ ๋ฆฌ์ฆ ๊ท์น
-
๋ฉ์๋์ ๋ก์ปฌ ์์๋ฅผ ์ ์งํ๊ธฐ: ํด๋์ค
A
๊ฐ ํด๋์คB
์์ ๋์ด๋๋ฉด, ํด๋์คA
์ ๋ชจ๋ ๋ฉ์๋๋ ํด๋์คB
์ ๋ฉ์๋๋ณด๋ค ๋จผ์ ๊ณ ๋ ค๋์ด์ผ ํด. -
๋ถ๋ชจ ํด๋์ค ์์ ์ ์งํ๊ธฐ: ํด๋์ค
A
๊ฐ ํด๋์คB
์ ๋ถ๋ชจ๋ผ๋ฉด, ํด๋์คA
์ ๋ชจ๋ ๋ฉ์๋๋ ํด๋์คB
์ ๋ฉ์๋๋ณด๋ค ๋จผ์ ๊ณ ๋ ค๋์ด์ผ ํด. -
์์ ์์ ๊ณ ๋ คํ๊ธฐ: ํด๋์ค
C
๊ฐ ๋ ๊ฐ ์ด์์ ํด๋์ค์ ๋ถ๋ชจ๋ผ๋ฉด, ํด๋์คC
์ ๋ฉ์๋ ์์๋ ์ด ๋ชจ๋ ํด๋์ค์ MRO์์ ์ ์ง๋์ด์ผ ํด.
์๊ณ ๋ฆฌ์ฆ ๋จ๊ณ:
1๋จ๊ณ. ์์ ํด๋์ค๋ถํฐ ์์ํ๊ธฐ:
์ธ์ ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ์์ ํด๋์ค๋ถํฐ ์์ํด.
2๋จ๊ณ. ๊ธฐ๋ณธ ํด๋์ค๋ค์ ๋์ด๋ ์์๋๋ก ์ถ๊ฐํ๊ธฐ:
ํ์ฌ ํด๋์ค ๋ค์์ผ๋ก ๊ธฐ๋ณธ ํด๋์ค๋ค์ ์์๋ ์์๋๋ก ํ์ธํด.
3๋จ๊ณ. ๋ถ๋ชจ ํด๋์ค ํ์ํ๊ธฐ:
ํ๋์ ๋ฉ์๋๋ฅผ ๊ทธ๊ณณ์์ ์ฐพ์๋ด.
4๋จ๊ณ. ๋ถ๋ชจ ํด๋์ค์ MRO ๋ณํฉํ๊ธฐ:
๋์ผํ ๊ธฐ๋ณธ ํด๋์ค๊ฐ ์ฌ๋ฌ ๊ฒฝ๋ก๋ก ์์๋๋๋ผ๋, ๊ทธ ํด๋์ค๋ ํ ๋ฒ๋ง ์ฌ๋ฐ๋ฅธ ์์๋ก ํ์ธ๋๊ณ ๋๋จธ์ง๋ ์๋ต ๋ผ.
"์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ฐ์ดํฐ ๊ตฌ์กฐ"์ ์น์ํ ์ด๋ค์๊ฒ๋ ๊น์ด ์ฐ์ ํ์์ด์ง, ๋๋น ์ฐ์ ํ์์ด ์๋๋ผ.
11.2 MRO ํ์ธํ๊ธฐ
Python์์ ํด๋์ค์ ๋ฉ์๋์ ํ๋ ํ์ ์์๋ฅผ
__mro__
์์ฑ์ด๋
mro()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ธํ ์ ์์ด.
์์:
class A:
def method(self):
print("A")
class B(A):
def method(self):
print("B")
class C(A):
def method(self):
print("C")
class D(B, C):
def method(self):
print("D")
# MRO ํ์ธํ๊ธฐ
print(D.__mro__)
์ถ๋ ฅ ๊ฒฐ๊ณผ:
(<class '__main__.D'>,
<class '__main__.B'>,
<class '__main__.C'>,
<class '__main__.A'>,
<class 'object'>)
์ด๊ฒ์ Python์ด ๋ฉ์๋์ ์์ฑ์ ์ฐพ๋ ์์๋ฅผ ๋ณด์ฌ์ค:
D
: Python์ ๋จผ์ ํด๋์คD
์์ ๋ฉ์๋๋ฅผ ํ์ธํด.-
B
: ๊ทธ ๋ค์ Python์ ์ฒซ ๋ฒ์งธ ๋ถ๋ชจ ํด๋์ค์ธB
์์ ๋ฉ์๋๋ฅผ ํ์ธํด. -
C
: ๋ฉ์๋๊ฐ ํด๋์คB
์์ ๋ฐ๊ฒฌ๋์ง ์์ผ๋ฉด, Python์ ๋ ๋ฒ์งธ ๋ถ๋ชจ ํด๋์ค์ธC
์์ ๋ฉ์๋๋ฅผ ํ์ธํด. -
A
: ๋ฉ์๋๊ฐB
์C
์์ ๋ฐ๊ฒฌ๋์ง ์์ผ๋ฉด, Python์ ํด๋์คA
์์ ๋ฉ์๋๋ฅผ ํ์ธํด. -
object
: ๋ง์ง๋ง์ผ๋ก Python์ ๊ธฐ๋ณธ ํด๋์คobject
์์ ๋ฉ์๋๋ฅผ ํ์ธํด.
11.3 MRO์ ํจ๊ป super()
์ฌ์ฉํ๊ธฐ
super()
ํจ์๋ ๋ถ๋ชจ ํด๋์ค ๋ฉ์๋๋ฅผ ์ฌ๋ฐ๋ฅธ ์์๋ก
ํธ์ถํ๊ธฐ ์ํด MRO๋ฅผ ๋ฐ๋ฅด๊ฒ ํด. super()
์ฌ์ฉ ์์ ๋ฅผ ์ดํด๋ณด์:
class A:
def method(self):
print("A")
super().method()
class B(A):
def method(self):
print("B")
super().method()
class C(A):
def method(self):
print("C")
super().method()
class D(B, C):
def method(self):
print("D")
super().method()
d = D()
d.method()
์ถ๋ ฅ ๊ฒฐ๊ณผ:
D
B
C
A
ํ์ ์์ (MRO)
1. method
๋ฉ์๋์ ํด๋์ค D
ํธ์ถ:
- Python์ ํด๋์ค
D
์์ ๋ฉ์๋๋ฅผ ํ์ธํ๊ณ , ๋ฉ์๋๋ฅผ ์ฐพ์. D.method()
๊ฐ ์คํ๋๊ณ"D"
๋ฅผ ์ถ๋ ฅํด.-
๊ทธ ๋ค์
super().method()
๊ฐ ํธ์ถ๋๋ฉฐ ๋ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ํด MRO๋ฅผ ๋ฐ๋ผ๊ฐ.
2. method
๋ฉ์๋์ ํด๋์ค B
ํธ์ถ:
- MRO์ ๋ฐ๋ผ,
D
๋ค์ ํด๋์ค๋B
์ผ. B.method()
๊ฐ ์คํ๋๊ณ"B"
๋ฅผ ์ถ๋ ฅํด.-
๊ทธ ๋ค์
super().method()
๊ฐ ํธ์ถ๋๋ฉฐ ๋ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ํด MRO๋ฅผ ๋ฐ๋ผ๊ฐ.
3. method
๋ฉ์๋์ ํด๋์ค C
ํธ์ถ:
- MRO์์
B
๋ค์ ํด๋์ค๋C
์ผ. C.method()
๊ฐ ์คํ๋๊ณ"C"
๋ฅผ ์ถ๋ ฅํด.-
๊ทธ ๋ค์
super().method()
๊ฐ ํธ์ถ๋๋ฉฐ ๋ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ํด MRO๋ฅผ ๋ฐ๋ผ๊ฐ.
4. method
๋ฉ์๋์ ํด๋์ค A
ํธ์ถ:
- MRO์์
C
๋ค์ ํด๋์ค๋A
์ผ. A.method()
๊ฐ ์คํ๋๊ณ"A"
๋ฅผ ์ถ๋ ฅํด.-
๊ทธ ๋ค์
super().method()
๊ฐ ํธ์ถ๋์ง๋งA
์๋ ๋ถ๋ชจ์method
๋ฉ์๋๊ฐ ์๊ธฐ ๋๋ฌธ์ (๊ธฐ๋ณธ ํด๋์คobject
์ ์ธ), ํธ์ถ์ ์ถ๊ฐ์ ์ธ ๋์ ์์ด ๋๋.
GO TO FULL VERSION