CodeGym /ํ–‰๋™ /Python SELF KO /๋ฉ”์„œ๋“œ ํ•ด๊ฒฐ ์ˆœ์„œ (MRO)

๋ฉ”์„œ๋“œ ํ•ด๊ฒฐ ์ˆœ์„œ (MRO)

Python SELF KO
๋ ˆ๋ฒจ 16 , ๋ ˆ์Šจ 5
์‚ฌ์šฉ ๊ฐ€๋Šฅ

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 ์ œ์™ธ), ํ˜ธ์ถœ์€ ์ถ”๊ฐ€์ ์ธ ๋™์ž‘ ์—†์ด ๋๋‚˜.
1
ะžะฟั€ะพั
์ƒ์†,ย  16 ัƒั€ะพะฒะตะฝัŒ,ย  5 ะปะตะบั†ะธั
ะฝะตะดะพัั‚ัƒะฟะตะฝ
์ƒ์†
์ƒ์†
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION