본문 바로가기

JAVA_School/JAVA_School_class

[0508] 패턴중심적사고와프로그래밍

class는 object를 만드는 틀이다. 클래스는 실제로 안에 값이나 실체가 있지를 않는다. 만들기 위한 틀이기 때문이다. 이것이 실제로 채워져서 어떠한 동작이 가능하려면 메모리에 올라와서 cpu가 실행을 해야 한다. 이것이 instance라고 한다. 

여러분들은 피와 살로 구성되어있다. 여러분 머릿속에 있는 것은 타입이다. 그런식으로 class와 object는 그것을 만들어내는 틀이고, 하나는 실제로 만들어진건데 만들어지면 왜 만들어졌냐면 실행하기 위해서 만들어진 것이다.

메모리를 할당한다는 것은 그 안에 값이 채워졌다는 것이다. 값이 채워졌다는 것은 값이 채워진 특정 object의 추상적 표현을 상태라고 한다. 근데 그것은 어떤 관점에서 보느냐에 따라 달라진다. 졸려온 상태 배고픈 상태 여러가지가 있다. 이것은 다 다른 관점에서 얘기하는 것이다. 상태는 뭘로 표현할 수 있냐면, object가 가지고 있는 값으로 표현한다. object가 내부에 가지고 있는 값으로 표현된다. class는 값이 없다. 그 값을 정의하기 위한 정의가 있을 뿐이다. object가 스위치라면? 스위치가 on이나 off라는 값을 가지고 있을 것이다. 스위치가 켜졌냐 꺼졌냐의 값이다. on이 true 냐 false냐 이러한 것이다. 배고프다 그러면 혈당이라는 필드가 있다. 

상태라는 것은 이 어떤 class(값을 가질 수 없음. 값을 담기 위한 field를 정의하는 것)가 아님

그것을 이용해서 객체가 만들어지면 그 필드에 값이 채워진다.

event는 외부에서 무언가가 발생을 해서 내가 무엇을 할까를 생각한다. 신호등이 바뀌면 이벤트가 발생해도 아무것도 안해도 상관없다.

ex) object1이 object2에게 이벤트를 주려고 하면 object1에 있는 대부분의 함수가 실행되게 되어있다. 100%는 아니다.

 

함수 호출은 object1이 Function call을 하면 object2에게 f2를 하라는 문구를 바로 준다. (강제를 시키는 것)

event driven programming은 이벤트가 발생했다고 알려주고 그 판단은 받는 사람이 한다. 

event driven programming과 함수 호출은 차이가 있다.

유연성이라는 것은 상황과 조건에 따라 다양하게 다른 일을 할 수 있는 것을 말한다. 얘가 어떤 상태임에 따라 다른일을 하는 것이다. 이것을 되게 유연하다고 한다. 유연하다는 것은 약간의 모호성을 포함하는데, 모호성은 작위적이지가 않다. 랜덤으로 지 멋대로 되는 것이 아닌, 일정한 규칙을 가지고 있다. 즉, 확정적 다형성을 가진다. 

자기 마음대로가 아닌(불확정성, 다형성x) 것이다.

우리가 짜는 프로그램 스타일은 event driven program 함수 기반의 프로그램이다.

Event는 어떠한 이벤트를 수식하는 object의 상태를 바꿀 수 있다. 객체지향에서 함수는 항상 내 내부의 값을 바꾼다. 객체지향에서 object1이 object2로 바꾸면 달라진다.

객체지향에서는 어떤 일이 벌어지면 내가 무슨일을 하게 되어있다. 내가 내 필드의 값을 바꾸는 것이다. 값을 바꾸면 상태가 바뀌어진다. 뭔가 내 내부의 값이 바뀌면 상태가 바뀐다. 

Event > Function call > Field value Change > State Change

Event가 발생을 하면 상태가 변한다.

Eidle상태로 계속 있다. (상태를 변하지 않으면) 마우스가 press가 되면 Drawing상태로 바뀐다. 

S1에서 S2로 바뀐다. 

Event가 발생하면 상태가 바뀐다. action이 일어나기 때문이다. 

