🐍 [Python] 콜ᄅα…₯블(Callable) α„€α…’α†¨α„Žα…¦ α„‹α…΅α„’α…’α„’α…‘α„€α…΅

객체의 μ •μ˜

κ°μ²΄λŠ” 파이썬이 데이터λ₯Ό μΆ”μƒν™”ν•œ κ²ƒμž…λ‹ˆλ‹€. 파이썬 ν”„λ‘œκ·Έλž¨μ˜ λͺ¨λ“  λ°μ΄ν„°λŠ” κ°μ²΄λ‚˜ 객체 κ°„μ˜ κ΄€κ³„λ‘œ ν‘œν˜„λ©λ‹ˆλ‹€. 폰 λ…Έμ΄λ§Œ(Von Neumann)의 β€œν”„λ‘œκ·Έλž¨ λ‚΄μž₯식 컴퓨터(stored program computer)” λͺ¨λΈμ„ λ”°λ₯΄κ³ , 또 κ·Έ κ΄€μ μ—μ„œ μ½”λ“œ μ—­μ‹œ 객체둜 ν‘œν˜„λ©λ‹ˆλ‹€.


μ½œλŸ¬λΈ”(Callabe) 객체

μš°λ¦¬κ°€ 파이썬 ν•¨μˆ˜λ‚˜ ν΄λž˜μŠ€μ—μ„œ () λ₯Ό μ‚¬μš©ν•˜λŠ” μ˜λ―ΈλŠ” λͺ¨λ“  μ½œλŸ¬λΈ”(Callable) 객체λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. νŒŒμ΄μ¬μ—μ„œ λͺ¨λ“  객체가 () μ‚¬μš©ν•  수 μ—†λŠ” μ΄μœ κ°€ λ°”λ‘œ 이것 λ•Œλ¬Έμž…λ‹ˆλ‹€. μ½œλŸ¬λΈ” 객체만이 () λ₯Ό μ‚¬μš©ν•  수 있고, μ΄λŠ” __call__ 특수 μ–΄νŠΈλ¦¬λ·°ν„°(λ©”μ†Œλ“œ)λ₯Ό μ‚¬μš©ν•˜λŠ” 것과 μ˜λ―Έκ°€ κ°™μŠ΅λ‹ˆλ‹€.

>>> class c(object):
...     def f(self): pass
>>> '__call__' in dir(c)
False
>>> '__call__' in dir(c().f)
True


기본적으둜,c 클래슀 μ•ˆμ— μžˆλŠ” f λΌλŠ” λ©”μ†Œλ“œλŠ” μ½œλŸ¬λΈ” 객체이기 λ•Œλ¬Έμ— __call__ λ©”μ†Œλ“œλ₯Ό ν¬ν•¨ν•˜κ³  μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ c λΌλŠ” ν΄λž˜μŠ€μ—λŠ” __call__ μ΄λΌλŠ” λ©”μ†Œλ“œκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ§€λ§Œ μ½œλŸ¬λΈ” κ°μ²΄μž…λ‹ˆλ‹€. μ™œλƒν•˜λ©΄, 클래슀 μ•ˆμ— __call__ λ©”μ†Œλ“œλ₯Ό μ„ μ–Έν•  수 있기 λ•Œλ¬Έμ΄μ£ .

>>> class c(object):
...     def f(self): 
...  				pass
...     def __call__(self):
...         print("callable")
...
>>> '__call__' in dir(c)
True


그럼 Python μΈν„°ν”„λ¦¬ν„°μ—μ„œ c 을 λ‹¨λ…μœΌλ‘œ μ‚¬μš©ν•  떄와, c() 와 같이 μ½œλŸ¬λΈ” 객체둜 μ‚¬μš©ν•˜λ©΄ 어떀점이 λ‹€λ₯Έ κ±ΈκΉŒμš”? 그것은 λ°”λ‘œ 객체의 μ‚¬μš©μ˜ μœ λ¬΄μž…λ‹ˆλ‹€. () λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  c λ₯Ό λ‹¨λ…μœΌλ‘œ μ‚¬μš©ν•˜κ²Œ λœλ‹€λ©΄ ν΄λž˜μŠ€κ°€ μ €μž₯된 객체 μ£Όμ†Œλ₯Ό λ°˜ν™˜ ν•˜κ²Œ λ©λ‹ˆλ‹€. 반면, c() 와 같이 μ½œλŸ¬λΈ” 객체둜 μ‚¬μš©ν•˜κ²Œ λœλ‹€λ©΄ 클래슀의 호좜이 μΌμ–΄λ‚˜κ³  νŒŒμ΄μ¬μ€ ν•΄λ‹Ή 클래슀 객체의 μ£Όμ†Œλ₯Ό μ°Ύμ•„κ°€ 생성과 μ†Œλ©Έμ΄ μΌμ–΄λ‚˜κ²Œλ©λ‹ˆλ‹€. 떄문에, 클래슀λ₯Ό 호좜 ν•  λ•Œ λ§ˆλ‹€ μƒˆλ‘œμš΄ μ£Όμ†Œκ°€ 객체둜 λ°˜ν™˜λ˜λŠ” 것이죠.

