2017년 1월 12일 목요일

#Python State Pattern(파이썬 스테이트 패턴)


Java로 작성한 패턴 코드를 Python으로 짜보자!

그 전에 오늘 알게 된 정보 정리

(1) python에서 함수 이름을 만들 때에는 대문자를 넣지 않는다.
(2) string 표현을 무조건 ""으로 하지 않는다 ''으로 하는 경우와 ""으로 하는 경우 둘 다 string으로 취급을 받을 수 있다. 이것에 대한 정보는 좀 더 조사해서 정리하는 것으로 한다.
(3) import A와 from test import A는 다르다.
예를 들면 import A를 쓴 경우에는 A를 쓰려고 한다-하면 test.A()이라고 명시를 해줘야 하는 반면에
from test import A라고 쓴 경우에는 같은 파일안에서 쓰듯이 바로 A()로 쓸 수 있다.


전체적 구성은 다음과 같이 UML을 그려볼 수 있다.


자, 이제부터 java와  python의 소스를 같이 보자.

먼저, 파일의 구조는 다음과 같이 구성된다. 물론 python도 여러 파일로 나눠서 하는 것이 좀 더 좋을 수 있지만,
일단 한 파일안에서 모든 클래스를 구현해서 진행시켰다.



java
















python

 








State.java

 














Gumball.py

















python에서 interface클래스는 어떻게 구현하는걸까?
일단, 현재 찾아본 바로는 2가지 방법이 있는 것 같다.

(1) 위와 같이 class를 만들고 함수내부를 pass로 채워서 직접적인 구현은 구현 클래스에서 진행 시키는 방법

(2) ABCMeta를 이용하는 방법, (참조 : https://docs.python.org/2/library/abc.html)






여기서 register를 이용해서 관계를 등록하고 Foo() class를 MyIterable에서 구현하고 있다.
Foo() interface를 MyIterable에서 구현하고 있는 것이다.





SoldState.java

Gumball.py


가장 오랫동안 고민했던 부분은 GumballMachine gm;을 생성하지 않고 부르는 것.
그러니까 gm의 생성자를 부르지 않고 위 처럼 어떻게 python에서 참조를 할까?를 고민했었다.
이는 init을 보면 알 수 있듯 단순히 gm하고만 명명하고 있다. gm이 어떤 타입인지 모르는 상태에서 참조가 가능하다는 것을 알 수 있다. 처음에는 상당히 혼란스러울 수 있다.






SoldOutState.java

Gumball.py
 

























NoQuarterState.java


Gumball.py






HasQuarterState.java



Gumball.py




GumballMachine.java
Gumball.py































java에 toString()이 있다면 python에서는 __str__을 이용할 수 있다.

두 함수의 중요한 점은 gm.toString(), gm.__str__()이런 식으로 부르는 것이 아니라

그냥 객체 자체를 print하면 toString()의 문장을 출력해준다.

따라서 print gm, System.out.println(gm)으로 객체 자체를 출력해주면 된다.








GumballMachineTestDrive.java




Gumball.py




<결과>





(이상한 부분을 지적해주시면 좀 더 좋은 글로 보답하겠습니다.)
소스가 필요하신 분이 있을까봐 소스도 첨부합니다.
python java


댓글 없음:

댓글 쓰기