안에있는 field의 값이 바뀌기 때문이다.

이벤트가 발생을 해서 action이 실행을 한다. 신호가 바뀌면 자동차가 서있는 상태에서 달리는 상태로 바뀐다. 그리고 신호가 빨간불이 되면 자동차가 달리는 상태에서 서있는 상태로 바뀐다.

상태라는 것이 객체가 복잡할수록 경우의 수가 많이 나온다. 예) 피부의 노화상태, 피로 상태, ... (경우의 수가 매우 많아짐)

상태라는 것을 정의하는 것이 쉽지 않아 AI가 진행한다.

스위치를 올리는 event - 전기 on / 이벤트는 스위치가 press라는 이벤트가 발생을 하면 전등이 on상태에서 off상태가 된다.

상태라는 것은 똑같은 event가 발생을 했는데, 하나는 Off 상태였다가 ..

State tranditional diagram : 같은 object가 시간에 따라 다른 상태로 바뀐다.

스위치 OFF - ON (둘다 switch press, 이벤트는 같은 이벤트이지만, 현재 어떤 상태인지에 따라 action이 달라진다.)

똑같은 이벤트라 하더라도 현재 상태가 어디있느냐에 따라 이벤트가 달라진다.

 

같은 이벤트가 발생했는데, action이 다르다. 위는 switch on, 밑은 switch off
이벤트라는 것은 이벤트에다가 내가 현재 어떤 상태인지? 

내가 받는 주관적인 acction이라는 이야기이다. 그것뿐 아니라 얘를 둘러싸고 있는 contact에 따라 달라진다.

전기가 지금 들어오지 않는다. 외부의 제약 조건이라는 것이다. 즉, 상태라는 것은 어떤 object의 내부의 값이고 제약조건이라는 것은 외부의 값이다. 

같은 값인데, 영향을 주는 외부의 값과 내부의 값의 차이라는 것이다. 제약 조건은 외부의 값이다.

그러니까, 마우스 press를 누를 때 얘 상태가 eidle이니까 땡겨진다. 

제약조건이 네모가 눌려있으면 네모가 그려진다.

dragging뿐만 아니라 eidle상태에서 마우스를 움직이면 그냥 움직이는 것,

but polygon을 그리고 있는 상태에서 마우스를 움직인다면 polygon이 지우고 그리고 라는 작업을 반복하면 polygon을 그리게 된다.

즉, mouse move의 의미가 달라진다. 이유? 이 전 상태가 다르기 때문이다.

이벤트의 의미 어떤 액션을 취할건지를 정하는 것은  event가 발생했다는 것이다.

이벤트가 발생하는 시점에 항상 판단을 한다. 제약조건과 상태는 지속적으로 존재하고 있고 내가 액션을 취할지 말지는 이벤트가 발생하는 시점에 판단을 한다.

이벤트가 전체적인 프로그램의 flow를 결정한다. 굉장히 중요하며, 이는 수도없이 계속 나올 것이다. 

 

예제) 사거리 신호등

- 사거리 신호등의 원소는 12개의 전구로 구성되어있다. 3x4 = 12 (on, off 가 된다면 2의 12승(4096)의 경우의 수가 나온다)

동서가 직진할 때에는 남북은 서있어야 한다. 여러가지 제약조건을 따지다보면 전체 신호등은 4가지밖에 안 나온다.

event 는 time out event가 발생한다. 

 

똑같은 timeout이지만 어떤 상태에서 timeout이 일어났느냐에 따라 action이 달라진다. 이게 Event driven ,state driven 상태 기반이다.

언제나 확정적인 프로그램이어야 한다. 두길이 있으면 항상 명확하게 이거 아니면 이거라는 조건이 하나 걸려야 한다. 

program을 짤 때에는 확정적 상태를 만들어 내야 한다. 화살표는 tradition이라고 한다. 상태가 전이된다고 한다. 

 

상태 다이어그램 그려라 퀴즈봄 EX) atm banding machine car..

Npdrawing 이랑 2pDrawing이 같다 다시 그려와

nbgate가 없게 guard로 다 막아라.