Computer Language/Java

[파헤치기] GUI Swing : getContentPane() 동작의 흐름

짠백이 2018. 9. 23. 17:37
반응형


이번 포스팅은 java GUI library Swing를 사용하면서 궁금하였던 JFrmae의 객체 메소드인 


getContentPane()의 동작 흐름을 파헤쳐보려고합니다.


라이브러리는 수 많은 동작을 하기 때문에 현실적으로 세부적인 흐름까지 파악하는것은 오래걸릴 뿐아니라


의미가 줄어든다고 생각하여 맥락을 파악하는 관점에서 포스팅을 하겠습니다.





이번 라이브러리 동작의 흐름은 Swing 뿐만아니라 다른 library에도 자주 활용되기 때문에


이를 이해 할 수 있다면 다른 라이브러리를 이해하는데도 도움이 될 것 이라고 생각합니다.



( ex) getter, setter, create ... )



JFrame의 상속







sample code1, 2



우선 간단하게 작성한 샘플 코드부터 말씀드리겠습니다.


샘플 코드에 대한 이해는 이번 포스팅에서는 중요도가 낮기 때문에 간략하게만 설명하겠습니다.


[1. sample code 1]


JFrame클래스를 상속 받은 MainFrame클래스를 정의하였으며, contentPane을 cardLayout을 적용하였고, 


contentPane에는 2개의 Card Panel을 부착합니다.






Frame의 구성요소(=Conponent)인 ContentPane 의 setting을 위하여 JFrame클래스의 객체 메소드인 


getContentPane() 호출하였으며, 해당 method에서 반환된 값을 


Container 타입의 reference variable(참조변수)에 저장하였습니다.






또는 아래의 [코드2] 처럼 ContentPane 의 setting 할 때 마다 getContentPane()을 호출하여 사용하기도 합니다.



[2. sample code 2]





JFrame class 정의부



이제 getContentPane() 메소드의 동작을 자세히 살펴보겠습니다.



* 빨간색 형광팬 : JFrame 멤버 메소드 / 변수

* 노란색 형광팬 : JRootPane 멤버 / 변수





[3. getContentPane() 메소드의 정의부]







라이브러리에 정의되어있는 소스를 확인해보면 getRootPane().getContentPane()를 반환하는것을 알 수 있습니다.




여기서 'getRootPane()'의 반환값으로 'getContentPane()'에 접근하는것으로 보아


'getRootPane()'의 반환값은 특정 객체의 참조값(=객체의 주소값)이라는 것을 알 수 있습니다.



그러므로 'getContentPane()' 메소드는 특정 객체의 메소드입니다.

                            



(* 참고 : getContentPane() 객체 메소드는 2종류입니다. 


첫번째 : 'JFrame' 의 객체 메소드


두번째 : '특정' 클래스'의 객체 메소드)







여기서 한 단계 더 파고들어서 'getRootPane()' 메소드의 정의를 확인해보겠습니다



[4. getRootPane()의 정의부]





[5. rootPane 변수의 정의부]



반환값으로 JRootPane 타입으로 정의된 참조 변수인 'rootPane' 을 반환하는 메소드인 것을 확인 할 수 있습니다.



그러니까 여기서 도출 할 수 있는 첫번째 결론은 위에서 언급하였던 


특정 클래스 객체의 'getContentPane()' 메소드는 JRootPane 클래스의 객체 메소드인것입니다.



그리고 참조형변수 'rootPane'에는 JRootPane클래스의 객체가 JFrame생성자에 의해서 생성 및 할당됩니다





[JFrame 내부 동작]


JFrame() 생성자 -> frameInit() -> createRootPane() -> JRootPane 클래스의 객체 생성 -> setRootPane() 


-> JRootPane 타입의 참조변수 rootPane에 할당





[6. JFrame 생성자 ]




[7. createRootPane]



[8. setRootPane ]







JRootPane class 정의부




그리고 JRootPane클래스에 정의된 getContentPane() 메소드의 정의부분을 살펴보면 아래와 같습니다.




[9. getContentPane() 메소드 정의부]




[10. contentPane 변수 정의부]




getContentPane() 메소드는 Container 타입의 참조변수인 contentPane을 반환하는것을 확인 할 수 있습니다.



그러니까 Container클래스로 만들어진 객체의 참조값을 반환하는 것입니다.






그렇다면 마지막으로 누가? 어디서? 


Container 클래스로 객체를 만들어서 참조값을 


'contentPane'에 할당하는 것일까요?




바로 JRootPane생성자에서 생성하고 반환하는 작업하고 있었습니다.



[ 11. JRootPane생성자 




[ 12. createContentPane() 메소드 ]



[ 13.setContentPane() 메소드 ]





JRootPane생성자는 여러종류의 객체 메소드로 이루어져있는데, 그 중 createContentPane() 메소드를 확인해보면


JPanel 객체를 생성 및 참조값을 할당하고 setContentPane() 메소드에서 그 참조값을 JRootPane의 


객체 멤버변수인 contentPane에 할당하는것을 확인 할 수 있습니다.



( content pane :  JFrame 객체를 생성 할 때 JRootPane 생성자에 의해 Frame에 부착되는 panel )






결 론


JFrame 객체 생성 시 흐름을 정리하면 JFrame생성자에서 JRootPane 객체를 생성하는데 이때 


JRootPane생성자에 의해서 JPanel 객체를 생성하여 LayeredPane에 부착합니다. 



* JLayeredPane = menu bar와 content pane을 관리하기 위한 클래스





그리고 생성된 JRootPane 객체는 JFrame에 부착되고, JFrame 객체 메소드인 getContentPane()에 의해서 


리턴되는 참조값으로 ContentPane에 접근 할 수있습니다.






그 동안 간단한 명령어로 JFrame을 사용하였는데 이번 포스팅을 통하여 내부에는 수 많은 동작을 하고 있음을 


피부로 느끼는 계기가 되었습니다.




앞으로 라이브러리를 쓸 때 감사한 마음으로 사용 할 것 같습니다.







* 메소드 정리


[JFrame class]


getContentPane() : JFrame클래스의 객체 메소드 

(경로 : javax.swing.JFrame)



getRootPane() : JFrame 클래스의 객체 메소드 

(경로 : javax.swing.JFrame)





[JRootPane class]



getContentPane() : JRootPane 클래스의 객체 메소드 

(경로 : javax.swing.JRootPane)




[Container class]


setLayout() : Container 클래스의 객체 메소드   

(경로  java.awt.Container)









최대한 정확한 정보를 공유하고자 항상 신중하게 포스팅을 하고 있지만, 

내용에 개선이 필요한 부분이 있을 수 도 있습니다.

혹시나 추가적인 보완이 필요하다고 판단되는 부분이 있다면 댓글로 조언해주세요. 

참고하여 수정해놓겠습니다.



* 해당 포스팅이 도움이되셨다면 공감과 댓글 부탁드릴께요 ㅎㅎ


반응형