이글은 잠탱이 3인방님들의 글입니다.
저자와의 협의없이 함부로 Reposting될 수 없음을 알려드립니다.
2. 사건(Milestone)들을 위한 메쏘드
먼저 저번 강좌에서 예제로 썼던 Simple.java 화일을 기억하시죠. 오늘도
역시 그 소스화일을 가지고 계속 설명드리도록 하겠습니다.
Simple 애플렛을 보시면서 이런 의문이 생기신 분들이 있을지 모르겠군요.
뭐냐하면... 어떻게 main(..) 도 없고, 클래스내에 메쏘드 호출도 없는 것 같
은데, 프로그램이 실행이 되나??? 그렇다면, 메쏘드가 쓰여진 순서에 의해
실행이 되는건 아닐까 하고 생각하신 분들도 계실 것 같습니다만, 그건 아
니구요.... ( 순서를 바꿔도 똑같이 동작함. )
모든 애플렛이 Applet 클래스의 서브클래스이어야 한다고 전에 설명드린
것 기억하시죠.
바로 이것이 정답(?)입니다. 먼 소리냐구요???? 그럼 설명을 드리지요.
Applet 클래스에는 여러가지 메쏘드들이 포함되어있는데, 여러분들께서 작
성하신 애플렛에서 발생할 수 있는 주요한 사건(event)에 반응할 수 있도
록 4개의 메쏘드(init(), start(), stop(), destroy() 메쏘드)들이 오버라이드
(override) 됩니다. 이 4개의 메쏘드들은 애플렛에서 직접적으로 호출되어
지는 것이 아니라, 자동적으로 호출되어집니다.
그래서 Simple 애플렛에서 직접적인 호출을 하지 않았는데도 자동적으로
일련의 순서를 갖고 실행이 되어지는 것입니다.
아래는 각 메쏘드들이 하는 일에 대한 간단한 설명입니다.
◎ init() : 애플렛이 로드(또는 리로드)될때마다 애플렛을 초기화합니다.
◎ start() : 애플렛이 로드될때나 사용자(user)가 애플렛을 포함하는 페이
지에 다시 방문할때와 같은 경우에 애플렛의 실행을 start 합
니다.
◎ stop() : 사용자가 애플렛 페이지를 떠나거나 브로우져를 나가는 것과
같은 경우에 애플렛의 실행을 stop합니다.
◎ destroy() : 언로딩(unloading)을 준비하기 위해 final cleanup을 수행합
니다.
(참고적으로 Applet 클래스에 있는 이 메쏘드들 내에는 아무것도 없고 그
냥 이름만 선언되어 있습니다.
예 : public void init() {}
이것을 여러분의 애플렛에 오버라이드 하는 것이죠.)
하지만, 모든 애플렛에 위에 있는 4개의 메쏘드들을 모두 오버라이드할 필
요는 없습니다. 어떤애플렛이냐에 따라 쓰는 것도 있고, 안 쓰는 것도 있
죠. 예를 들어, "Wakeup" 애플렛에서는 초기화 후에 아무것도 하지 않기
때문에, start(), stop(), destroy()를 오버라이드하지 않았습니다.(기억을 하
지 못하는 분은 빨리 찾아보시길....) 따라서 "Wakeup" 애플렛은 init() 메
쏘드를 사용해서 단지 스트링을 "한 번"만 화면에 표시합니다. 하지만 단
지 스트링을 화면에 출력하는 애플렛을 만들기 위해 이런 고생을 하는 것
은 아니니깐......대부분의 애플렛들은 여러 가지 동작을 하도록 만들어야 겠
지요.
그럼 어떤 경우에 위에 있는 메쏘드들을 사용해야 하는가????
초기화 후에 화면상에 출력되어지는 모양에 변화를 주거나 사용자의 행동
에 반응을 하도록 만들고싶다면, 애플렛에 start() 메쏘드를 오버라이드해
야만 합니다. start()는 애플렛의 작업을 수행하거나 작업을 수행하는데
필요한 객체들을 설정하기위한 메쏘드 입니다.
start()를 오버라이드하는 대부분의 애플렛들은 stop() 메쏘드 또한 오버라
이드합니다. stop() 메쏘드는 사용자가 애플렛의 페이지을 보고있지 않을
때, 시스템 자원(resource)를 차지할 수 없도록 애플렛의 실행을 중지시키
게 됩니다. 예를들어, 애니메이션을 보여주는 애플렛은 사용자가 그것을
보고있지 않을때는 애니메이션을 보여주는 것을 중지하여야만 하겠죠.
많은 애플렛들에서 destroy()메쏘드는 거의 쓰지 않는 것 같더라구요. 왜냐
하면 stop()메쏘드가 애플렛의 실행을 중지하는데 필요한 일을 하기 때문
이랍니다.(stop()메쏘드는 destroy() 메쏘드보다 먼저 호출되어집니다.)
아래에는 일반적인 애플렛의 형태입니다.
public class ...... extends java.applet.Applet ..... {
..........
public void init() { ..... }
public void start() { ..... }
public void stop() { ..... }
public void destroy() { ..... }
..........
}
이것으로 Simple 애플렛내에 있는 init(), start(), stop(), destroy() 메쏘드
에 대한 설명은 마치겠습니다. 다시한번 강조하자면, 위의 메쏘드들은 여러
분이 호출하는 것이 아닙니다.!!!!!
이제부터는 paint(...)메쏘드에 대해서 설명하도록 하죠. 이것 또한 상속받은
클래스에 있는 메쏘드를 오버라이딩한 것입니다.
Simple 애플렛은 paint(...) 메쏘드의 오버라이딩을 통해 "화면출력의 모양"
을 정의합니다.
paint(...) 메쏘드는 애플렛이 오버라이드할 수 있는 두가지의 화면출력 메
쏘드들중 하나입니다.
◎ paint(...) : 기본적인 화면출력 메쏘드이고, 대부분의 메쏘드들은 브로우
져 페이지에 애플렛을 표현하기 위해서 이 메쏘드를 사용합
니다.
다른 하나는,
◎ update(...) : 그리기 작업을 갱신내기 개선하기위해 paint(...) 다음에 사
용할 수 있는 메쏘드입니다.
paint(...) 와 update(...) 메쏘드는 Applet 클래스로부터 상속을 받습니다. 그
리고 Applet 클래스는 이 메쏘드들을 Component 클래스로부터 상속받습니
다.(중간과정은 생략, Applet 상속계보도 참조)
즉, paint(...), update(...) 는 Component 클래스내에 있습니다.
두 메쏘드는 Graphics 객체를 매개변수로 받아 화면출력을 하게끔 합니다.
그리고 화면출력의 모양은 paint(...) 메쏘드내에 여러분이 쓰시면 되구요.
재미삼아..... paint(...)메소드 안에 아래에 적힌대로 써보세요.( 물론 이 메
쏘드들은 Graphics 클래스에 포함되어 있는 겁니다. )
g.drawLine(40,50,50,100);
g.drawRoundRect(100,50,100,100,20,20);
다 쓰셨으면, Simple.java 를 다시 컴파일 시킨후 브로우져로 보시면 처음
과는 다른 화면 출력을 보실 수 있을 겁니다. 직선과 모서리가 둥근 사각
형이 보이시죠. 이렇게 여러분이 의도한 대로 화면 출력을 하게 만드는 기
능을 하는 것이 바로 이 paint(..) 메쏘드의 역할입니다.
그럼 repaint()는 무엇인가??? 이것은 paint(...)를 재 실행하는 메쏘드라고
할 수 있죠. 그리고 7번째 라인의 resize(.....)는 화면 크기를 바꾸는 메쏘
드라고 할 수 있습니다 첫 번째 매개변수는 너비를, 두 번째 매개변수는
높이를 나타냅니다.
이제 마지막으로 addItem(....)는 버퍼에 지정 스트링을 넣기 위한 메쏘드
입니다. 즉 , buffer.append(....)를 통해 버퍼에 넣게 되지요. buffer 는 저번
강좌에서 언급했으니 다들 아실 줄 압니다.
이렇게 addItem(...)에서 버퍼에 넣어진 스트링은 paint(...) 메쏘드내에 있는
drawString(...)의 첫 번째 매개 변수인 buffer.toString()을 통해 넘겨받게
됩니다. 여기서 toString() 은 버퍼에 있는 데이터를 스트링으로 변환하는
역할을 하죠.
이것으로써 간단한 Simple.java 소스의 분석을 바치도록 하겠습니다.
그럼 HTML에 어떻게 애플렛을 포함시키는가???
이것은