Notice
Recent Posts
Recent Comments
올해는 머신러닝이다.
자바게임프로그래밍#1 본문
자바 게임 프로그래밍 강좌 1
하이텔 자바 동호회 김명현 (MadOx@hitel.net)님의 글입니다.
이글은 김명현님의 동의없이 함부로 배포하실 수 없습니다.
안녕하십니까? 친소맨 김명현입니다. 이미 만들어 놓은 문서를 새로 편집하 는것도 장난이 아니군요.. <장장 한시간이나 칸맞추고, 줄그리고, 말바꾸고 등등 난리를 쳤어요> 1 회 분량으로 꽤 많은 내용이 될지 모르겠는데, 다음 부터는 이거보다 더 많아질것 같아서 걱정이네요 :) 잘쓴 문서는 아니지만, 초보자나, 자바 게임프로그래밍에 관심이 있으신 분들에게 도움이 되었으면 좋겠군요... * 본 문서는 Java Development Kit 1.0.2 를 기준으로 작성되었습니다. * Java Development Kit 1.1.x 버젼을 사용할 경우 일부 소스가 실행이 되지 않을 수 있습니다. 1. 기본적인 AWT(Abstract Windows Tookit) 사용법을 배워봅시다. 1.1 AWT란 무엇인가요? AWT는 Java에서 지원되는 기본적인 GUI 컴포넌트들의 집합입니다. Java는 여러 가지 다른 기종들 사이에서 실행될 수 있도록 고안되어졌으므로, 어느 한가지 운영체제에 맞는 GUI라이브러리를 가지고 있을 수 는 없습니다. AWT 는 OS 차원의 GUI 컴포넌트들을 추상화 시키고, 이들에 대해 동일한 인터페 이스를 통하여 접근 통제할 수 있도록 만들어져 있습니다. 때문에 각각의 운영체제마다 가지고 있는 독특한 GUI 요소들을 사용할수 는 없게 되었지만 GUI 운영체제들이 가지고 있는 일반적 요소들을 거의 대부분 포함하고 있으 므로, Java 프로그래머들이 기종을 가리지 않고 실행될 수 있는 GUI 프로그 램을 만들수 있게 합니다. 우리가 앞으로 공부하게 될 Game Programming 도 그래픽 환경에서 수행되 는 것이 대부분이므로, 필연적으로 AWT를 사용하게 될 것입니다. Java 에서 그래픽 프로그래밍은 AWT 를 빼놓고는 이야기 할 수 없는 것이기 때문이죠. 대부분의 Java프로그래머들이 AWT 의 사용법에 대해서 잘 알고 있을 것이라 생각은 되지만, 몇가지 AWT에 대한 예제들을 통해 자신의 실력을 확인해 보 고 넘어가는 것도 좋을 것입니다. 1.2 AWT용 "Hello, world!"를 만들어 봅시다. C언어 시절부터 전통적으로 최초의 프로그램은 "Hello, world!"라는 문장 을 화면에 출력하는 예제였습니다. 우리도 이 아름다운(?) 전통을 이어나가 기 위해 최초로 만들게 되는 프로그램으로 "Hello, world!"를 화면 중앙에 출력하는 것으로 하게 될 것입니다. ● Applet기반의 Hello, world! 독립적인 프레임(Frame) 윈도우를 가지는 AWT 프로그램은 나중에 기회가 닿으면 배우기로 하고, 우선 이해하기 쉽고 프로그램이 간단한 Applet 기반 의 "Hello, world!"를 만들어 보도록 하겠습니다. 소스를 먼저 보고 설명을 하도록 하겠습니다. 01: import java.awt.*; 02: import java.applet.*; 03: 04: public class HelloWorld extends Applet 05: { 06: public void init() 07: { 08: resize(100, 100); 09: } 10: 11: public void start() 12: { 13: repaint(); 14: } 15: 16: public void paint(Graphics g) 17: { 18: g.drawString("Hello, world!", 20, 45); 19: } 20: } [소스1] HelloWorld.java 너무나 간단한 소스라서 설명할 것도 없을 것 같습니다만, 처음 보시는 분들을 위해 간단히 설명을 하도록 하겠습니다. 여러분들이 Java의 기초 문 법은 알고 있다는 가정하에 설명을 해나갈 것이므로 중간에 모르는 부분이 나오면 과감하게 입문서 등을 참고하시기 바랍니다. ● Applet의 기본적인 구조 애플릿(Applet)은 Web Browser에 의해 인터프리팅되는 형태의 프로그램을 말합니다. 즉, 단독 실행은 불가능 하고, HTML 내에 삽입되어져 홈페이지와 함께 보여지는 형태로 실행됩니다. 애플릿은 다음과 같은 기본적인 구조를 가지고 있습니다. import java.awt.*; import java.Applet.*; public class 애플릿이름 extends Applet { public void init() { // 애플릿이 최초 로드되어서 해야할 일들 } public void start() { // 애플릿의 실행이 시작될 때 해야할 일들 } public void paint(Graphics g) { // 애플릿이 갱신되거나 새로 그려져야할 때 해야할 일들 } public void stop() { // 애플릿의 실행을 중지할 때 해야할 일들 } public void destroy() { // 애플릿을 메모리에서 제거할 때 해야할 일들 } } [표1] 애플릿의 기본구조 애플릿은 AWT기반의 프로그램입니다. Web Browser가 GUI기반의 프로그램 임을 감안할 때 당연한 것이라 할 수 있겠습니다. 그러므로 애플릿은 AWT패 키지를 import해야 합니다.(import는 C언어에서 include와 비슷한 개념입니 다) 또, 우리의 애플릿은 기본적인 애플릿 뼈대에서 파생되는 서브클래스로 구현이 되므로, 기본적인 애플릿의 내용을 담고 있는 java.applet.Applet 패키지도 import 해야 할 것입니다. (제일 위에 두줄은 무조건 적어줘야 한 다고 생각하시는게 편할껍니다) 다음으로 위의 [표1]에서 볼 수 있듯 애플릿은 기본적으로 5개의 내부 메 소드를 가지고 있습니다. 이것 외에도 여러 가지의 메소드를 가지고 있습니 다만, 그런것들은 차차 배우기로 하고 이 절에서 필요한 것들만 알아보도록 하겠습니다. ◇ public void init() 메소드 이 메소드는 Web Browser나 AppletViewer에 의해 애플릿이 시스템으 로 로드된후 최초로 불려지게 됩니다. init()메소드는 최초로 start() 메소드가 실행되기전에 반드시 실행됩니다. ◇ public void start() 메소드 이 메소드는 Web Browser나 AppletViewer에 의해 애플릿이 실행되는 때에 불려지게 됩니다. 위에서 말했듯이 init()메소드가 실행된후 불려 지게 되고, 이미 방문했던 홈페이지를 다시 방문할 때 init() 메소드가 아닌 start() 메소드 부터 불려지게 됩니다. (여기에서 이미 방문했던 홈페이지라는 것은 아주 매우 오래전에 방문하여 브라우져 캐시에 겨우 남아 있을 법한 홈페이지를 말하는 것이 아니라, 몇번 이전 페이지버튼 을 눌러서 갈 수 있는 정도의 페이지를 말합니다. 다시 말하자면, 애플 릿 인스턴스가 메모리에서 완전히 제거되기 이전의 상태인 홈페이지를 말합니다.) ◇ public void stop() 메소드 이 메소드는 Web Browser나 AppletViewer에 의해 애플릿의 실행이 중 단되는 때에 불려지게 됩니다. 보통 현재 애플릿이 포함되어 있는 홈페 이지에서 다른 홈페이지로 이동할 때 불려지며, Web Browser나 Applet- Viewer를 종료할때에도 destroy() 메소드에 앞서 이 메소드가 불려지게 됩니다. ◇ public void destroy() 메소드 이 메소드는 Web Browser나 AppletViewer가 현재 실행중인 애플릿의 수행을 완전히 종료시키고, 애플릿을 위해 할당한 자원(Resource)을 반 환시키는 등의 작업을 하게 됩니다. 물론 이 메소드도 자신이 수행되기 이전에 stop()메소드를 먼저 수행하게 됩니다. ◇ public void paint(Graphics g) 메소드 이 메소드는 원래 애플릿의 메소드가 아니라, 애플릿의 까마득한 조 상인 Component라는 클래스의 메소드입니다. 애플릿의 족보를 살펴보면 Component 클래스로부터 파생되어 Container 를 거치고, Panel 을 이어 받아 Applet까지 오게 되는데, 이런 연유로 인해 paint 메소드가 애플 릿에 포함되게 된 것입니다. 이 메소드가 하는 일은 이름 그대로 현재 자신의 영역을 새로히 그리는 일을 하게 됩니다. 예를들어 애플릿의 영 역위에 MS-Windows의 계산기가 나타났다가 없어졌다면 애플릿의 상당부 분이 계산기에 의해 지워졌을 것입니다. 이럴 때 Web Browser나 Apple- tViewer는 paint()메소드를 호출하여 애플릿 영역을 새로그리도록 합니 다. 이상으로 애플릿의 기본적인 구조에 대해 알아 보았습니다. 이제 다시 본 론으로 돌아가서 [소스1]에 대한 분석을 해보도록 하겠습니다. (너무 오래 전 일이라 소스가 기억나지 않으시는 분들은 다시 앞으로 돌아가 천천히 읽 어보시기 바랍니다. 좀전에 알아본 애플릿의 기본구조 덕택에 좀더 많은 부 분을 이해하실 수 있을지도 모릅니다) 우선 1-2번 라인은 AWT 패키지와, Applet 패키지를 import 시키는 것입니 다. 다음으로 4번 라인을 살펴보면 HelloWorld라는 이름의 클래스를 Applet 으로 부터 파생시키는 것을 알 수 있을 것입니다. 이제 HelloWorld는 애플 릿의 일가족이 되었습니다. 6-9번 라인까지는 init() 메소드에 대해서 정의되어 있습니다. 여기에서 하는 일은 애플릿의 사이즈를 100x100으로 조정하는 일입니다. resize() 메 소드 역시 애플릿의 여러 가지 메소드 중 하나이며, 애플릿 영역의 크기를 조절하는 역할을 합니다. 11-14번 라인은 start()메소드에 대해서 정의되어 있는데, 별로 하는일은 없어 보입니다. 단순히 repaint()라는 메소드를 한 번 불러주는군요. repa- int() 라는 메소드는 paint() 메소드와 마찬가지로 애플릿의 메소드가 아닌 애플릿의 윗대 조상의 메소드 입니다. repaint()가 하는 일은 단순히 pain- t()메소드를 불러주는 일입니다. 궂이 우리가 repaint()메소드를 불러주지 않더라도 Web Browser나 AppletViewer에서 자동으로 paint( )메소드를 불러 줄 것입니다만, 이 기회를 빌어 repaint()메소드를 설명하기 위해서 한줄을 넣어 보았습니다. 16-19번 라인까지는 paint()메소드에 대해서 정의되어 있습니다. 내용을 살펴보면 g.drawString("Hello, world!", 20, 45); 위와 같습니다. g 라는 객체의 drawString() 메소드를 호출 하는 것인데, g는 paint(Graphics g)라는 문장을 볼때 Graphics형태의 객체임을 알 수 있 습니다. Graphics객체는 나중에 공부하도록 하고, 위의 문장을 계속 분석해 보면 (20, 45)영역을 좌측 상단으로 Hello, world! 라는 문장을 출력하시오 라고 되어 있으므로 Java는 우리가 시키는 데로 (20, 45)영역에 Hello, wo- rld! 라고 예쁘게 출력해 줄 것입니다. 그런데 stop() 이나 destroy() 메소드는 [소스1]에서 보이지를 않습니다. 잘 보셨습니다. [소스1]에서는 별도의 메모리 할당이나 쓰레드를 생성시키 지 않았으므로, 애플릿을 종료할 때 특별하게 해주어야 할 일이 없습니다. (단순히 화면에 글자 몇 개 출력하는 것으로역할을 다하는 것이죠) 그래서 stop()이나 destroy()메소드는 생략한 것입니다. 사실 init()나 start() 메 소드도 생략가능합니다. 물론 생략했을 때 Web Browser나 AppletViewer 는 HelloWorld의 부모인 Applet의 start(), init(), stop(), destroy() 메소드 들을 호출 할것입니다. 분석도 끝냈으니 실행을 해봐야겠죠?. 위의 [소스1]을 'HelloWorld.java' 라는 이름으로 저장했다면, 컴파일을 해봅시다. ● 컴파일 방법 ◇ JDK1.x 에서의 컴파일 javac 프로그램파일명.java ◇ Symantec Cafe 또는 VisualCafe javac 프로그램파일명.java 또는 통합환경에서 소스코드를 불러와서 Compile메뉴를 선택해도 됩니 다. ◇ Microsoft Visual J++ jvc 프로그램파일명.java 또는 통합환경에서 소스코드를 불러와서 Compile메뉴를 선택해도 됩니 다. 컴파일을 해보면 다른 종류의 언어 컴파일러에 비해 결과가 무척이나 무 뚝뚝 합니다. 에러가 있다는 메시지가 보이지 않으면 실행을 해보도록 하겠 습니다. (만약 에러가 난다면, 위의 오자가 난것이 없는지 잘 체크 하십시 오.) 아차! 한가지 빼먹은게 있군요. 우리가 만든 프로그램은 애플릿 형태 의 프로그램이 었습니다. 즉, Web Browser나 AppletViewer에 의해 실행가능 한 프로그램이란 이야기이죠. 그러므로 실행에 앞서 Web Browser가 읽을 수 있도록 HTML파일을 우선 만들어 줘야 합니다. 우리가 만들어 줘야할 HTML파 일의 내용은 [소스2]와 같습니다.01: 02: 03: 04: HelloWorld Applet 05:
06: 07: 11:
12: 13: 11:
12: