Core API Tour 2:

java.awt , java.applet Package Tour!

조 국
138-229 서울특별시 잠실본동 193
미소테크 기술개발실
E-mail : venus@misotech.com
URL : http://misotech.com/~venus/
Abstract:
자바 API에는 80년대 중반부터 보편화되여 적용되고 있는 그래픽 사용자 인터페이스(GUI)를 구현할 수 있도록 awt 패키지를 포함하고 있으며, 또한 자바의 빠른 확산에 많은 기여를 한 애플릿, 즉 자바를 지원하는 브로우져에서 동작하는 자바 프로그램을 작성할 수 있게 해주는 applet 패키지도 포함하고 있다.
본 Core API Tour 2 에서는 이러한 패키지들에 대한 전반적인 이해를 목적으로 클래스와 인터페이스 그리고 각각의 메쏘드의 기능과 역할에 대해서 살펴본다.
Keywords:
Java, API(Application Programming Interface), Package, WWW(World Wide Web), AWT(Abstract Window Toolkit), Applet, Application, GUI(Graphical User Interface)

1. java.awt 패키지

AWT는 Abstract Window Toolkit의 약자로 많은 Cross-Flatform 윈도우 라이브러리에 의해 만들어진 제약에서 벗어나 Windows, Motif 등 환경에 무관한 윈도우 생성 툴을 지원한다.

java.awt 패키지는 표준 GUI 컴포넌트들을 가지고 있고, 이것들중에는 여러개의 다른 컴포넌트를 자신의 영역안에 포함할 수 있는 Container라는 특별한 컴포넌트들도 있다. 또한 레이아웃 매니저라는 것이 있어서 컨테이너에 포함된 컴포넌트들의 배치 모양을 지정하는 방법을 제공한다. 이것외에 이벤트, 그래픽, 색, 폰트 등 여러가지 GUI 관련 클래스들이 포함되어 있다.

다음은 java.awt 패키지 클래스들의 계층도이다.

 
   java.awt.Component (implements java.awt.image.ImageObserver*) 
       java.awt.Button
       java.awt.Label
       java.awt.Canvas
       java.awt.Checkbox
       java.awt.Choice
       java.awt.List
       java.awt.Scrollbar
       java.awt.TextComponent
           java.awt.TextField
           java.awt.TextArea
       java.awt.Container
           java.awt.Panel
               (java.applet.Applet*) 
          java.awt.Window
               java.awt.Frame (implements MenuContainer) 
               java.awt.Dialog
                   java.awt.FileDialog

   java.awt.MenuComponent 
       java.awt.MenuBar (implements java.awt.MenuContainer) 

       java.awt.MenuItem
           java.awt.Menu (implements java.awt.MenuContainer) 
           java.awt.CheckboxMenuItem

   java.awt.BorderLayout (implements java.awt.LayoutManager) 
   java.awt.CardLayout (implements java.awt.LayoutManager) 
   java.awt.FlowLayout (implements java.awt.LayoutManager) 
   java.awt.GridLayout (implements java.awt.LayoutManager) 
   java.awt.GridBagLayout (implements java.awt.LayoutManager) 

   java .awt.Event

   java.awt.Graphics 
   java.awt.Color
   java.awt.Font
   java.awt.FontMetrics

   java.awt.Point
   java.awt.Dimension
   java.awt.Rectangle
   java.awt.Polygon

   java.awt.Image
   java.awt.MediaTracker

   java.awt.Toolkit
   java.awt.CheckboxGroup
   java.awt.GridBagConstraints (implements java.lang.Cloneable*) 
   java.awt.Insets (implements java.lang.Cloneable*)


1.1 컴포넌트들

1.1.1 Component 클래스

모든 표준 GUI 컴포넌트들의 수퍼 클래스이다. 이 클래스는 추상클래스(abstract class) 로 정의 되어 있기 때문에 인스턴스화 하여 객체를 생성할 수 없고, 이 클래스를 상속 받는 서브 클래스들의 객체를 생성하여 사용한다.

