스윙 (자바)

스윙()은 자바에서 GUI(Graphic User Interface)를 구현하기 위해 JDK에서 기본적으로 제공하는 개발 툴킷으로 선 마이크로시스템즈의 자바 기반 클래스의 일부이다.

스윙은 기존에 발표되었던 AWT()가 OS() 및 윈도 시스템의 자원을 그대로 제공하기 때문에 자바에서 지향하는 "Write Once, Run Everywhere(WORE)"를 구현하기 위해 각종 시스템에서 공통적으로 제공하는 버튼, 대화창 등만을 구현하고 표나 트리 등의 좀 더 복잡하고 다양한 그래픽 컴포넌트를 사용할 수 없는 단점을 보완하기 위하여 JDK 1.2 버전부터 사용되었다.

역사 
AWT의 제약을 극복하기 위하여 만들어졌다. JDK 1.1 버전때부터 별도의 라이브러리로 개발되다가 JDK 1.2 버전부터 정식으로 JDK에 포함되었다.

특징 
운영 환경에 영향을 받지 않고 동일한 화면을 보여줄 수 있도록 시스템에 대한 의존도를 최소화하고 각종 컴포넌트들을 자바에서 직접 그려서 구현을 하였다.  따라서 여러 환경에서 동일한 모습을 보일 수 있도록 구현되었으나 대신 해당 시스템의 고유한 모습을 보여줄 수 없다.
이러한 약점을 보완하기 위하여 룩 앤드 필()이라는 기능을 지원하는데 이 기능을 이용하여 프로그램 전체의 UI 모습을 바꿀 수 있다.  이클립스가 대표적인 자바 통합 개발 환경(IDE, )으로 자리 잡으면서 SWT가 널리 퍼지게 되자 이와 비슷한 그래픽을 보여주는 라이브러리들이 나오기 시작하였다.

직접 컴포넌트를 그리는 방식으로 인하여 하드웨어적인 그래픽 가속장치()를 사용할 수 없는 경우에는 속도가 많이 저하된다.  이는 스윙이 느리다는 인식을 가져오게 된 계기가 되었으나 추후 JDK가 업그레이드 되면서 차차 개선되었다.

AWT, Java2D 등과 함께 자바 기반 클래스(, JFC)를 구성하는 한 요소이다.

스윙의 아키텍처는 플랫폼-독립적인, 자바 모델-뷰-컨트롤러 GUI 프레임워크이다. 스윙은 단일-스레드 프로그래밍 모델을 따른다.

기타 GUI 툴킷과의 비교

AWT와의 비교 

AWT는 시스템의 그래픽 컴포넌트를 직접 사용하여 해당 시스템의 모습을 그대로 구현한다. 또한 스레드 보안()이 되어 있어 스윙과 비교하여 컴포넌트의 업데이트에 문제가 발생하지 않는다.
또한 최소 JDK 1.2, 혹은 성능을 위하여 더 최신의 JVM이 필요한 스윙에 비하여 AWT는 자바에서 지원하는 최초의 그래픽 툴킷으로 버전에 상관없이 모든 JVM에서 사용 가능하다.
마이크로소프트가 썬 마이크로시스템즈와의 자바 사용권에 대한 재판에서 패소함에 따라 신규 JVM을 지원하지 않고 있는데 MS의 기존 JVM에서도 AWT는 사용이 가능하다.(2007년 12월 31일로 만료됨)

그러나 자바 1.2 이후 컴포넌트의 제약에도 불구하고 Java2D, Java3D 등의 풍부한 그래픽 환경을 제공한다.

SWT와의 비교 

스윙에 비교하면 비교적 저수준의 GUI 툴킷으로 많은 경우 고수준의 제어를 위하여 JFace와 함께 사용된다. AWT와 비슷하게 시스템의 컴포넌트를 직접 사용하며 지원하지 않는 경우에만 에뮬레이트한다. 그러나 최신의 대부분 운영 환경에서는 시스템에서 동일한 기능을 제공한다.

시스템 자원을 직접 활용하기에 대개의 경우 스윙에 비하여 속도가 빠르며 해당 운영환경 고유의 모습을 나타낸다. 그러나 시스템 자원 활용을 위하여 JNI()를 사용하기 때문에 이식성에 제한이 있다.

예

기본 예 
다음은 단순한 스윙 기반 프로그램이다. 레이블과 버튼이 포함된 창(JFrame)을 표시한다.

import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.WindowConstants;
import javax.swing.SwingUtilities;

public class SwingExample implements Runnable {

    @Override
    public void run() {
        // Create the window
        JFrame f = new JFrame("Hello, !");
        // Sets the behavior for when the window is closed
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        // Add a layout manager so that the button is not placed on top of the label
        f.setLayout(new FlowLayout());
        // Add a label and a button
        f.add(new JLabel("Hello, world!"));
        f.add(new JButton("Press me!"));
        // Arrange the components inside the window
        f.pack();
        // By default, the window is not visible. Make it visible.
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingExample se = new SwingExample();
        // Schedules the application to be run at the correct time in the event queue.
        SwingUtilities.invokeLater(se);
    }

}

같이 보기 
 AWT
 레이아웃 매니저
 스윙랩스
 표준 위젯 툴킷

참고 자료

외부 링크 
  스윙 API 문서
  SWT, Swing or AWT : 나에게 맞는 것 찾기

자바 플랫폼
위젯 툴킷
자바 API