덕 타이핑(Duck Typing)

λ§Œμ•½ μ–΄λ–€ μƒˆκ°€ 였리처럼 κ±·κ³ , ν—€μ—„μΉ˜κ³ , κ½₯κ½₯κ±°λ¦¬λŠ” μ†Œλ¦¬λ₯Ό λ‚Έλ‹€λ©΄ λ‚˜λŠ” κ·Έ μƒˆλ₯Ό 였리라고 λΆ€λ₯Ό 것이닀.

  • μ‚¬λžŒμ΄ 였리처럼 ν–‰λ™ν•˜λ©΄ 였리둜 봐도 λ¬΄λ°©ν•˜λ‹€λΌλŠ”κ²Œ 덕 타이핑(Duck Typing)이닀.
  • νƒ€μž…μ„ 미리 μ •ν•˜λŠ”κ²Œ μ•„λ‹ˆλΌ 싀행이 λ˜μ—ˆμ„ λ•Œ ν•΄λ‹Ή Method듀을 ν™•μΈν•˜μ—¬ νƒ€μž…μ„ μ •ν•œλ‹€.
  • μž₯점
    • νƒ€μž…μ— λŒ€ν•΄ 맀우 μžμœ λ‘­λ‹€.
    • λŸ°νƒ€μž„ 데이터λ₯Ό 기반으둜 ν•œ κΈ°λŠ₯κ³Ό μžλ£Œν˜•μ„ μ°½μΆœν•˜λŠ” 것
  • 단점
    • λŸ°νƒ€μž„ μžλ£Œν˜• 였λ₯˜κ°€ λ°œμƒν•  수 μžˆλ‹€ λŸ°νƒ€μž„μ—μ„œ, 값은 μ˜ˆμƒμΉ˜ λͺ»ν•œ μœ ν˜•μ΄ μžˆμ„ 수 있고, κ·Έ μžλ£Œν˜•μ— λŒ€ν•œ λ¬΄μ˜λ―Έν•œ μž‘μ—…μ΄ μ μš©λœλ‹€.
    • 이런 였λ₯˜κ°€ ν”„λ‘œκ·Έλž˜λ° μ‹€μˆ˜ κ΅¬λ¬Έμ—μ„œ 였랜 μ‹œκ°„ 후에 λ°œμƒν•  수 μžˆλ‹€
    • λ°μ΄ν„°μ˜ 잘λͺ»λœ μžλ£Œν˜•μ˜ μž₯μ†Œλ‘œ μ „λ‹¬λ˜λŠ” ꡬ문은 μž‘μ„±ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€. 이것은 버그λ₯Ό μ°ΎκΈ° μ–΄λ €μšΈ μˆ˜λ„ μžˆλ‹€.

Example Code

class Parrot:
    def fly(self):
        print("Parrot flying")
 
class Airplane:
    def fly(self):
        print("Airplane flying")
 
class Whale:
    def swim(self):
        print("Whale swimming")
 
def lift_off(entity):
    entity.fly()
 
parrot = Parrot()
airplane = Airplane()
whale = Whale()
 
lift_off(parrot) # prints `Parrot flying`
lift_off(airplane) # prints `Airplane flying`
lift_off(whale) # Throws the error `'Whale' object has no attribute 'fly'`

사둀

  • 슀λͺ°ν† ν¬, 루비, νŒŒμ΄μ¬μ—μ„œ 덕 타이핑은 맀우 많이 쓰이고 μžˆλ‹€.

κ²°λ‘ 

  • λ™μ μœΌλ‘œ μ •ν˜•λœ μ–Έμ–΄μ˜ κ°œλ°œμ€ 자주 λ‹¨μœ„ ν…ŒμŠ€νŠΈμ™€ 같은 ν”„λ‘œκ·Έλž˜λ° 정책에 μ˜ν•΄ μ§€μ›λœλ‹€.
  • ν…ŒμŠ€νŠΈλŠ” μ „λ¬Έ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ—μ„œ 핡심 방법이고, λ™μ μœΌλ‘œ μ •ν˜•λœ μ–Έμ–΄μ˜ κ²½μš°μ— 특히 μ€‘μš”ν•˜λ‹€.
  • μ‹€μ œλ‘œ, μ˜¬λ°”λ₯Έ ν”„λ‘œκ·Έλž¨μ΄ μž‘λ™μ„ 보μž₯ν•˜κΈ° μœ„ν•΄ ν–ˆλ˜ ν…ŒμŠ€νŠΈλŠ” 정적 μžλ£Œν˜• 검사보닀 훨씬 넓은 였λ₯˜ λ²”μœ„λ₯Ό 감지할 수 μžˆμ§€λ§Œ, λ°˜λŒ€λ‘œ 정적 μžλ£Œν˜• 검사가 감지할 수 μžˆλŠ” 였λ₯˜λ₯Ό μ’…ν•©μ μœΌλ‘œ 검색할 수 μ—†λ‹€.

Reference