10.1 ์ฌ๋ฌ ํด๋์ค์์ ์์๋ฐ๊ธฐ
๋ค์ค ์์์ Python์์ ํด๋์ค๊ฐ ์ฌ๋ฌ ๋ถ๋ชจ ํด๋์ค๋ก๋ถํฐ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ ์๊ฒ ํด. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ ์ ์ฐ์ฑ์ด ์ปค์ง์ง๋ง, ๋ณต์กํ ๊ณ์ธต ๊ตฌ์กฐ์ ์ ์ฌ์ ์ธ ์ถฉ๋์ ์ ๋ฐํ ์ ์์ด.
ํด๋์ค์ ๋ค์ฏ ๊ฐ์ ๋ถ๋ชจ๋ฅผ ๋์ดํ ์ ์๋ ๊ธฐ๋ฅ์ ๋ค ๊ฐ๋ฅ์ฑ์ ํฌ๊ฒ ํ์ฅ์์ผ์ค์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋งค์ฐ ํธ๋ฆฌํด์ ธ. ์ด๊ฑธ ํ๋ ๊ฑด ์ ๋ง ์ฌ์ โ ๋ถ๋ชจ ํด๋์ค๋ฅผ ์ฝค๋ง๋ก ๊ตฌ๋ถํด์ ๋์ดํ๋ฉด ๋ผ:
class Base1:
def method1(self):
print("Method1 from Base1")
class Base2:
def method2(self):
print("Method2 from Base2")
class Derived(Base1, Base2):
pass
obj = Derived()
obj.method1()
obj.method2()
๋ชจ๋ ๊ฒ์ด ๊ณํ๋๋ก ์๋ํด โ ์๋ฆ๋ค์.
๊ทธ๋ฌ๋ ๋ค์ค ์์์๋ ์ฌ์ฉ ์ ๋ฐ๋์ ๊ณ ๋ คํด์ผ ํ ๋ช ๊ฐ์ง ๋ณต์กํ ๋ฉด์ด ์์ด. ์ด๋ป๊ฒ ์๋ํ๋์ง ๊ทธ๋ฆฌ๊ณ ๋ค์ค ์์๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ์ ํจ๊ป ์ดํด๋ณด์.
10.2 ์ฌ๋ฌ ๊ธฐ๋ณธ ํด๋์ค์ ์๋ ๋ฉ์๋ ํธ์ถ
ํด๋์ค๋ ์ด๋ฆ ๋ค์ ๊ดํธ๋ก ๋์ด๋ ์ฌ๋ฌ ๋ถ๋ชจ ํด๋์ค์์ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ ์์ด. ์ด ์์ฑ๊ณผ ๋ฉ์๋๋ค์ ๋์ผํ ์ด๋ฆ์ ๊ฐ์ง ์ ์์ด:
class Base1:
def method(self):
print("Method from Base1")
class Base2:
def method(self):
print("Method from Base2")
class Derived(Base1, Base2):
pass
obj = Derived()
obj.method() # ์ฌ๊ธฐ์ ์ด๋ค ๋ฉ์๋๊ฐ ํธ์ถ๋ ๊น?
์ด ์์ ์์ Derived
ํด๋์ค๋ Base1
๊ณผ Base2
์์ ์์๋ฐ์. method()
๊ฐ ํธ์ถ๋๋ฉด, Python์ ์ฒซ ๋ฒ์งธ๋ก ์ง์ ๋ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ ํํด โ Base1
.
ํ์ง๋ง ๊ทธ๊ฒ ๊ทธ๋ ๊ฒ ์๋ช ํ์ง๋ ์์, ๊ทธ๋ ์ง? ๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ๋๊ตฐ๊ฐ๊ฐ ๊ธฐ๋ณธ ํด๋์ค์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ๋ก์ง์ด ์ํฅ์ ๋ฐ์ ์ ์๊ณ ๋ค๊ฐ ์ด๋๊ฐ๊ฐ ์๋ชป๋์๋ค๋ ๊ฒ์ ์์ง ๋ชปํ ์๋ ์์ด. ๊ทธ๋ฅ ์กฐ๊ธ ๋ค๋ฅธ ๋ฉ์๋๋ค์ด ํธ์ถ๋๊ธฐ ์์ํ ๋ฟ์ด์ผ :)
10.3 ๋ค์ค ์์์์ super()
์ฌ์ฉ
๋ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ์ ์ ๋ค์ค ์์์์ ๊ธฐ๋ณธ ํด๋์ค์ super()
๋ฅผ ํธ์ถํ๋ ๊ฑฐ์ผ.
์์ :
class Base1:
def method(self):
print("Method from Base1")
super().method()
class Base2:
def method(self):
print("Method from Base2")
super().method()
class Derived(Base1, Base2):
def method(self):
print("Method from Derived")
super().method()
obj = Derived()
obj.method()
์, ํ๋ฉด์ ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ ๊น?
Method from Derived
Method from Base1
์๋๋ฉด
Method from Derived
Method from Base2
์ํ๋ผ์ด์ฆ โ ์ถ๋ ฅ์ ์ด๋ ๊ฒ ๋์ฌ ๊ฑฐ์ผ:
Method from Derived
Method from Base1
Method from Base2
super().method()
๋ ๊ฐ ๊ธฐ๋ณธ ํด๋์ค์ method()
๋ฅผ ํธ์ถํ ๊ฑฐ์ผ! ์ด๊ฒ ๋ด๊ฐ ๋ค์ค ์์์ ๋ํด ์ฒ์ ์ธ๊ธํ์ ๋ ๋งํ๋ ๊ทธ๋ฐ ๋ฏธ๋ฌํ ์ฐจ์ด์ ๋ค์ด์ผ.
10.4 ๋ค์ด์๋ชฌ๋ (Diamond)
์์
๋ง์ง๋ง์ผ๋ก, ๋ค์ด์๋ชฌ๋ ์์์ด๋ผ๋ ๊ณ ์ ์ ์ธ ๋ฌธ์ . ์ด๊ฑด ์ค๋ช ํ๋ ๊ฒ๋ณด๋ค ์์ ๋ก ๋ณด์ฌ์ฃผ๋ ๊ฒ ๋ ์ฌ์:

์ด ์ฝ๋๋ก๋ ์๋ฅผ ๋ค์ด ์ด๋ ๊ฒ ๋ณด์ผ ์ ์์ด:
class A:
def method(self):
print("Method from A")
class B(A):
def method(self):
print("Method from B")
super().method()
class C(A):
def method(self):
print("Method from C")
super().method()
class D(B, C):
def method(self):
print("Method from D")
super().method()
obj = D()
obj.method()
์ถ๋ ฅ์ ์ด๋ ๊ฒ ๋ ๊ฑฐ์ผ:
Method from D
Method from B
Method from C
Method from A
๋ค์ค ์์์์ ๋ฐฉํฅ์ ์์ง ์์ผ๋ ค๋ฉด Python์ด ๋ถ๋ชจ ํด๋์ค์์ ํ๋์ ๋ฉ์๋๋ฅผ ๊ฒ์ํ๋ ์์๋ฅผ ์ ์์์ผ ํด. ๋ค์ ๊ฐ์์์ ๊ทธ ๋ด์ฉ์ ๋ํด ์๊ฒ ๋ ๊ฑฐ์ผ.