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도 여러 파일로 나눠서 하는 것이 좀 더 좋을 수 있지만,
일단 한 파일안에서 모든 클래스를 구현해서 진행시켰다. |
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
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