이 클래스의 메쏘드는 대단히 많으며 모든 서브 클래스들에서 사용된다.

Event 클래스

윈도우 프로그램은 이벤트 중심 프로그래밍 방법을 사용한다.

이 클래스에는 발생된 이벤트에 대한 정보의 보관을 위해 다음과 같은 변수들이 있으며, 이벤트의 형태나 키값 등의 상수들을 가지고 있다.

발생된 이벤트의 처리는 일차적으로 Component 클래스의 handleEvent() 에서 처리되며, 여기에서 각각의 이벤트 형태에 맞는 핸들러(action(), key****(), mouse****(), ***focus() 등)로 관련정보와 같이 보내진다. Component 클래스에 있는 이러한 핸들러들은 아무것도 정의가 되어 있지 않기 때문에 재정의(overiding)하여 사용한다.

인스턴스 변수

예) 이벤트 처리 예제

public boolean handleEvent(Event e) { // Component 의 handleEvnet()에서 처리하지 않는 이벤트 처리시 // handleEvent()를 재정의함. if (e.id == Event.WINDOW_DESTROY) { dispose(); return true; } // 수퍼클래스의 handleEvent() 메쏘드를 사용하여 // 이미 연결되어있는 이벤트 핸들러들을 사용하고자 함. // 만약 필요하지 않다면 return false 를 쓴다. return super.handleEvent(e); } public boolean action(Event e, Object arg) { /* 어떤 컴포넌트에서 이벤트가 발생했는지 검사하여 각각의 기능을 코딩한다. 비교 방법은 세가지가 존재할 수 있다. 1. arg 정보 이용 : arg 정보가 같은 서로 다른 컴포넌트 존재 가능성 있음 if ("OK".equals(arg)) {...} 2. instanceof 이용 : 여러개의 동일한 컴포넌트 존재시 다시 선택문 필요. if (e.target instanceof Button) { ...} 3. 직접 비교 : 동일한 객체명을 가질 수 없으므로 가장 안전한 방법 Button btn; ... if (e.target == btn) { ... } 1 과 2 를 혼합하여 사용할 수도 있음 */ ... } // 이벤트 핸들러들을 재정의 하여 기능을 부여함. public boolean mouseDown(Event e, int x, int y) { if (e.modifiers == 0) { System.out.println("Left Button Down : ( " + x +", " + y + ")"); } else if (e.modifiers == 4) { System.out.println("Right Button Down : ( " + x +", " + y + ")"); } return false; } public boolean keyDown(Event e, int key) { System.out.println("Key Down : " + (char) key)); return false; }

1.1.2 Button 클래스

이벤트 정보및 핸들러

예)

        Button btn = new Button("OK");
        add(btn);

1.1.3 Label 클래스

라벨 컴포넌트는 컨테이너 안에 쓰여지는 읽기 전용의 텍스트이다.

상수
메쏘드

예)

        Label lbl = new Label("Are you Sure?");
        add(lbl);

1.1.4 Canvas 클래스

유용한 기능을 가지게 하기 위해선 이 Canvas 클래스를 상속해서 paint() 메쏘드를 재정의(overiding)해야한다. 단지 Canvas 클래스는 공백의 사각영역만을 화면에 출력한다.

1.1.5 Checkbox 클래스

체크박스는 on/off, 즉 true/false 상태를 갖는 그래픽 컴포넌트이다.

체크박스들을 그룹지으려면 CheckboxGroup 클래스의 도움을 받아야 한다. 동일한 CheckboxGroup 객체로 묶여진 체크박스들은 오직 하나만 on 상태가 될수 있다.

이벤트 정보및 핸들러

예)

        CheckboxGroup cbg = new CheckboxGroup();
        Checkbox cb1 = new Checkbox("High", cbg, true);
        Checkbox cb2 = new Checkbox("Middle", cbg, false);
        Checkbox cb3 = new Checkbox("Low", cbg, false);
        add(cb1);
        add(cb2);
        add(cb3);

