Java로 GUI 프로그래밍을 하다 보면 AWT는 '무거운(heavyweight)' 컴포넌트, Swing은 '가벼운(lightweight)' 컴포넌트라는 표현을 자주 접하게 됩니다. 그렇다면 여기서 말하는 '무겁다'와 '가볍다'는 정확히 어떤 의미이며, 두 기술의 차이는 어디서 오는 걸까요?
AWT와 Swing의 기본 개념
AWT(Abstract Window Toolkit)는 Java GUI 프로그래밍을 지원하는 포터블 GUI 라이브러리로, 독립 실행형 Java 애플리케이션이나 애플릿에서 사용할 수 있습니다. AWT는 우리가 작성한 애플리케이션과 운영체제(OS)의 네이티브 GUI 사이를 연결하는 다리 역할을 합니다.
반면 Java Swing은 AWT 기술 위에 구축된 GUI 컴포넌트 집합으로, 플러그형 룩앤필(pluggable look and feel)을 제공한다는 것이 큰 특징입니다. Swing은 순수하게 Java 언어만으로 구현되어 있다는 점에서 AWT와 근본적으로 다릅니다.
'무거운(Heavyweight)'이라는 것의 의미
여기서 말하는 '무거운' 컴포넌트란 코드 로딩에 상대적으로 더 많은 시간이 걸리고, 시스템 리소스를 더 많이 소비한다는 뜻입니다.
AWT가 무거운 컴포넌트로 분류되는 이유는 바로 컴포넌트가 운영체제에 직접 의존하기 때문입니다. 예를 들어 java.awt.Checkbox 클래스의 객체를 생성하면, 실제 체크박스는 Java 코드가 아니라 운영체제가 네이티브 방식으로 생성해 줍니다. 즉, 화면에 그려지는 모든 요소를 OS가 대신 처리하는 셈입니다. 이것이 AWT 컴포넌트가 플랫폼 종속적인 이유이기도 합니다.
Swing이 가벼운(Lightweight) 이유
반대로 대부분의 Swing 컴포넌트는 Java 자체 내부에서 구현됩니다. 물론 윈도우처럼 최상위(top-level) 컴포넌트 일부는 여전히 운영체제에 의존하지만, 전체 프로그램 입장에서 보면 AWT보다 훨씬 가볍습니다. OS의 네이티브 리소스 호출을 최소화하고 Java 레벨에서 화면을 직접 렌더링하기 때문에 플랫폼 간 일관성도 유지할 수 있습니다.
Swing은 AWT 위에 세워진 최적화 버전
Swing은 AWT의 발전되고 최적화된 버전으로, AWT를 기반으로 만들어졌습니다. 따라서 Swing 내부에서도 많은 AWT 클래스들이 직접 혹은 간접적으로 사용되고 있습니다.
그렇기 때문에 Java Swing을 본격적으로 학습하기 전에 AWT의 기초를 먼저 다지는 것이 중요합니다. AWT의 동작 원리를 모른 채 Swing만 공부하면, Java GUI에서 여러 컨트롤이 위임(delegation)되는 과정과 내부 동작 방식을 제대로 이해하기 어렵습니다.
예제 코드
아래 예제는 JFrame(Swing) 안에 AWT의 Button을 함께 사용하여 두 기술이 어떻게 공존할 수 있는지 보여줍니다.
import javax.swing.SwingUtilities;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
public class Test {
public static void main(String[] args) {
ApplicationWindow window = new ApplicationWindow();
window.setVisible(true);
}
}
class ApplicationWindow extends JFrame {
public ApplicationWindow() {
this.setSize(200, 100);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new FlowLayout());
Button exitButton = new Button("Exit");
exitButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.exit(0);
}
});
this.add(exitButton);
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("Overlapping Menu");
JMenuItem menuItem = new JMenuItem("Overlapping Item");
menu.add(menuItem);
menuBar.add(menu);
this.setJMenuBar(menuBar);
this.validate();
}
}실행 결과
프로그램을 실행하면 200×100 크기의 창이 열리고, 상단에는 'Overlapping Menu' 메뉴가 배치되며, 하단에는 'Exit' 버튼이 표시됩니다. Exit 버튼을 클릭하면 프로그램이 종료됩니다.
정리
- AWT: OS의 네이티브 컴포넌트에 의존 → 무거운(heavyweight) 컴포넌트, 플랫폼 종속적
- Swing: 대부분 Java로 구현 → 가벼운(lightweight) 컴포넌트, 플러그형 룩앤필 지원
- 관계: Swing은 AWT 위에 구축된 확장·최적화 기술이므로, AWT 기초를 먼저 이해하면 Swing 학습이 훨씬 수월해집니다.