>>> class c(object):
...     def f(self): pass
>>> t = C()
>>> t
<__main__.C object at 0x10c932940> # μ£Όμ†Œλ₯Ό 객체둜 λ°˜ν™˜
>>> t = C()
>>> t
<__main__.C object at 0x10ca152e0> # 클래슀λ₯Ό 호좜 ν• λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ μ£Όμ†Œλ₯Ό 객체에 λ°˜ν™˜
>>> C
<class '__main__.C'>


ν΄λž˜μŠ€μ—μ„œ () 의 의미

클래슀λ₯Ό 호좜 ν•  λ•Œ 일반적으둜 insatnce = C() 와 같이 () λ₯Ό μ‚¬μš©ν•΄μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό ν• λ‹Ήν•©λ‹ˆλ‹€. 즉, 클래슀λ₯Ό 호좜 ν•˜λŠ” κ²ƒμ΄μ§€μš”(=μ½œλŸ¬λΈ” 객체λ₯Ό 호좜). κ·Έλ ‡λ‹€λ©΄ ν΄λž˜μŠ€λŠ” ν•¨μˆ˜μΈ κ²ƒμΌκΉŒμš”? μ •ν™•νžˆλŠ” ν•¨μˆ˜λŠ” 퍼슀트 클래슀둜 ν•¨μˆ˜κ°€ 클래슀의 μΌμ’…μž…λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ 클래슀λ₯Ό 호좜의 역할은 λ¬΄μ—‡μΌκΉŒμš”?

클래슀 μƒμ„±μž

νŒŒμ΄μ¬μ—μ„œμ˜ 클래슀 μƒμ„±μžμ™€ μ†Œλ©Έμžμ— κ΄€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. μƒμ„±μžλŠ” μ΄λ¦„μ—μ„œ μ•Œ 수 μžˆλ“―μ΄ 객체가 λ§Œλ“€μ–΄μ§ˆ λ•Œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ₯Ό μƒμ„±μžλΌκ³  이야기 ν•˜λ©°, 객체가 μ‚¬λΌμ§ˆ λ•Œ ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜λ₯Ό μ†Œλ©ΈμžλΌκ³  μ΄μ•ΌκΈ°ν•©λ‹ˆλ‹€.

μš°λ¦¬κ°€ 클래슀λ₯Ό μ‚¬μš©ν•  λ•Œ ν”νžˆ μ‚¬μš©ν•˜λŠ” __init__ 이 λ°”λ‘œ μƒμ„±μž μ˜€λ˜κ²ƒμ΄μ§€μš”. μš°λ¦¬κ°€ 클래슀λ₯Ό () λ₯Ό μ‚¬μš©ν•΄μ„œ ν˜ΈμΆœν•˜κ²Œ 되면 νŒŒμ΄μ¬μ€ μžλ™μœΌλ‘œ 제일 λ¨Όμ € __init__을 찾아사 이 λ©”μ†Œλ“œλ₯Ό μ‹€ν–‰μ‹œν‚€λŠ” κ²ƒμ΄μ§€μš”. μ–΄μ°ŒλŠ” 보면 ν•¨μˆ˜μ˜ μ—­ν™œκ³Όλ„ λΉ„μŠ·ν•©λ‹ˆλ‹€.

각 λ©”μ†Œλ“œ κΈ°λŠ₯λ“€ μ‚΄νŽ΄ 보기

λ‹€μŒκ³Ό 같이 클래슀λ₯Ό μž‘μ„±ν•˜κ³  각 λ©”μ†Œλ“œμ˜ κΈ°λŠ₯듀을 μ‚΄νŽ΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

>>> class C:
...     def __init__(self): # μƒμ„±μž
...         print('__init__ method')
...     def __call__(self): # μ½œλŸ¬λΈ” 객체 μ„€μ •
...         print('__call__ method')
...     def special_method(self): # λ©”μ†Œλ“œ
...         print('special method')
...     def __del__(self): # μ†Œλ©Έμž
...         print('__del__ method')