1.1.6 Choice 클래스

초이스 컴포넌트는 선택 팝업 메뉴를 나타낸다.

이벤트 정보및 핸들러

예)

        Choice choice = new Choice();
        choice.addItem("applet");
        choice.addItem("awt");
        choice.addItem("io");
        add(choice);

1.1.7 List 클래스

리스트 컴포넌트는 자체 스크롤바를 가지고 있으며 항목을 선택하게 한다. 초이스 컴포넌트와는 다르게 다중 선택이 가능하다.

이벤트 정보및 핸들러

예)

        List list = new List(4,false);
        // visible item #, multiSelection
        list.addItem("Java");
        list.addItem("C");
        list.addItem("C++");
        list.addItem("Visual Basic");
        list.addItem("Visual C++");
        add(list);

1.1.8 Scrollbar 클래스

스크롤바는 일정 범위의 값을 선택할수 있도록 해주는 편리한 도구이다.

상수
메쏘드
이벤트 정보및 핸들러

예)

        Scrollbar scroll = new Scrollbar(Scrollbar.HORIZONTAL, 0,10.0.100);
        // orientation, initial value, visible size, min, max
        add(scroll);

1.1.9 TextComponent 클래스

텍스트를 편집할 수 있는 컴포넌트들의 수퍼클래스이다.

Text Field 클래스 : 한 라인의 텍스트 편집

이벤트 정보및 핸들러

TextArea 클래스 : 여러 라인의 텍스트 편집

예)

        TextField tf = new TextField(10);
        tf.setEchoCharacter('*');
        TextArea ta = new TextArea(10,10);
        add(tf);
        add(ta);

1.2 컨테이너와 레이아웃

컨테이너는 자신의 영역안에 다른 컴포넌트(컨테이너 포함)를 포함할 수 있는 기능을 가지는 컴포넌트이다. 또한 여러개의 컴포넌트를 포함하기 때문에 그것들의 배치모양을 정해주여야 한다. 이러한 배치 방법을 정해놓은 것이 레이아웃 매니저들이며, 만약 정해주진 않는다면 디폴트로 정해져 있는 레이아웃 매니저를 사용한다.

다음은 레이아웃 매니저 클래스과 배치 형태를 보여준다.

1.2.1 Container 클래스

Container 클래스는 추상클래스로 정의되어 있으므로 직접 객체를 생성할 수 없고, 이것의 서브 클래스들을 사용한다.

1.2.2 Panel 클래스

패널은 가장 간단한 컨테이너이다. 이것은 다른 어떠한 컴포넌트(다른 패널도 포함) 도 자신의 공간안에 추가할 수 있다.

이것의 디폴트 레이아웃 매니저는 FlowerLayout이다.
예)

        Panel pnl = new Panel();
        pnl.add(new Button("OK");
        pnl.add(new Button("Cancel");
        add(pnl);

1.2.3 Window 클래스

Window는 탑레벨 윈도우 컴포넌트이다. 보더(border)와 메뉴바를 가지고 있지 않다. 이것의 디폴트 레이아웃 매니저는 BorderLayout 이다.

1.2.4 Frame 클래스

타이틀과 보더를 가지는 탑레벨 윈도우. 또한 메뉴바를 가질수 있으며 커서와 아이콘 이미지를 설정할 수도 있다. 이것의 디폴트 레이아웃 매니저는 BorderLayout 이다. 주로 어플리케이션의 메인 윈도우로 사용된다.

예)

        import java.awt.*;
        public class MainWin extends Frame {
                public MainWin() {
                        super("Main Window");
                        Panel p = new Panel();
                        add(new Button("OK"));
                        add(new Button("Cancel"));

                        add("South", p);
                        pack();
                }

                public static void main(String args[]) {
                        MainWin win = new MainWin();
                        win.resize(200,200); 
                        win.show();
                }
        }

1.2.5 Dialog 클래스

사용자에게 일시적인 정보를 보여주거나 정보를 얻기위한 윈도우이다. 이것의 디폴트 레이아웃 매니저는 BorderLayout이다.

1.2.6 FileDialog 클래스

사용자로부터 화일 선택을 가능하게 해주는 다이얼로그 윈도우이다.

상수
메쏘드

예) FileDialog에서의 화일선택 방법이다.

        public boolean action(Event e, Object arg) {
                if ("Open".equals(arg)) {
                        fd = new FileDialog(this, "Open", FileDialog.LOAD);
                        fd.show();
                        // 현재 선택된 화일명을 가져온다.
                        String file = fd.getFile();
                        // 화일을 열어 정보를 가져오는 코드가 필요하다.
                        ...
                        return true;
                }
        }

