01. Swing 소개

UI(User Interface) 프로그램은 윈도우, 메뉴, 버튼, 라디오, 리스트 등 시각적인 컴포넌트를 제공해서 사용자와 상호작용하도록 돕습니다. 자바는 이러한 UI 프로그램을 개발할 수 있도록 JDK에서 JFC(Java Foundation Classes)를 제공합니다.

JFC는 UI 프로그램을 만들기 위한 클래스들의 모음으로, AWT(Abstract Window Toolkit)Swing(스윙)을 포함하고 있습니다.

  • AWT: java.awt 패키지 사용. 운영체제(OS)의 네이티브 컴포넌트를 그대로 이용 (Heavyweight).
  • Swing: javax.swing 패키지 사용. 자바에서 직접 컴포넌트를 그려서 구현 (Lightweight).

AWT는 OS의 컴포넌트를 사용하므로 속도가 빠르지만 디자인이 OS에 종속적입니다. 반면 Swing은 자바가 직접 그리므로 모든 OS에서 동일한 디자인을 유지할 수 있고 다양한 컴포넌트를 제공하지만, AWT보다 리소스를 더 많이 사용할 수 있습니다.

💡 그림으로 이해하기: 무거운 AWT vs 가벼운 Swing

이해를 돕기 위해 실생활에 비유해 볼까요?

  • AWT(Heavyweight)는 공장에서 이미 완성된 무거운 철제 버튼 부품을 OS에서 직접 빌려와 조립하는 것과 같습니다. 운영체제마다 버튼 모양이 다르고 변경하는 데 한계가 있습니다.
  • Swing(Lightweight)은 화가가 하얀 캔버스(화면) 위에 직접 붓과 물감으로 예쁘고 가벼운 단추를 그리는 것과 같습니다. 어떤 운영체제에서 실행하든 언제나 동일한 디자인을 보장합니다!

AWT와 Swing 개념 비유

위 그림처럼 OS의 리소스를 직접 빌려 빌드하는 AWT와 자바가 직접 그려내는 Swing의 직관적인 특징 차이를 확인할 수 있습니다.

시스템 구조적 흐름 비교

다음 다이어그램은 두 툴킷이 실제로 화면에 컴포넌트를 렌더링하는 컴퓨터 내부 구조의 흐름 차이를 보여줍니다.

AWT와 Swing 구조 비교


1. AWT 예제

다음은 AWT로 작성한 간단한 윈도우 프로그램입니다. Frame을 상속받아 윈도우를 만듭니다.

  • 실습 예제 파일: App.java (AWT) (경로: sample/sec01/exam01_awt/App.java)
  • 실행 방법:
    # 1. 01_swing_intro 디렉토리로 이동 후 컴파일
    javac -d sample sample/sec01/exam01_awt/App.java
      
    # 2. 실행
    java -cp sample sec01.exam01_awt.App
    
  • 실행 결과 화면:

    AWT 실행 결과

package sec01.exam01_awt;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class App extends Frame {
    public App() {
        // 제목 설정
        setTitle("AWT App");
        // 윈도우 크기 설정
        setSize(300, 100);
        // Button 추가
        add(new Button("Ok"), BorderLayout.SOUTH);

        // 윈도우 종료 버튼을 클릭하면 프로세스 종료
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    public static void main(String[] args) {
        // 윈도우 생성
        App app = new App();
        // 윈도우를 보여줌
        app.setVisible(true);
    }
}

2. Swing 예제

다음은 Swing으로 작성한 윈도우 프로그램입니다. AWT의 Frame 대신 JFrame을 상속받고, Button 대신 JButton을 사용합니다. Swing 컴포넌트는 클래스 이름 앞에 J가 붙는 것이 특징입니다.

  • 실습 예제 파일: App.java (Swing) (경로: sample/sec01/exam02_swing/App.java)
  • 실행 방법:
    # 1. 01_swing_intro 디렉토리로 이동 후 컴파일
    javac -d sample sample/sec01/exam02_swing/App.java
      
    # 2. 실행
    java -cp sample sec01.exam02_swing.App
    
  • 실행 결과 화면:

    Swing 실행 결과

package sec01.exam02_swing;

import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JButton;
import javax.swing.JFrame;

public class App extends JFrame {
    public App() {
        // 제목 설정
        setTitle("Swing App");
        // 윈도우 크기 설정
        setSize(300, 100);
        // JButton 추가
        // Swing에서는 ContentPane에 컴포넌트를 추가하는 것이 정석이나, 
        // Java 5부터는 JFrame에 직접 add() 해도 ContentPane에 추가됨.
        getContentPane().add(new JButton("Ok"), BorderLayout.SOUTH);
        
        // 윈도우 종료 버튼을 클릭하면 프로세스 종료
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    public static void main(String[] args) {
        // 윈도우 생성
        App app = new App();
        // 윈도우를 보여줌
        app.setVisible(true);
    }
}

요약

  • AWT: Frame, Button 등 OS 종속 컴포넌트.
  • Swing: JFrame, JButton 등 순수 자바 컴포넌트 (J 접두사).
서브목차