분류 전체보기
훗~
DSLR
Mac
Reference
private
Event에 해당되는 글

[Java] AWTEventMulticaster에 대해서

최근에 몇몇 작업을 하다가 알게된 사실..
왜 이제야 알았을까.. 부끄럽다..(-- )( --);;

Swing component에 mouse event를 처리 하려면..
Component class에 정의되어 있는 addMouseListener(MouseListener l)를 이용해서 리스너를 등록해주면 된다.

단순하게 옵저버 패턴으로 생각하면 되는데..
그래서 일까..
당연히 Component에서 등록되는 각 Listener들을 List<>로 관리하고 있을꺼라고 생각했다..

get***Listener()로 Listener를 얻어오면, 당연히 List<>로 되어 있으니..
머.. 지례짐작으로..;;

그런데 오늘 유심히 코드를 들여다 보니..
Component에는 다음과 같이.. 유지할 Listener별로 필드 하나만 덜렁 있다..;;



아.. 멀까..;;

그래서 좀 더 유심히 코드를 살펴보기로 하고..
일단 Listener가 등록되고 제거되는 시점부터 살펴봤다..





결론부터 말하자면..
그렇다..비밀은 AWTEventMulticaster에 있었다..!!





AWTEventMulticaster  class의 add(MouseListener, MouseListener)를 따라가보면..
각각의 Listener가 AWTEventMulticater 인스턴스로 wrapping되어
트리 구조로 저장되고 있었다.

즉, A, B, C, D, E 순서대로 Listener를 등록하면..
A, B까지는 하나의 AWTEventMulticaster 인스턴스로 저장이 되고..
이후에 C가 등록되면, 이전의 AWTEventMulticaster 인스턴스가 a가 되고, 최근에 등록된 C가 b가 된다..
((A, B), C)
E까지 순서대로 등록이 되면..
결국 다음과 같은 모냥이 된다는 말이다..



어떻게 이런 형태가 가능 하냐면..

AWTEventMulticaster의 생성자를 보면 대충 알 수 있는데..



무식하게도 거의 모든 Listener란 Listener는 모두 구현하고 있는 걸 볼 수 있다..

그럼,
이벤트가 발생하면.. 어떻게 각 Listener를 순서대로 call해줄까??

이 부분은 Listener가 등록 & 제거 되는 과정에 비하면 매우 간단한데..
Listener interface를 다음과 같이 구현하고 있다..



따라서,
현재 Listener가 AWTEventMulticaster이면 recursive call이 되고..
결국 맨처음 등록된 Listener부터 순서대로 call이 된다.. 후덜덜..

하여튼 알면 알수록 무서븐 넘들..;;

그런데..
결국 풀리지 않는 신비는..

도대체.. 왜.. 왜..
이따구로 열심히 머리를 돌려서 구현해 놓은 걸까..??
바보같은 내 머리로는 도무지 이해가 되지 않는다..


설마..설마..
초 절정의 Collection Package가 없던 시점이라 구런건 아니겠지..ㅋ;
락군
*1