1.3 메뉴 컴포넌트

1.3.1 MenuComponent 클래스

모든 메뉴 컴포넌트들의 수퍼클래스로 추상클래스로 정의되어있다.

1.3.2 MenuBar 클래스

프레임에 포함되는 메뉴바 컴포넌트이다.

프레임에 메뉴바를 포함하려면 Frame 클래스의 setMenubar() 메쏘드를 호출해야 한다.

1.3.3 MenuItem 클래스

메뉴안의 모든 아이템들은 MenuItem 클래스나 이것의 서브 클래스이여야 한다.

1.3.4 Menu 클래스

메뉴는 메뉴바의 풀다운 컴포넌트이며, tear-off 메뉴로 만들 수도 있다.

1.3.5 CheckboxMenuItem 클래스

메뉴에 포함되는 체크박스를 구현한다.

예) 각종 메뉴컴포넌트들을 사용하여 풀다운 메뉴를 만드는 예이다.

        Frame f = new Frame("Example Menu");
        MenuBar mbar = new MenuBar();

        Menu m1 = new Menu("File");
        m1.add(new MenuItem("Open"));
        m1.add(new CheckboxMenuItem("Show Java Console"));

        Menu sub = new Menu("Document Encoding");
        sub.add(new MenuItem("English"));
        sub.add(new MenuItem("Korean"));

        m1.add(sub);
        m1.addSeparator();
        m1.add(new MenuItem("Quit"));

        Menu m2 = new Menu("Help");
        m2.add(new MenuItem("About..."));
        m2.add(new MenuItem("How to..."));

        mbar.add(m1);
        mbar.setHelpMenu(m2);

        f.setMenuBar(mbar);

1.3 그밖의 클래스들

1.3.1 Graphics 클래스

어플리케이션에서 컴포넌트나 off-screen 이미지으로의 그리기을 가능하게 해주는 모든 graphics context를 위한 추상클래스이다.

예)

        public void paint(Graphics g) {
                g.setColor(Color.red);
                g.setFont(new Font(" TimesRoman",Font.BOLD, 20); 
                g.drawRect(10,10,100,100); 
                g.drawString("Graphics Methods" 10,40); 
        }

1.3.2 Color 클래스

RGB 형식을 사용하는 색을 캡슐화한 클래스이다. 각 성분은 0에서 255의 값을 가진다. 이 클래스에는 다음과 같은 final static Color 변수가 있어 사용에 편의를 주고 있다.

black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, white, yellow

예) 아래는 서로 동일한 값을 나타낸다.

1.3.3 Font 클래스

폰트를 나타내는 클래스로 세가지 정보를 지정한다.

예) new Font("TimesRoman", Font.BOLD+Font.ITALIC, 20);

1.3.4 FontMetrics 클래스

지정 폰트의 크기를 측정하여 특정위치에 문자들을 놓는데 사용한다.

1.3.5 Image 클래스

추상클래스로 이미지를 나타내는 모든 클래스의 수퍼클래스 이다.

