Java Swing이란?
Java Swing은 자바 프로그램에 그래픽 사용자 인터페이스(GUI)를 제공하는 API 집합입니다. Java Swing은 AWT(Abstract Windows Toolkit)라는 초기 API를 기반으로 개발되었으며, AWT보다 훨씬 풍부하고 정교한 GUI 컴포넌트를 제공합니다. 제공되는 컴포넌트는 간단한 버튼이나 레이블부터 복잡한 트리(tree)와 테이블(table)까지 다양하게 구성되어 있습니다. 또한 Java Swing은 플러그형 룩앤필(pluggable look and feel)을 지원하여 자바 프로그램의 외관을 실행 환경의 운영체제와 독립적으로 유지할 수 있다는 큰 장점이 있습니다.
Java Swing의 주요 특징
Java Swing은 플랫폼에 독립적이며 MVC(Model-View-Controller) 프레임워크를 기반으로 설계되었습니다. 핵심 특징은 다음과 같습니다.
- 플러그형 룩앤필(Pluggable Look and Feel) — Java Swing은 여러 가지 룩앤필을 지원하며, 현재 Windows, UNIX, Motif, 그리고 자바 고유의 Metal 룩앤필을 사용할 수 있습니다. 애플리케이션을 재시작하지 않고도 런타임 중에 룩앤필을 전환할 수 있어, 사용자가 즉시 자신에게 가장 적합한 화면 스타일을 선택할 수 있습니다.
- 경량 컴포넌트(Lightweight Components) — 일부 최상위 컨테이너를 제외한 모든 Swing 컴포넌트는 경량(lightweight) 방식으로 동작합니다. 경량 컴포넌트란 호스트 운영체제(OS)에 의존하지 않고 Graphics 객체의 드로잉 프리미티브를 사용해 스스로를 렌더링하는 컴포넌트를 의미합니다. 그 결과 AWT 기반의 기존 자바 GUI 애플리케이션보다 화면 표현 속도가 빠르고 메모리 소비량도 적습니다.
- 단순화된 MVC(Simplified MVC) — Java Swing은 각 컴포넌트의 핵심 설계로 단순화된 MVC(Model-View-Controller) 아키텍처인 모델-델리게이트(model-delegate) 패턴을 채택했습니다. 이 구조에 따라 각 Swing 컴포넌트는 모델(model)과 UI 델리게이트(UI delegate)로 구성되며, UI 델리게이트가 MVC 아키텍처의 뷰(view)와 컨트롤러(controller) 역할을 함께 수행합니다. UI 델리게이트는 화면 그리기와 GUI 이벤트 처리를 담당하고, 모델은 컴포넌트의 정보나 상태를 관리합니다.
예제 코드
아래 예제는 MVC 패턴을 활용한 간단한 카운터 애플리케이션입니다. 버튼을 클릭할 때마다 모델의 값이 1씩 증가하고, 변경된 값이 화면의 레이블에 표시됩니다.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
// 모델(Model) 부분
class Model {
private int x;
public Model() {
x = 0;
}
public Model(int x) {
this.x = x;
}
public void setX(){
x++;
}
public int getX() {
return x;
}
}
// 뷰(View) 부분
class View {
private JFrame frame;
private JLabel label;
private JButton button;
public View(String text) {
frame = new JFrame("View");
frame.getContentPane().setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(200,200);
frame.setVisible(true);
label = new JLabel(text);
frame.getContentPane().add(label, BorderLayout.CENTER);
button = new JButton("Button");
frame.getContentPane().add(button, BorderLayout.SOUTH);
}
public JButton getButton() {
return button;
}
public void setText(String text) {
label.setText(text);
}
}
// 컨트롤러(Controller) 부분
class Controller {
private Model model;
private View view;
private ActionListener actionListener;
public Controller(Model model, View view) {
this.model = model;
this.view = view;
}
public void contol() {
actionListener = new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
linkBtnAndLabel();
}
};
view.getButton().addActionListener(actionListener);
}
private void linkBtnAndLabel() {
model.setX();
view.setText(Integer.toString(model.getX()));
}
}
// 메인(Main) 클래스
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
// 시스템 룩앤필 설정
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception ex) { }
Model model = new Model(0);
View view = new View("-");
Controller controller = new Controller(model,view);
controller.contol();
}
});
}
}실행 결과