클래슀λ₯Ό ν˜ΈμΆœν•˜κ²Œ 되면 κ°€μž₯ λ¨Όμ € __init__ λ©”μ†Œλ“œκ°€ κ°€μž₯ λ¨Όμ € μ‹€ν–‰λ˜κ³  이후, μ‹€ν–‰λœ 객체의 μ£Όμ†Œκ°€ λ°˜ν™˜ λ©λ‹ˆλ‹€.

>>> C() # 클래슀 호좜
__init__ method
<__main__.C object at 0x1062208b0>


del 은 μΈμŠ€ν„΄μŠ€λ₯Ό μ‚­μ œν•˜λŠ” 파이썬 λ‚΄μž₯ν•¨μˆ˜ μž…λ‹ˆλ‹€. ν• λ‹Ήλœ μΈμŠ€ν„΄μŠ€κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ‹ˆ 였λ₯˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” κ²ƒμž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ 였λ₯˜ 메세지λ₯Ό μ‚΄νŽ΄ 보면 β€œcannot delete function call” 을 확인 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μœ„μ—μ„œ μ„€λͺ…ν•œ 클래슀의 호좜이 ν•¨μˆ˜μ˜ 호좜과 λΉ„μŠ·ν•œ 성격이라고 ν•˜μ˜€λ˜κ²ƒκ³Ό μΌμΉ˜ν•˜λŠ” 뢀뢄인것을 확인 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

>>> del C()
  File "<input>", line 1
    del C()
        ^
SyntaxError: cannot delete function call


κ·Έλ ‡λ‹€λ©΄ 호좜의 ν˜ΈμΆœλ„ κ°€λŠ₯ ν• κΉŒμš”? μœ„μ—μ„œ __call__ λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ½œλŸ¬λΈ” 객체λ₯Ό μ •μ˜ 해쀬기 λ•Œλ¬Έμ— κ°€λŠ₯ ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œ __del__ λ©”μ†Œλ“œκ°€ μ‹€ν–‰λœ 것은 νŒŒμ΄μ¬μ—μ„œ 객체가 μΈμŠ€ν„΄μŠ€μ— ν• λ‹Ή λ˜μ§€ μ•Šμ•˜μ§€ λ•Œλ¬Έμ— λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ₯Ό λ°©μ§€ν•˜κ³ μž μžλ™μœΌλ‘œ ν• λ‹Ήλ˜μ§€ λͺ»ν•œ 객체λ₯Ό 제거 ν•œκ²ƒμž…λ‹ˆλ‹€.

>>> C()()
__init__ method
__call__ method
__del__ method


t λ³€μˆ˜μ— μΈμŠ€ν„΄μŠ€λ₯Ό ν• λ‹Ήν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. __call__ 을 μ‚¬μš©ν•΄μ„œ μ½œλŸ¬λΈ” 객체둜 μ •μ˜ 해쀬기 λ•Œλ¬Έμ— t μΈμŠ€ν„΄μŠ€λ„ μ½œλŸ¬λΈ” μΈμŠ€ν„΄μŠ€λ‘œ μ‚¬μš©ν•˜κ²Œ λœκ²ƒ μž…λ‹ˆλ‹€. 이후, del λ‚΄μž₯ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ μΈμŠ€ν„΄μŠ€λ₯Ό 제거 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

>>> t = C()
__init__ method
>>> t.special_method()
special method
>>> t() # μ½œλŸ¬λΈ” μΈμŠ€ν„΄μŠ€
__call__ method
>>> del t
__del__ method


ν•¨μˆ˜μ˜ ()와 클래슀의 () 의 비ꡐ

κ·Έλ ‡λ‹€λ©΄ λ©”μ†Œλ“œ(ν•¨μˆ˜)μ—μ„œμ˜ () μ‚¬μš©κ³Ό ν΄λž˜μŠ€μ—μ„œμ˜ () μ‚¬μš©μ€ μ–΄λ– ν•œ 차이점이 μžˆμ„κΉŒμš”?


퍼슀트 클래슀 ν•¨μˆ˜ (First-class function)