1.3.6 MediaTracker 클래스

MediaTracker 는 많은 미디어 객체의 상태를 추적하기 위한 유틸리티 클래스이다. 미디어 객체는 이미지뿐아니라 오디어 클립을 말한다. 그러나 현재는 이미지에만 지원된다.

예) 다음은 애플릿에서 MediaTracker를 사용하는 간단한 사용예이다.

        MediaTracker tracker;
        Image img;
        public void init() {
                tracker = new MediaTracker(this);
                img = getImage(getDocumentBase(), "image/sample.gif");
                addImage(img, 0);
                try {
                        waitForID(0);
                } catch (InterruptedException e) {
                        break;
                }
        }

1.3.7 Tookit 클래스

Toolkit 클래스는 추상클래스이며, AWT의 모든 실제적인 구현의 수퍼클래스이다.

예) 다음은 어플리케이션에서 이미지를 로딩하기 위해 Toolkit을 사용한 간단한 예이다.

        Image img;
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        img = toolkit.getImage("image/sample.gif");

위의 클래스 이외에도 awt 패키지에는 다음과 같은 클래스들이 있다.


2. java.awt.image 패키지

java.awt.image 패키지는 저 수준의 이미지 데이터 처리를 위한 클래스들과 인터페이스로 구성되어 있다. 크게 이미지 생산자들(ImageProducers), 이미지 소비자들(ImageConsummers), 컬러모델들(ColorModels), 그리고 이미지 관찰자(ImageObsever)로 구성되어있다.


Classes

        java.awt.image.MemoryImageSource (implements java.awt.image.ImageProducer) 
        java.awt.image.FilteredImageSource (implements java.awt.image.ImageProducer) 

        java.awt.image.PixelGrabber (implements java.awt.image.ImageConsumer) 
        java.awt.image.ImageFilter (implements java.awt.image.ImageConsumer) 
                java.awt.image.CropImageFilter
                java.awt.image.RGBImageFilter

        java.awt.image.ColorModel
                java.awt.image.DirectModel
                java.awt.image.IndexColorModel

Interfaces

        java.awt.image.ImageObserver
        java.awt.image.ImageProducer
        java.awt.image.ImageConsumer

3. java.awt.peer 패키지

java.awt.peer 는 AWT 컴포넌트들을 Motif widgets 나 MS Windows 컨트롤과 같은 플랫폼 특정 구현에 연결해주는 패키지이다. 이 패키지에는 클래스는 정의되어 있지 않고, AWT 컴포넌트와 관련된 인터페이스만 존재한다.

4. java.applet 패키지

java.applet 패키지는 자바 애플릿 작성을 위해 꼭 필요한 Applet 클래스와 애플릿에서 사용할 수 있는 몇몇 인터페이스를 가지고 있다.

(*java.awt.Panel) 
                java.applet.Applet

애플릿은 어플리케이션과는 달리 main() 메쏘드를 가지고 있지 않으며, 대신 Applet 클래스의 init(), start(), stop(), destroy() 메쏘드등을 재정의하여 동작을 하게된다.

애플릿은 웹 브로우져에서 실행되기 위해서 HTML문서에 <applet> 태그를 사용하여 동작할 바이트 코드인 class 파일을 지정한다.

예)

<APPLET CODE = sample.class WIDTH=300 HEIGHT = 300>
</APPLET>

4.1 Applet 클래스

모든 애플릿, 즉 자바를 지원하는 브로우져에서 동작하는 프로그램은 반드시 Applet 클래스를 상속해야한다. Applet 클래스는 또한 애플릿과 그것의 환경사이에 표준 인터페이스를 제공한다.

위의 메쏘드들은 애플릿의 Life Cycle과 관련된 메쏘드들이며 애플릿에서 반드시 재정의 할 필요는 없다. 예를 들어 단지 웹 브로우져상에 텍스트를 출력하는 프로그램인 경우 위의 4가지 메쏘드들은 재정의 할 필요가 없을 것이다. 다음의 예제를 통해 애플릿이 어떻게 동작되는가를 보도록 하자.

