Method, 매쏘드는 객체의 행동을 말한다. 아래 명제를 생각해보자.
"계산기는 계산을 한다."
너무 단순하지 않은가? 계산기는 계산을 하는 물건이다. 이때 계산기는 '객체', 계산을 하다는 '매쏘드'다. 계산을 하는 주체가 계산기고 계산은 계산기의 '행동'이다. 이외에도 무슨 행동을 할까?
1. 더한다.
2. 뺀다.
3. 곱한다.
4. 나눈다.
5. =로 계산을 끝낸다.
이들 행동은 개별 객체가 모두 독립적으로 수행한다. 즉, 어떤 계산기의 행동이 다른 계산기의 행동과는 무관하다. 이제 파이썬으로 매쏘드를 '설계'하자. 프로그래밍을 잘 못해도, 알고리즘을 몰라도 매쏘드는 설계할 수 있다.
class Calculator:
def equal(self):
pass
def add(self):
pass
def subtract(self):
pass
def times(self):
pass
def divide(self):
pass
아직 알고리즘을 정하지 않았으니 전부 pass로 처리했다. 오브젝트를 생성해서 매쏘드를 불러보자. 아직 아무런 결과가 안나올 것이다.
> cal = Calculator() #object
> cal.add()
> cal.times()
> cal.calculate()
보통 계산기를 쓸 때 어떻게 하더라? 숫자를 누르고 계산 마지막에 "="을 눌러서 끝낸다. 그럼 다음 계산은 어떻게 되어야 할까?
(10+20-5)*2=?
아마 이렇지 않을까?
> cal = Calculator()
> cal.add(10) #10 누르고 +
> cal.subtract(20) #20 누르고 -
> cal.times(5) #5 누르고 *
> cal.equal(2) #2 누르고 =
뭔가 복잡하다. 행동을 보다 단순하게 디자인을 해보자. 매쏘드를 새로 생각해서 다음과 같이 되었다고 하자.
1. 숫자 버튼의 값을 기억한다.
2. 연산 버튼의 내용을 처리한다.
3. =을 누르면 이전 결과를 모두 정리한다.
새로 디자인한 클래스는 다음과 같다.
class Calculator:
def start(self):
pass
def exec(self):
pass
def end(self):
pass
행동이라서 매쏘드는 거의 동사로 시작한다: start, exec, end, ... 이제 작동 시나리오를 보자.
> cal=Calculator()
> cal.start(10)
> cal.exec("+",20)
> cal.exec('-',5)
> cal.exec('*',2)
> cal.end()
이렇게 (10+20-5)*2= 을 처리한다. 보다 실제 행동에 가까운 것 같다. 이제 코드를 짜보자. 이번에는 타입 힌트를 쓰지 않고 간단하게 작성하도록 한다.
클래스나 함수를 써서 알고리즘 부분과 실행부분을 분리하면 프로그램을 유지보수할 때 큰 도움이 됩니다.
답글삭제