이번 포스팅은 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)
최대한 정확한 정보를 공유하고자 항상 신중하게 포스팅을 하고 있지만,
내용에 개선이 필요한 부분이 있을 수 도 있습니다.
혹시나 추가적인 보완이 필요하다고 판단되는 부분이 있다면 댓글로 조언해주세요.
참고하여 수정해놓겠습니다.
* 해당 포스팅이 도움이되셨다면 공감과 댓글 부탁드릴께요 ㅎㅎ
'Computer Language > Java' 카테고리의 다른 글
[파헤치기] java 객체 생성문의 개념 (0) | 2018.11.11 |
---|---|
[파헤치기] public static void main(String[] args) 의 이해 (2) | 2018.09.25 |
동등 비교 연산자( == )와 메소드( equals() ) [개념 및 차이점] (0) | 2018.09.18 |
[파헤치기] Library vs Framework (+API) 개념의 이해 (0) | 2018.08.04 |