{{위키데이터 속성 추적}}
[[파일:Gui-widgets.png|섬네일|[[X 윈도 시스템]]용 자바 5의 스윙 위젯의 예]]
'''스윙'''({{lang|en|Swing}})은 [[자바 (프로그래밍 언어)|자바]]에서 [[GUI]](Graphic User Interface)를 구현하기 위해 [[JDK]]에서 기본적으로 제공하는 개발 툴킷으로 [[선 마이크로시스템즈]]의 [[자바 기반 클래스]]의 일부이다.

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

== 역사 ==
[[앱스트랙트 윈도우 툴킷|AWT]]의 제약을 극복하기 위하여 만들어졌다. JDK 1.1 버전때부터 별도의 라이브러리로 개발되다가 JDK 1.2 버전부터 정식으로 JDK에 포함되었다.

== 특징 ==
[[운영 환경]]에 영향을 받지 않고 동일한 화면을 보여줄 수 있도록 시스템에 대한 의존도를 최소화하고 각종 [[컴포넌트]]들을 자바에서 직접 그려서 구현을 하였다.  따라서 여러 환경에서 동일한 모습을 보일 수 있도록 구현되었으나 대신 해당 시스템의 고유한 모습을 보여줄 수 없다.
이러한 약점을 보완하기 위하여 [[룩 앤드 필]]({{lang|en|Look And Feel}})이라는 기능을 지원하는데 이 기능을 이용하여 프로그램 전체의 UI 모습을 바꿀 수 있다.  [[이클립스]]가 대표적인 자바 [[통합 개발 환경]](IDE, {{lang|en|Integrated Development Environment}})으로 자리 잡으면서 SWT가 널리 퍼지게 되자 이와 비슷한 그래픽을 보여주는 [[라이브러리]]들이 나오기 시작하였다.
<ref>{{웹 인용 |url=http://www.jgoodies.com/freeware/metamorphosis/screenshots.html |제목=스윙으로 구현한 이클립스(Fakeclipse) - UI만 구현 |확인날짜=2010-01-21 |보존url=https://web.archive.org/web/20100116175452/http://www.jgoodies.com/freeware/metamorphosis/screenshots.html |보존날짜=2010-01-16 |url-status=dead }}</ref>

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

[[앱스트랙트 윈도우 툴킷|AWT]], [[Java2D]] 등과 함께 [[자바 기반 클래스]]({{lang|en|Java Foundation Classes}}, JFC)를 구성하는 한 요소이다.

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

== 기타 GUI 툴킷과의 비교 ==
=== AWT와의 비교 ===
{{본문|AWT}}
AWT는 시스템의 그래픽 컴포넌트를 직접 사용하여 해당 시스템의 모습을 그대로 구현한다. 또한 스레드 보안({{lang|en|Thread Safe}})이 되어 있어 스윙과 비교하여 컴포넌트의 업데이트에 문제가 발생하지 않는다.
또한 최소 JDK 1.2, 혹은 성능을 위하여 더 최신의 [[JVM]]이 필요한 스윙에 비하여 AWT는 자바에서 지원하는 최초의 그래픽 툴킷으로 버전에 상관없이 모든 JVM에서 사용 가능하다.
[[마이크로소프트]]가 [[썬 마이크로시스템즈]]와의 자바 사용권에 대한 재판에서 패소함에 따라 신규 JVM을 지원하지 않고 있는데 MS의 기존 JVM에서도 AWT는 사용이 가능하다.(2007년 12월 31일로 만료됨)
<ref>{{웹 인용 |url=http://www.microsoft.com/korea/java/default.mspx |제목=MSJVM(Microsoft Java Virtual Machine) 지원 |확인날짜=2010-01-21 |보존url=https://web.archive.org/web/20100107033402/http://www.microsoft.com/korea/java/default.mspx |보존날짜=2010-01-07 |url-status=dead }}</ref>

그러나 자바 1.2 이후 컴포넌트의 제약에도 불구하고 [[Java2D]], [[Java3D]] 등의 풍부한 그래픽 환경을 제공한다.
=== SWT와의 비교 ===
{{본문|SWT}}
스윙에 비교하면 비교적 저수준의 GUI 툴킷으로 많은 경우 고수준의 제어를 위하여 [[JFace]]와 함께 사용된다. AWT와 비슷하게 시스템의 컴포넌트를 직접 사용하며 지원하지 않는 경우에만 에뮬레이트한다. 그러나 최신의 대부분 운영 환경에서는 시스템에서 동일한 기능을 제공한다.

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

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

<syntaxhighlight lang="java">
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);
    }

}
</syntaxhighlight>

== 같이 보기 ==
* [[앱스트랙트 윈도우 툴킷|AWT]]
* [[레이아웃 매니저]]
* [[스윙랩스]]
* [[표준 위젯 툴킷]]

== 각주 ==
{{각주}}

== 외부 링크 ==
* {{언어링크|en}} [http://java.sun.com/javase/6/docs/technotes/guides/swing 스윙 API 문서]
* {{언어링크|ko}} [http://www.ibm.com/developerworks/kr/library/os-swingswt SWT, Swing or AWT : 나에게 맞는 것 찾기]

{{위젯 툴킷}}

[[분류:자바 플랫폼]]
[[분류:위젯 툴킷]]
[[분류:자바 API]]