퍼슀트클래슀 ν•¨μˆ˜λž€ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄κ°€ ν•¨μˆ˜ (function) λ₯Ό first-class citizen으둜 μ·¨κΈ‰ν•˜λŠ” 것을 λœ»ν•©λ‹ˆλ‹€. μ‰½κ²Œ μ„€λͺ…ν•˜μžλ©΄ ν•¨μˆ˜ 자체λ₯Ό 인자 (argument) 둜써 λ‹€λ₯Έ ν•¨μˆ˜μ— μ „λ‹¬ν•˜κ±°λ‚˜ λ‹€λ₯Έ ν•¨μˆ˜μ˜ κ²°κ³Όκ°’μœΌλ‘œ 리턴 ν• μˆ˜λ„ 있고, ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•˜κ±°λ‚˜ 데이터 κ΅¬μ‘°μ•ˆμ— μ €μž₯ν•  수 μžˆλŠ” ν•¨μˆ˜λ₯Ό λœ»ν•©λ‹ˆλ‹€.

μœ„ μ •μ˜μ—μ„œ μ€‘μš”ν•˜κ²Œ μ‚΄νŽ΄λ΄μ•Όν•  μ •λ³΄λŠ” first-class citizen λΌλŠ” κ²ƒμž…λ‹ˆλ‹€. 퍼슀트 클래슀 μ‹œν‹°μ¦Œμ΄λΌλŠ” 것이 무엇을 μ˜λ―Έν•˜λŠ” κ²ƒμΌκΉŒμš”?

μœ„μ—μ„œ 파이썬 ν”„λ‘œκ·Έλž˜λ°μ€ 폰 λ…Έμ΄λ§Œμ΄ μ„€κ³„ν•œ 객체의 κ°œλ…μ„ μ‚¬μš©ν•˜μ—¬ μš΄μ˜λ©λ‹ˆλ‹€. ν”„λ‘œκ·Έλž˜λ°μ„ ν•  λ•Œ λŒ€λΆ€λΆ„μ˜ κΈ°λŠ₯(ν•¨μˆ˜, 클래슀..)듀은 객체 λ‹¨μœ„λ‘œ κ΅¬μ„±λ˜κ³  μ‹€ν–‰λ˜μ–΄μ•Ό ν•œλ‹€λŠ” λœ»μ΄μ§€μš”. ν•˜μ§€λ§Œ λ‹¨μˆœν•œ λ§μ…ˆ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œ 객체 λ‹¨μœ„λ‘œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•˜λ©΄ ꡉμž₯히 λΉ„νš¨μœ¨μ μΌ κ²ƒμž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ λ‹€μŒκ³Ό 같이 λ§μ…ˆ ν•¨μˆ˜λ₯Ό μ •μ˜ ν•œλ‹€κ³  κ°€μ •ν•΄ λ΄…λ‹ˆλ‹€. λ‹€μŒκ³Ό 같이 λ‹¨μˆœν•˜κ²Œ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

>>> def add(a,b):
...     return a+b
...
>>> add(2,3)
5


ν•˜μ§€λ§Œ, 객체λ₯Ό μ‚¬μš©ν•΄μ„œ 이 ν•¨μˆ˜λ₯Ό μ •μ˜ ν•œλ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒμš”? μš°λ¦¬κ°€ μœ„μ—μ„œ ν–ˆλ˜ 객체λ₯Ό μ½œλŸ¬λΈ” 객체둜 λ§Œλ“€μ–΄μ„œ μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.

>>> class C(object):
...     def __call__(self, a, b):
...         return a + b
...
>>> t = C() # μΈμŠ€ν„΄μŠ€ 생성
>>> add = C() # μΈμŠ€ν„΄μŠ€ 호좜
>>> add(2,3)
5


νŒŒμ΄μ¬μ—μ„œλŠ” μ΄λŸ¬ν•œ 객체 지ν–₯적 ν”„λ‘œκ·Έλž˜λ°μ„ ν”Όν•˜κ³ μž ν•¨μˆ˜μ˜ κΈ°λŠ₯(인자, λ°˜ν™˜)을 미리 ν•˜λ‚˜μ˜ 객체둜 μ„€μ •ν•΄ 두어 λ³΅μž‘ν•œ ν”„λ‘œκ·Έλž˜λ°μ„ 방지 ν•œκ²ƒ μž…λ‹ˆλ‹€.


