[0320] 패턴중심사고와프로그래밍
플랫폼이라는 것은 우리에게 서비스를 제공하는 어떠한 대상이다.그러니까 os입장에서는 하드웨어가 플랫폼이다 상대적인 개념이다. 이렇게 해서 대부분 여러개의 application이 공유를 하고 있다. 버스나 지하철 같은 것들이다. 거기에 내 자리가 있을 수는 없다. 그러니까 내가 플랫폼을 이용할 수는 있지만 플랫폼이 내 서비스로 뭘하는 것은 아니다.
플랫폼에서 제공하는 기능이 어떤 경우냐면 callback Function 서비스를 사용할 때 요청하는 것이 아니라 이 서비스가 준비됐을 때 알려준느 것이다. 마우스 핸들링같은거다. 내가 마우스보고 어딨냐 어딨냐 물으면 계속 물어봐야 한다.
그렇게 되는 것이 아니라 이것의 관리자가 os이기 때문에 마우스가 다운되거나 그럴때에만 알려주는 것이다. 마우스가 뭘하는 것인지도 모르는데 계속 물어봐야해. 어떻게 변화할지 모르는데 루핀 도는지 계속 물어본다. Callin이라고 한다. 하드웨어에서는 실제로 돌고 있다. 하드웨어는 마우스 키보드가 눌리면 버퍼에 쓴다. 거기서 반복적으로 있는거다. 시계를 둬가주고 주기적으로 단위를 읽고 앉아있다. 값이 들어왔냐 안들어왔냐. 우리 프로그램이 루핀을 돌면서 그러면 cpu를 엄청나게 쓴다. 루핀을 돌리면 cpu의 점유율이 엄청 많아진다. 이거는 임베디드 소프트에서는 이러한 경우가 많다. ex.비행기
상당 부분 누가 만들어놨다.
callback 함수 : os에 마우스가 변화하는지 체크하는게 아니라 os가 미리 기능을 갖고 있고 내가 등록을 하는것이다. 마우스가 움직이면 이 함수 호출해달라. os가 권장하는 이벤트가 발생하였을 때 내가 가진 함수의 일부를 호출해준다. 이걸 이벤트 핸들러라고 자바에서 만들어놨다.
우리가 호출하는 함수를 똑같이 만들어 놓는다. 그 함수가 어떻게 생겼냐면 이름과 파라미터를 동일하게 맞춰놓는다.
Callback함수는 함수의 파라미터를 똑같이 맞춰놔야한다. F2도 함수의 주소이다.
Object2안에있는 F2로 코드가 점프를 하는 것이다. 그때 F2는 이 아이의 파라미터를 알아야한다.
os가 함수를 호출하려면 object의 주소 함수의 주소 다 알아야 한다.
이것을 usb라고 한다면 데이터를 어떻게 보내야 하는지 이를 알아야 한다.
Object의 F2라는 것을 어떻게 아냐면 Object1은 얘가 가진 함수의 형태를 알아야만 호출을 할 수 있다.
os가 우리를 호출했으면 좋겠어. 그러면 os가 미리 함수의 형태를 고정시킨다.
Function Call
Caller가 Callee의
- object 주소
- 함수 이름
- 파라메터 타입
Ex) mainframe.setVisible(true);
- Main -> Frame
Callback
- Object.mouseMoved(Event e);
플랫폼에서 내 함수를 호출할 때 쓰는 함수이다.
Interface Class
함수의 이름만 있다.
플랫폼은 누구나 쓸 수 있는 애들이다. 누구나 쓸 수 있는 공동의 서비스를 가지고 우리가 뭔가를 알려주고 싶을 때 마우스가 움직였다. 키보드가 움직였다. 키가 다운되었다. 버튼이 다운되었다. 키 다운이 되었다. 업이되었다. 수도없는 플랫폼에서 나한테 알려줘야할 내용이 만핟. 그럴 때 우리 프로그램이 받고 싶으면 이러한식으로 연결을 한다. 플랫폼 서비스를 이벤트 서비스에서 주는 이벤트를 알아야 한다. 이 인터페이스가 어떻게 생겼는지 알고. 이 인터페이스의 함수를 채워서 등록을 해야한다. 객체의 주소를 알려줘야 한다. 해당 플랫폼에다가 내 객체의 주소를 알려주어야 한다.
인터페이스를 우리가 구현을 하면 자동으로 여러 함수들이 붙게 된다. 데이터를 보낼 때 이벤트로 보낸다. 그것을 우리가 그대로 받는다. 수많은 마우스 함수들이 많다. 옛날에는 따로따로 등록했는데, 자바에서는 여러개의 인터페이스의 콜백함수를 등록되어있다. 마우스리스너는 버튼, 마우스모션리스너는 어떻게 움직이는지에 말하고 있다.
마우스핸들러는 두개의 인터페이스의 상속을 받았다.
Event-Driven Service/Transaction
Ex) Drawing
button pressed
Mouse moved
Button released
마우스가 버튼이 press가 된 상태에서 움직이면 draging이 되면
마우스 무브가 계속 반복을 하는 것이다. EventDrivenProgram 생각보다 까다롭다. 그냥 화면은 selection. 이 영역에 있는 것이 선택이 된다.
제약 조건과 현재 어떤 상태냐는ㄴ거야. 마우스가 press된 상태에서 마우스가 움직였냐 그런거에서 얘가 하는게 다르다
-> State Transition Diagram
마우스 클릭심 ㅝㄴ가를 그리기 시작한다.
상태가 어떤 상태가 있냐. idle상태와 drawing상태가 만들어진다.
상태라면 속성값이 변하지 않은 동안의 것을 상태라고 한다.
어떤 객체의 변화는 이벤트 driven이라고 한다.
속성은 누가 변화시켜주냐면 그 객체안에 함수 method(메소드)가 변화시킨다. 메소드는 대부분이 내 안에있는 속성값을 바꾼다. 그것을 상태가 바뀐다고 한다. 메소드중에서 속성을 안바꾼느 것도 있다. 백프로 변하는 것은 아니다. 호출은 내가 한다. 그런데 내가 왜 가만히 있는데 호출을 하냐.
어떤 경우에 메소드를 호출하냐면 Event가 발생을 하면 내가 내 메소드를 호출한다.
함수를 호출한다는 것은 setVisible무조건 해야 한다. 마우스 클릭이 발생했다. 그러면 프로그램을 짜는 것이다.
Requirements : Graphics Editor
- Shape
Drawing
- (x,y) (w,h)
- (x1, y1) (x2, y2)
Move Resize
Rotate
user의 인터렉션과 그리는 행위 자체를 분리해서 짠다. 나중에 마우스를 버튼 프레스 클릭 무브로 짜나 프로그램은 거의 변하지 않는다. 위치만 변한다.
지운다는 것은 배경으로 그리는 것이다. 이 안에 배경색을 그려야 한다. graphics에 이미 해놨다.
네모 그리려면 위치(원점), 가로의 길이와 세로의 길이
너비와 높이 가로와 세로의 길이.원점과 대각선을 잡으면 정보의 양이 같다.
내가 무언가를 요청을 해서 완전한 결과가 나올 때까지. 로그인은 서비스가 아니다. 상품구매가 서비스지, 로그인은 서비스가 아니다. 로그인을 하기 위한 수많은 액션중에 하나다. 물품, 상품 구매 배송 이러한 것들은 서비스다. 여기서도 마찬가지다. 내가 만약에 그림을 그릴 때
과제: Dragging을 통해서 그리고 지우고를 계속 해라
쭉 땡기면서 그리고 지우면서 실제로
XOR
Graphics의 백그라운드의 컬러를가지고 그리면 지워져.
그림을 그리는데 백그라운드 컬러가지고 그리라했잖아 이만큼 그림을 그렸어 똑같은 걸 그대로 배경색으로 하면 지워진다. 그렇게 그릴때하면 graphics의 xor라고 쓰면 나온다.
2D로 잡아야한다.
용도가 다르다 아까같이 지우지 않고 새로운 종이에다가 그리고 빠르게 고치는 것도 있다.
그림을 바꿔치기하는 것이다. XOR모드. 더블 버퍼링으로 구현하든지 말든지 알아서 해봐라.
더블 버퍼링.