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


2017년 1월 9일 월요일

#Head_First_C_00


기본적인 프로그래밍은

1. sequence 순차
2. condition 조건
3. reputation 반복

으로 이루어진다.












실행파일이 만들어지고 메모리 상에 적재가 되면서

stack 부분에서는 함수- 그에 따른 파라미터 값들이 들어가게되고
heap 부분에서는 동적으로 할당되는 값들이
global 부분에서는 전역변수가
constraints 부분에서는 상수가
code 부분에서는 전체 코드가 적재

예를 들어 살펴보자면 다음과 같다.


<stack>
int *b;
b = (int *)malloc(sizeof(int));
*b=3;
printing(int x = *b)
printf("x is %d\n", x=*b);
free(b);

a= 10;
printing(int x = a)
printf("x is %d\n", x=a);
 
<heap> 
b = (int *)malloc(sizeof(int));
free(b);
 
<global> 
int a;
a= 10;
char msg[] = “test”;
 
<constraints> 
char msg[] = “test”;
 
<code> 
#include <stdio.h>
#include <stdlib.h>

int a;

void printing(int x);

char msg[] = “test”;

int main(){

int *b;
b = (int *)malloc(sizeof(int));
*b=3;
printing(*b);
free(b);

a= 10;
printing(a);

return 0;
}
 
void printing(int x){

printf("x is %d\n", x);

}
 

Q. Constraints 안에선 어떻게 지역/전역 변수를 구분하는걸까?
A. 만약 그 변수가 지역이면 Constraints안에서 한 번 선언하고 그 변수를 복사해서 지역 혹은 전역 변수 공간에도 선언해준다.


#개발환경



개발 환경이란?

OS : windows, unix(ubuntu, mint ..), mac 등의 운영체제

Compiler : gcc, visual c++, dev-c++ etc..

Build environment : make, nmake, ant(java) etc..









(출처 : http://gayris.tistory.com/entry/컴파일러의-종류와-역활)

"컴파일러가 하는일은 고급언어를 기계어로 바꾸어주는 일"

(1)컴파일러가 소스를 목적파일로 컴파일하여 목적파일을 만듦
   목적파일만으로는 프로그램을 실행할 수 없음
(2) 따라서 목적파일을 운영체제의 요건에 맞도록 형태를 바꾸고 스타트업이라는 추가코드가 필요함. 이런 처리를 하여 실행파일로 만드는 동작을 링크(link)라고 함.
링크를 하는 프로그램을 링커라고 함

(1) 컴파일러에 의해 컴파일되어 목적파일 생성
(2) 링커에 의해 목적파일이 최종적으로 실행 파일을 만드는
이 과정을 빌드(Build)라고 함

IDE(Integrated Development Environment)?
디버거, 프로파일러, 리소스 편집기 등 개발에 필요한 편의 기능까지 제공하는 환경