Wanna be Brilliant Full-Stack Developer
JAVA 이벤트 리스너 원리 본문
이벤트 리스너는 윈도우라는 OS안에 돌게 되어있다.
이 위에서 JVM이 동작을 하는데 여기에 JFRAM을 하나 만들었다.
우리가 리스너를 등록하게 되는데?
리스너를 만든다는 개념은?
이 OS가 사람으로 변신을 하는데!? 멀 지켜보는가 하면? 키보드라는 애를 지켜보고 있다.
이 지켜 보는것이 리스너 라는 것이다!
리스너를 등록되었기 때문에 리스너를 등록한다는것은? 리스너를 하나 만들고
그다음에 리스너가 키보드를 바라보고 있는데 키보드에서 무엇을 볼껀가?
어느키를 누르는지 바라볼것이다!
바라보기만 한다고 의미가 없다. 바라보기만 할때 이때!
이상한 메모리 공간을 하나 만드는데 이벤트 루프!
이벤트 루프가 차곡차곡 칸이 있는데!
사용자가 LEFT 버튼을 누르면 이벤트 루프에 등록이 된다.
리스너가 지켜보고 있다가 사용자가 left버튼을 클릭하면 이벤트 루프에 Left버튼을 클릭했다는 정보가 등록이 된다.
이벤트 루프에는 left버튼 이벤트밖에 없기 때문에 그 다음에는 저 left가 이벤트 핸들러를 호출한다.
여기에 이 이벤트 핸들러가 무엇인가 하면?!
그냥 Stack공간이다. 메서드의 내부라는것이다.
여기 에 있는 어떤 코드를 실행하게 되어 있다.
만약에 이벤트 핸들러가 안만들어져 있으면 리스너가 키보드를 보고 있다가 left버튼으 클릭 되면
이벤트 루프에 등록이 되고 이벤트 루프에 레프트 밖에 없으니까 그걸 실행하려고 하는데
Stack에 없으면 실행할 코드가 없는 것이다.
근데 우리는 있다.
결국 이 전체 코드 이 공간이 이게 이벤트 핸들러이다.
키보드를 클릭할때마다 이벤트 핸들러 부분이 실행이 된다.
left 버튼을 동시에 10번을 누른다고 하면? left 이벤트가 열번이 이벤트루프에 들어오는 것이다!
첫번째 레프트 에대한 처리와 두번째 10번째까지 순차적으로 처리를 하는데!
이건 Quue이다. 먼저 들어온 아이들부터 실행이 된다!
정리를 해보자면
이벤트라는것은 리스너라는것을 만들어야한다! 그게 지켜보기 때문이다.
이벤트 루프라는것은 원래 자동으로 만들어진다. 리스너를 우리가 만들고 이벤트 핸들러 stack공간을 또한 만들어야한다!
리스너를 우리가 addKeyListener를 만들고 그안에 이벤트 핸들러인 stack을 등록했다!
그러면 리스너라는 애는 엄청 바쁘다. while을 들고 무한적으로 키보드를 지켜보니까 바쁘다.
키보도를 계속 지켜보니까 바쁘니까 우리가 개념을 하나 잡아야 한다는것은?
아주 중요한것인데! 스레드 슬립을 2초를 주면!? 굉장히 무거운 stack인데
Right버튼을 연속적으로 5번을 누르니까?
어떻게 되는가하면? 순서대로 쌓이니 순서대로 처리를 해야하는데 1번 처리를 하는 시간이
2초가 걸리니까 2번도 2초있다가 실행되고 5번까지 총 10초가 걸리게 되는데 여기서 문제가 무엇인가하면?
절대로 그림 변경 시점은 무조건 이벤트 루프에 모든 임무(task)가 완료되어야 다시 repaint가 된다.
지금은 Right클릭을 5번 누르면 10초 있다가 한번에 repaint가 되고 있다.
지금 여기서 오른쪽으로 이동을 하다가 점프를 하고 싶다고 하면?
오른쪽으로 이동으로 하는 이벤트를 계속 처리하고 있는데 점프가 될것인가?
오른쪽키를 누르다가 점프를 누르면 더이상 오른쪽이 진행이 안된다.
점프하면서 오른쪽으로 못간다는것이다. 한가지 방향밖에 못움직인다는것이다.
왜그런가하면?? Thread가 하나이기 때문이다.
스레드가 하나 일때는? 이벤트 루프에 Right키가 계속 들어오다가
Right키가 들어오면 처리하는데 아주 가벼운 stack(이벤트 핸들러)이기 때문에 빠르게 처리가 될 수 가 있다.
근데 R키를 막 눌ㄹ지고 있는 상태에서 up키를 누르게 되면 두개가 동시에 실행될 수가 없다.
R키가 막 눌리고 있으니까 계속 들어오고 있는 상태에서 up이 들어오는 순간 r키가 안눌려지고
up만 들어온다.
한번에 하나의 일밖에 못한다.
왜냐하면? 메인 스레드만 있으면 메인 스레드가 key를 전달을 이벤트 루프에 하게 되는데!
키 전달을 해야하는데 키를 R과 up을 동시에 누르게 되면 전달할수 있는것은 이 둘중에 하나라는 것이다.
왜냐하면 스레드가 하나밖에 없기 때문이다!
기억해야할것은 이 두가지가 굉장히 중요하다!
그림 변경 시점은 이벤트 루프가 모든 임무가 완료되어야 repain가 되고!
메인 스레드만 있으면 key전달을 동시에 할 수 가 없다!
이건 모든 프로그램이 동일하다. 자바는 스레드라는것을 이용하는데!
다른 언어들은 스레드가 아니라 비동기프로그램으로 스레드 하나로 비동기 처리하는 방식을 하는데?
그것은 몰라도 된다.
'Some Memos > Java' 카테고리의 다른 글
JAVA 소켓통신 실습(스레드) (1) | 2023.04.25 |
---|---|
JAVA 소켓 통신 #3 클라이언트 소켓 (0) | 2023.04.25 |
Java 소켓통신 #2 (0) | 2023.04.19 |
JAVA 소켓통신의 개념 #1 (0) | 2023.04.13 |
Java BufferedReader란? (0) | 2023.04.13 |