클래스와 매쏘드

 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= 을 처리한다. 보다 실제 행동에 가까운 것 같다. 이제 코드를 짜보자. 이번에는 타입 힌트를 쓰지 않고 간단하게 작성하도록 한다.

 

class Calculator:
    def __init__(self):
        self.memory=0.0 #memroy in calculator
    def start(self,num):
        self.memory=num
    def exec(self,op,screen):
        if op=='+':
            self.memory+=screen
        elif op=='-':
            self.memory-=screen
        elif op=='*':
            self.memory*=screen
        elif op=='/':
            self.memory/=screen
        else:
            pass
    def end(self):
        print("Result: ",self.memory)

cal=Calculator()
cal.start(10)
cal.exec('+',20)
cal.exec('-',5)
cal.exec('*',2)
cal.end()

파일 이름을 test.py로 저장하고 실행하면 다음 화면과 같다.


이번 시간에는 클래스의 매쏘드를 다루었다. 매쏘드를 먼저 설계하고 구체적인 행동을 정의하도록 하자. 이때 중요한 것은 작동 상태를 점검해보면서 점진적으로 접근하는 일이다. 여러분이 Unified Modeling Language를 알고 있다면 이런 작업을 할 때 큰 도움이 된다. 시간이 되면 UML도 찾아보자.




댓글 1개:

  1. 클래스나 함수를 써서 알고리즘 부분과 실행부분을 분리하면 프로그램을 유지보수할 때 큰 도움이 됩니다.

    답글삭제

PyR Intro - 신입생OT학기제