예)

        import java.awt.*;
        import java.applet.Applet;
        public class AppletSample extends Applet {
                public void init() {
                        System.out.println("Initialize...")
                }
                public void start() {
                        System.out.println("Start...");
                }
                public void stop() {
                        System.out.println("Stop...");
                }
                public void destroy() {
                        System.out.println("Destroy...");
                }
        }
        // HTML file
        <applet code=SampleApplet.class width=300 height=300>
        <param name="str" value="Welcome!!!">
        <param name="delay" value="100">
        </applet>

        // java file
        String message;
        int wait;
        public void init() {
                String str = getParameter("text");
                message = (str != null) ? str : "Default Text";
                str = getParameter("delay");
                delay = (str != null) ? Integer.parseInt(str) : 1000;
        }

예)

        import java.awt.*;
        import java.applet.Applet;
        public class SampletApplet extends Applet { 
                Image img;
                public void init() {
                        img = getImage(getDocumentBase(), "image/sample.gif");
                }

                public void paint(Graphics g) {
                g.drawImage(img, 0, 0, this);
                showStatus("Drawing Image");
                }
        }

4.2 AudioClip 인터페이스

AudioClip 인터페이스는 사운드 클립을 동작시키기위한 단순한 추상화이다.

예)

        AudioClip ac = getAudioClip(getDocumentBase(), "sound/sample.au");
        ac.play();
        ac.loop();
        ac.stop();

4.3 AppletContext 인터페이스

AppletContext 인터페이스는 애플릿의 환경에 해당한다. 즉 애플릿을 포함하고 있는 문서 그리고 같은 문서안의 다른 애플릿.

이 인터페이스안의 메쏘드들은 애플릿의 환경에 대한 정보를 얻기위해서 애플릿에서 사용될 수 있다.

예)

        AppletContext context = getAppletContext();
        try {
                context.showDocument("http://misotech.com/index.html"); 
        } catch (MalformedURLException e) {
                System.out.println(e);
        }

5. 결론

지금까지 awt와 applet 패키지에 대해서 살펴보았다. 현재의 사용되는 대부분의 프로그램은 GUI를 지원한다고 볼 수 있다. 따라서 awt 패키지는 프로그램 작성에 상당히 중요한 부분이라 할 수 있다. 비록 자세하게 설명되어지지는 않았지만 계속적인 관심을 갖고 연구해볼만한 부분이라 할수 있다. 또한 이 부분은 계속적으로 개발되고 있으며 더 나은 방향으로 발전하고 있으므로 새로운 버젼에 대해 항상 관심을 가져야 할 것이다.

applet 패키지는 대부분 사람들의 관심 대상이지만 Applet 클래스 자체의 메쏘드는 몇가지 밖에 없었다. 대부분의 사용 메쏘드들은 자신의 수퍼클래스들(Component 클래스등) 또는 다른 관련 패키지 들의 클래스를 import 하여 사용하므로 이런것에 유의하여 관련 메쏘드를 살펴야 할 것이다.

또한 새로운 JDK 버젼(JDK 1.1)이 곧 나온다니 기대를 해보자.

참고문헌(References)

[Sun 96a]
JavaSoft, Java API Documentation, 1996
URL: http://www.javasoft.com:80/products/J DK/1.0.2/api/
[Sun 96b]
JavaSoft, The Java Tutorial, 1996
URL: http://www.javasoft.com/books/ Series/Tutorial/index.html
[Elliotte 96]
Elliotte Rusty Harold, Brewing Java: A Tutorial, 1996.
URL: http://sunsite.unc.edu/javafaq/javatutorial.ht ml
[조국 96]
신정호, 제갈영, 조국, 자바를 자바라, 미래정보사, 1996
URL: http://www.misotech.com/~mikimous/java/book/