뢀둝

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ(Instance methods)

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œλŠ” 클래슀, 클래슀 μΈμŠ€ν„΄μŠ€μ™€ λͺ¨λ“  μ½œλŸ¬λΈ” 객체 (보톡 μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜)을 κ²°ν•©ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œ μΈμŠ€ν„΄μŠ€μ˜ μ˜λ―ΈλŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°(OOP)μ—μ„œ ν•΄λ‹Ή 클래슀의 ꡬ쑰둜 컴퓨터 μ €μž₯κ³΅κ°„μ—μ„œ ν• λ‹Ήλœ 싀체λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€ λ©”μ„œλ“œ 객체가 호좜될 λ•Œ, κΈ°λ°˜μ„ λ‘λŠ” ν•¨μˆ˜ (__func__) κ°€ ν˜ΈμΆœλ˜λŠ”λ°, 인자 λͺ©λ‘μ˜ μ•žμ— 클래슀 μΈμŠ€ν„΄μŠ€ (__self__) C.κ°€ μ‚½μž…λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, C κ°€ ν•¨μˆ˜ f() 의 μ •μ˜λ₯Ό ν¬ν•¨ν•˜λŠ” 클래슀이고, x κ°€ C 의 μΈμŠ€ν„΄μŠ€μΌ λ•Œ, x.f(1) λ₯Ό ν˜ΈμΆœν•˜λŠ” 것은 C.f(x, 1) 을 ν˜ΈμΆœν•˜λŠ” 것과 κ°™μŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ, selfλ₯Ό 뢙인 μͺ½μ„ bound, μ•ˆ 뢙인 μͺ½μ€ unbound λ©”μ†Œλ“œλΌ ν•©λ‹ˆλ‹€.

예제

>>> class C:
...     def method_one():
...         print("method one called")
...     def method_two(self):
...         print("method two called")
...     @staticmethod # 정적 λ©”μ†Œλ“œ
...     def method_three():
...         print("method three called")

μœ„μ˜ μ½”λ“œλ₯Ό 예제 μ½”λ“œλ‘œ μ‚¬μš©ν•˜κ³ μž ν•©λ‹ˆλ‹€. method_three() λŠ” λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ 정적 λ©”μ†Œλ“œλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€. 이 λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ method_three() λ₯Ό bound method둜 λ§Œλ“€μ§€ 말라고 μ„€μ • ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

method_one() 을 μ‹€ν–‰ν•œ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

>>> C.method_one
<function C.method_one at 0x10ca07b80>  # λ‹¨μˆœ 객체의 μ£Όμ†Œ λ°˜ν™˜
>>> C.method_one()
method one called # C의 μΈμŠ€ν„΄μŠ€κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ‹€ν–‰ κ°€λŠ₯
>>> C.method_one(t)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    C.method_one(t)
TypeError: method_one() takes 0 positional arguments but 1 was given


λ‹€μŒμœΌλ‘œ

method_two(self) λ₯Ό μ‹€ν–‰ν•œ κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

>>> C.method_two(t) # t = C(); t.method_two()와 같은 의미
method two called
>>> C.method_two()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    C.method_two()
TypeError: method_two() missing 1 required positional argument: 'self'

μ—¬κΈ°μ„œ λˆˆμ—¬κ²¨ 봐야할 μ½”λ“œλŠ” C.method_two(t) μž…λ‹ˆλ‹€. μš°λ¦¬λŠ” 이전에 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό ν• λ‹Ήν•œ λ‹€μŒ μΈμŠ€ν„΄μŠ€μ˜ λ©”μ†Œλ“œλ₯Ό 호좜 ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 클래슀 λ‚΄λΆ€μ—μ„œ self λΌλŠ” 인자λ₯Ό μ„ μ–Έ ν–ˆμ§€λ§Œ ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•  λ•Œ, 인자둜 값을 넣어주지 μ•Šμ•„λ„ 싀행이 κ°€λŠ” ν–ˆμŠ΅λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ νŒŒμ΄μ¬μ—μ„œλŠ” μΈμŠ€ν„΄μŠ€μ˜ λ©”μ†Œλ“œκ°€ 호좜(call)되면 μžλ™μœΌλ‘œ μΈμŠ€ν„΄μŠ€ 객체λ₯Ό ν•΄λ‹Ή λ©”μ†Œλ“œμ˜ 인자 즉 self둜 λ„˜κ²¨μ£Όμ—ˆλ˜ κ²ƒμž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ―€λ‘œ C.method_two(t)의 μ˜λ―ΈλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό λ³€μˆ˜μ— ν•  λ‹Ήν•˜μ§€ μ•Šκ³ , λͺ…μ‹œμ μœΌλ‘œ self λΌλŠ” λ³€μˆ˜μ— μΈμŠ€ν„΄μŠ€λ‘œ μ‚¬μš©ν•  λ³€μˆ˜λ₯Ό 집어 λ„£μ–΄ 이λ₯Ό μ‹€ν–‰ ν•œ κ²ƒμ΄μ§€μš”.

t = C()
t.method_two()