스윙 (자바)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
스윙(Swing)은 AWT의 제약을 극복하기 위해 개발된 자바의 GUI 라이브러리이다. 1998년 J2SE 1.2에 처음 출시되었으며, 플랫폼 독립적인, 자바 모델-뷰-컨트롤러 GUI 프레임워크로, 다양한 운영 환경에서 동일한 화면을 제공한다. 스윙은 플러그 가능한 룩앤필을 지원하여 애플리케이션의 모양을 변경할 수 있으며, 모듈 기반 아키텍처를 통해 확장성을 제공한다. 스윙의 후속작인 JavaFX는 2005년에 개발이 시작되었다.
더 읽어볼만한 페이지
- 자바 API - 자바 암호화 확장
- 자바 API - 표준 위젯 툴킷
표준 위젯 툴킷(SWT)은 자바 GUI 툴킷으로, 네이티브 룩앤필과 고성능을 위해 윈도 시스템의 그래픽 요소를 직접 사용하며, 이클립스 IDE의 기반 기술로 IBM에 의해 개발되었다. - 위젯 툴킷 - Tk (소프트웨어)
Tk는 Tcl 스크립팅 언어의 크로스 플랫폼 GUI 툴킷으로, 다양한 플랫폼 이식과 여러 프로그래밍 언어 바인딩을 지원하며 사용자 정의 가능한 위젯들을 제공한다. - 위젯 툴킷 - 윈도우 API
윈도우 API는 마이크로소프트 윈도우 운영 체제에서 응용 프로그램이 시스템 기능에 접근하도록 돕는 인터페이스 집합이며, 다양한 버전으로 발전해 왔고, 현재 Win32가 널리 사용되며, 유연성을 제공하지만 복잡하다는 단점을 보완하기 위해 다양한 래퍼 라이브러리가 개발되었다. - 자바 플랫폼 - 블루레이
블루레이 디스크는 DVD 후속 매체로, 청색 레이저를 사용하여 고화질 영상과 음향을 제공하며 HD DVD와의 경쟁 후 고밀도 광디스크 표준으로 자리 잡았으나 스트리밍 서비스 성장으로 녹화용 디스크 생산이 중단되는 추세이다. - 자바 플랫폼 - 자바 플랫폼, 마이크로 에디션
자바 ME는 임베디드 및 모바일 장치에서 자바 앱을 실행하는 플랫폼으로, 피처폰에서 주로 사용되었으며 다양한 프로파일과 에뮬레이터, 개발 도구를 제공하고 JSR을 통해 기능이 확장된다.
스윙 (자바) | |
---|---|
기본 정보 | |
![]() | |
유형 | GUI (그래픽 사용자 인터페이스) 툴킷 |
개발자 | 썬 마이크로시스템즈 (현재는 오라클 소유) |
첫 번째 출시 | 1996년 |
최신 버전 | Java SE 8 |
운영체제 | 크로스 플랫폼 (자바 가상 머신이 있는 모든 운영체제) |
기술적 세부 사항 | |
프로그래밍 언어 | 자바 |
API 유형 | GUI 툴킷 |
라이선스 | GNU 일반 공중 사용 허가서 (GPL) with Classpath Exception |
특징 | |
기반 | 자바 Abstract Window Toolkit |
주요 특징 | 플랫폼 독립성 확장 가능한 GUI 컴포넌트 세트 사용자 정의 가능한 모양과 느낌 (Look and Feel) 데이터 바인딩 지원 |
대체 기술 | JavaFX |
2. 역사
AWT의 제약을 극복하기 위하여 스윙이 만들어졌다. JDK 1.1 버전부터 별도의 라이브러리로 개발되다가 JDK 1.2 버전부터 정식으로 JDK에 포함되었다.
인터넷 재단 클래스(IFC)는 원래 넷스케이프 커뮤니케이션즈에서 개발하여 1996년 12월 16일에 처음 출시된 자바용 그래픽 라이브러리였다. 1997년 4월 2일, 썬 마이크로시스템즈와 넷스케이프 커뮤니케이션즈는 IFC를 다른 기술과 통합하여 자바 재단 클래스를 만들 계획이라고 발표했다.[4] "자바 재단 클래스"는 나중에 "스윙"으로 이름이 변경되었다.
스윙은 애플리케이션 코드에 실질적인 변경을 가하지 않고도 애플리케이션의 모든 컴포넌트의 룩앤필을 변경할 수 있는 메커니즘을 도입했다. 플러그 가능한 룩앤필 지원의 도입으로 스윙 컴포넌트는 플랫폼 독립성의 이점을 유지하면서 네이티브 컴포넌트의 모양을 에뮬레이트할 수 있게 되었다. 원래 별도로 다운로드 가능한 라이브러리로 배포되었던 스윙은 릴리스 1.2부터 자바 표준 에디션의 일부로 포함되었다.[5]
스윙의 후속작인 JavaFX의 개발은 2005년에 시작되었으며, 2년 후인 JavaOne 2007에서 공식적으로 소개되었다.[6] JavaFX는 2011년에 오픈 소스화되었고, 2012년에는 오라클 JDK 다운로드의 일부가 되었다. JavaFX는 더 가볍고, CSS 스타일링, 세련된 디자인 컨트롤, FXML 및 Scene Builder를 사용한다는 여러 가지 장점으로 인해 스윙을 대체하고 있다.[7] 2018년에는 JavaFX가 OpenJFX 프로젝트에 따라 OpenJDK의 일부가 되어 개발 속도를 높였다.[8]
스윙을 담당했던 자바 클라이언트 팀의 구성원은 다음과 같다.
- 제임스 고슬링 (아키텍트)
- 릭 레벤슨 (매니저)
- 에이미 파울러 & 한스 뮬러 (공동 기술 리더)
- 톰 볼
- 제프 딘킨스
- 조지 사브[9]
- 팀 프린징
- 조니 카네르바
- 지넷 헝 & 짐 그레이엄 (2D 그래픽스)[10]
스윙의 주요 개선 사항은 다음과 같다.
출시 연도 | 버전 | 주요 내용 |
---|---|---|
1998년 | J2SE영어 1.2 | 스윙 처음 출시 |
2002년 | J2SE영어 1.4 | Java Web Start영어를 이용하여 프로그램 재배포 문제 해결 |
2004년 | Java SE영어 1.5 | 메모리 소비 효율 개선 |
2006년 | Java SE영어 6 | Java영어 실행 성능 개선으로 Swing영어 실행 성능도 개선 |
운영 환경에 영향을 받지 않고 동일한 화면을 보여줄 수 있도록 시스템에 대한 의존도를 최소화하고 각종 컴포넌트들을 자바로 직접 그려서 구현하였다. 따라서 여러 환경에서 동일한 모습을 보일 수 있도록 구현되었으나, 대신 해당 시스템의 고유한 모습을 보여줄 수 없다. 이러한 약점을 보완하기 위하여 룩 앤드 필(Look And Feel영어) 기능을 지원하는데, 이 기능을 이용하여 프로그램 전체의 UI 모습을 바꿀 수 있다. 이클립스가 대표적인 자바 통합 개발 환경(IDE, Integrated Development Environment영어)으로 자리 잡으면서 SWT가 널리 퍼지게 되자 이와 비슷한 그래픽을 보여주는 라이브러리들이 나오기 시작하였다.[24]
스윙의 아키텍처는 플랫폼 독립적인 자바 모델-뷰-컨트롤러 GUI 프레임워크이며, 단일 스레드 프로그래밍 모델을 따른다.[11] 이 프레임워크는 스윙 기반 GUI의 코드 구조와 그래픽 표현 사이에 추상화 계층을 제공한다.
3. 특징
직접 컴포넌트를 그리는 방식으로 인해 하드웨어 그래픽 가속장치(Graphic Accelerator영어)를 사용할 수 없는 경우에는 속도가 많이 저하된다. 이는 스윙이 느리다는 인식을 가져오게 된 계기가 되었으나, 이후 JDK가 업그레이드되면서 차차 개선되었다.
AWT, Java2D 등과 함께 자바 기반 클래스(Java Foundation Classes영어, JFC)를 구성하는 한 요소이다.
스윙 아키텍처는 플랫폼 독립적인 자바 모델-뷰-컨트롤러 GUI 프레임워크이다. 스윙은 단일 스레드 프로그래밍 모델을 따른다. 스윙은 자바 언어로 완전히 작성되었기 때문에 플랫폼 독립적이다. 모든 스윙 클래스에 대한 전체 문서는 버전 6의 경우 [https://docs.oracle.com/javase/6/docs/api/ Java API 가이드], 버전 8의 경우 [https://docs.oracle.com/javase/8/docs/api/ Java Platform Standard Edition 8 API 사양]에서 찾을 수 있다.
4. 아키텍처
AWT, Java2D 등과 함께 자바 기반 클래스(Java Foundation Classes영어, JFC)를 구성하는 한 요소이다.
하드웨어 그래픽 가속장치(Graphic Accelerator영어)를 사용할 수 없는 경우에는 직접 컴포넌트를 그리는 방식으로 인해 속도가 많이 저하된다. 이는 스윙이 느리다는 인식을 가져오게 된 계기가 되었으나, 추후 JDK가 업그레이드되면서 차차 개선되었다.
4. 1. 확장성
운영 환경에 영향을 받지 않고 동일한 화면을 보여줄 수 있도록 시스템에 대한 의존도를 최소화하고 각종 컴포넌트들을 자바에서 직접 그려서 구현하였다. 따라서 여러 환경에서 동일한 모습을 보일 수 있도록 구현되었으나 대신 해당 시스템의 고유한 모습을 보여줄 수 없다.
이러한 약점을 보완하기 위하여 룩 앤드 필(Look And Feel영어)이라는 기능을 지원하는데, 이 기능을 이용하여 프로그램 전체의 UI 모습을 바꿀 수 있다. 이클립스가 대표적인 자바 통합 개발 환경(IDE, Integrated Development Environment영어)으로 자리 잡으면서 SWT가 널리 퍼지게 되자 이와 비슷한 그래픽을 보여주는 라이브러리들이 나오기 시작하였다.[24]
스윙은 고도로 모듈 기반의 아키텍처를 가지고 있어서, 프레임워크 인터페이스에 다양한 사용자 정의 구현을 "끼워 넣을" 수 있다. 사용자는 자바의 상속 구조를 사용하여 기본 구현을 재정의하고 이러한 컴포넌트에 고유한 커스텀 구현을 만들 수 있다.[23]
스윙은 '''컴포넌트 기반 프레임워크'''이며, 해당 컴포넌트군은 모두 궁극적으로 javax.swing.JComponent 클래스에서 파생되었다. 스윙 객체군은 비동기적으로 이벤트를 발생시키며, 각각 프로퍼티를 가지고 있으며, 각 컴포넌트에 고유한 메서드 호출에 대응한다. 스윙 컴포넌트는 JavaBeans 컴포넌트이며, Java Beans Component Architecture 사양을 준수한다.
4. 2. 설정 가능
운영 환경에 영향을 받지 않고 동일한 화면을 보여줄 수 있도록 시스템에 대한 의존도를 최소화하고 각종 컴포넌트들을 자바에서 직접 그려서 구현하였다. 따라서 여러 환경에서 동일한 모습을 보일 수 있도록 구현되었으나 대신 해당 시스템의 고유한 모습을 보여줄 수 없다. 이러한 약점을 보완하기 위하여 룩 앤드 필(Look And Feel영어)이라는 기능을 지원하는데 이 기능을 이용하여 프로그램 전체의 UI 모습을 바꿀 수 있다. 이클립스가 대표적인 자바 통합 개발 환경(IDE, Integrated Development Environment영어)으로 자리 잡으면서 SWT가 널리 퍼지게 되자 이와 비슷한 그래픽을 보여주는 라이브러리들이 나오기 시작하였다.[24]
Swing은 런타임 메커니즘과 간접적인 구성 패턴에 크게 의존하기 때문에, 설정 값이 실행 중에 근본적으로 변경되어도 대응할 수 있게 되어 있다. 예를 들어, Swing 기반의 실행 중인 애플리케이션의 사용자 인터페이스를 핫 스왑할 수 있다. 게다가, 사용자가 독자적인 룩앤필 구현을 제공할 수도 있으며, 이를 통해 애플리케이션의 코드를 전혀 변경하지 않고 기존 Swing 애플리케이션의 룩앤필을 균질하게 변경하는 것이 가능해진다.
4. 3. 경량 UI
운영 환경에 영향을 받지 않고 동일한 화면을 보여줄 수 있도록 시스템에 대한 의존도를 최소화하고 각종 컴포넌트들을 자바에서 직접 그려서 구현하였다. 따라서 여러 환경에서 동일한 모습을 보일 수 있도록 구현되었으나, 대신 해당 시스템의 고유한 모습을 보여줄 수 없다.[24]
하드웨어 그래픽 가속장치(Graphic Accelerator영어)를 사용할 수 없는 경우에는 직접 컴포넌트를 그리는 방식으로 인해 속도가 많이 저하된다. 이는 스윙이 느리다는 인식을 가져오게 된 계기가 되었으나, 추후 JDK가 업그레이드 되면서 차차 개선되었다.
모든 Swing 컴포넌트는 AWT 컨테이너에 의존하는데, 이는 Swing의 `JComponent`가 AWT의 `Container`를 확장했기 때문이다. 이를 통해 Swing은 호스트 OS의 GUI 관리 프레임워크(장치와 스크린의 대응, 키 조작 및 마우스 이동 등 사용자와의 상호 작용 포함)에 연결될 수 있다. Swing은 OS에 얽매이지 않는 고유의 의미를 OS 고유의 컴포넌트 위에 "대체"하고 있으며, 모든 Swing 컴포넌트는 AWT의 `Container`에 정의된 `component.paint()` 호출에 따라 자체적으로 그래픽 장치에 렌더링한다. 그러나 AWT 컴포넌트와 달리 Swing 컴포넌트는 자체 렌더링을 담당한다.
이러한 "대체"와 "분리"는 보이는 부분뿐만 아니라, 컴포넌트 포함 계층 내에서 발생하는 이벤트에서 OS 독립적인 의미의 관리와 응용에도 적용된다. Swing 아키텍처는 OS GUI의 다양한 표현 형식을 단순하고 일반화된 패턴에 대응시키는 작업을 AWT 컨테이너에 위임하고, 그 위에 `JComponent` 모델 형태로 풍부하고 복잡한 GUI 의미를 구축한다.
4. 4. 느슨한 결합과 MVC
스윙의 아키텍처는 플랫폼 독립적인 자바 모델-뷰-컨트롤러 GUI 프레임워크이다. 스윙은 단일 스레드 프로그래밍 모델을 따른다.[11]
스윙 라이브러리는 모델-뷰-컨트롤러 소프트웨어 설계 패턴을 널리 사용한다.[12] 이 패턴은 사용자가 보고 있는 데이터를 사용자가 인터페이스 컨트롤을 통해 볼 수 있도록 개념적으로 분리한다. 이 때문에 대부분의 스윙 컴포넌트에는 관련 ''모델''이 있으며(자바 인터페이스 측면에서 지정됨), 프로그래머는 다양한 기본 구현을 사용하거나 직접 제공할 수 있다. 프레임워크는 모든 구체적인 컴포넌트에 대한 모델 인터페이스의 기본 구현을 제공한다. 스윙 프레임워크를 일반적으로 사용할 때는 사용자 지정 모델을 만들 필요가 없는데, 프레임워크에서 스윙 라이브러리의 해당 하위 클래스와 기본적으로 투명하게 연결되는 일련의 기본 구현을 제공하기 때문이다. 일반적으로 테이블, 트리 및 때로는 목록과 같은 복잡한 컴포넌트만 애플리케이션별 데이터 구조 주변에 사용자 지정 모델 구현이 필요할 수 있다. 스윙 아키텍처가 가능하게 하는 잠재력을 잘 이해하려면, 테이블 및 목록에 대한 사용자 지정 모델이 DAO 및/또는 EJB 서비스를 래핑하는 가상 상황을 고려해 볼 수 있다.
일반적으로 스윙 컴포넌트 모델 객체는 연결된 JComponent에서 사용할 (개념적) 데이터 모델에 대한 이벤트 발생 및 접근 가능한 속성을 정의하는 간결한 인터페이스를 제공한다. 전체 MVC 패턴이 느슨하게 결합된 협업 객체 관계 패턴이므로, 모델은 데이터 모델 객체에 이벤트 리스너를 연결하기 위한 프로그래밍적 수단을 제공한다. 이러한 이벤트는 모델 중심적이며(예: 테이블 모델의 "행 삽입" 이벤트), JComponent 특수화에 의해 GUI 컴포넌트에 대한 의미 있는 이벤트로 매핑된다.
예를 들어, JTable에는 테이블이 테이블 데이터를 어떻게 액세스할지 설명하는 TableModel이라는 모델이 있다. 이 모델의 기본 구현은 2차원 배열에서 작동한다.
스윙 JComponent의 뷰 컴포넌트는 개념적 GUI 컨트롤을 그래픽으로 표현하는 데 사용되는 객체이다. GUI 프레임워크로서 스윙의 특징은 네이티브 호스트 OS의 GUI 컨트롤을 사용하는 것과 달리 프로그래밍 방식으로 렌더링된 GUI 컨트롤에 의존한다는 점이다.
4. 5. AWT와의 관계
AWT는 시스템의 그래픽 컴포넌트를 직접 사용하여 해당 시스템의 모습을 그대로 구현한다. 또한 스레드 보안(Thread Safe영어)이 되어 있어 스윙과 비교하여 컴포넌트 업데이트에 문제가 발생하지 않는다.[25] AWT는 최소 JDK 1.2, 혹은 성능을 위하여 더 최신의 JVM이 필요한 스윙에 비하여 자바에서 지원하는 최초의 그래픽 툴킷으로 버전에 상관없이 모든 JVM에서 사용 가능하다.[25] 마이크로소프트가 썬 마이크로시스템즈와의 자바 사용권에 대한 재판에서 패소함에 따라 신규 JVM을 지원하지 않고 있는데, MS의 기존 JVM에서도 AWT는 사용 가능하다 (2007년 12월 31일로 만료됨).[25]
그러나 자바 1.2 이후 컴포넌트의 제약에도 불구하고 Java2D, Java3D 등의 풍부한 그래픽 환경을 제공한다.
자바 초기 버전부터 AWT(추상 윈도우 툴킷)는 사용자 인터페이스 컴포넌트를 위한 플랫폼 독립적인 API를 제공해왔다. AWT에서 각 컴포넌트는 기본 윈도잉 시스템에 특정한 네이티브 피어 컴포넌트에 의해 렌더링되고 제어된다.
반면, Swing 컴포넌트는 운영 체제의 윈도잉 툴킷에서 네이티브 리소스 할당이 필요하지 않기 때문에 종종 "경량"이라고 묘사된다. AWT 컴포넌트는 "중량 컴포넌트"라고 불린다.[13]
Swing API의 상당 부분은 AWT의 보완적인 확장이다. 모든 Swing 경량 인터페이스는 AWT 중량 컴포넌트 내에 존재하는데, Swing의 모든 최상위 컴포넌트 (JApplet, JDialog, JFrame, JWindow)는 AWT 최상위 컨테이너를 확장하기 때문이다. Java 6 Update 10 이전에는 동일한 창 내에서 경량 및 중량 컴포넌트를 모두 사용하는 것이 Z-order 비호환성으로 인해 권장되지 않았다. 그러나 이후 버전의 자바에서 이러한 문제가 해결되었으며, Swing 및 AWT 컴포넌트 모두 이제 Z-order 문제 없이 하나의 GUI에서 사용할 수 있다.
Swing이 경량 컴포넌트를 그리는 데 사용하는 핵심 렌더링 기능은 JFC의 또 다른 부분인 Java 2D에서 제공된다.
; 경량 UI:
Swing의 고수준 유연성은 네이티브 호스트 OS의 GUI 부품 표시를 오버라이드할 수 있는 능력을 반영한 것이다. Swing은 해당 GUI 부품을 Java 2D API로 렌더링하며, 네이티브 사용자 인터페이스 툴킷을 호출하지 않는다. 따라서 Swing 컴포넌트에는 해당 네이티브 OS의 GUI 컴포넌트와 같은 것은 없으며, 하층의 그래픽 GUI에서 가능한 범위 내에서 어떻게 렌더링하든 자유롭다.
모든 Swing 컴포넌트는 핵심 부분에서 AWT 컨테이너에 의존한다. Swing의 JComponent가 AWT의 Container를 확장했기 때문이다. 이를 통해 Swing을 호스트 OS의 GUI 관리 프레임워크(장치와 스크린의 대응, 키 조작 및 마우스 이동 등 사용자와의 상호 작용 포함)에 삽입할 수 있게 되었다. Swing은 Swing 고유의 (OS에 얽매이지 않는) 의미를 하층의 (OS 고유의) 컴포넌트 군에 "대체"하고 있을 뿐이다. 모든 Swing 컴포넌트는 (AWT의) Container로 정의된 component.paint() 호출에 따라 자체적으로 그래픽 장치에 렌더링한다. 그러나 해당 렌더링을 OS 고유의 "무거운"(heavy weight) 위젯에 위임하는 AWT 컴포넌트와 달리, Swing 컴포넌트는 자체 렌더링을 자신의 책임으로 수행한다.
이 "대체"와 "분리"는 보이는 부분뿐만 아니라, 해당 컴포넌트 포함 계층 내에서 발생하는 이벤트에서 OS 독립적인 의미의 관리와 응용에도 적용할 수 있다. Swing 아키텍처는 OS의 GUI가 가지고 있는 의미에 주어진 다양한 표현 형식을, 단순하지만 일반화된 패턴에 대응시키는 작업을 AWT 컨테이너에 위임하고 있다. 그 일반화된 플랫폼 위에 구축하면, JComponent 모델 형태로 풍부하고 복잡한 GUI 의미를 구축하게 된다.
4. 6. SWT와의 관계
표준 위젯 툴킷(SWT)은 원래 IBM에서 개발하여 현재 이클립스 (자유 소프트웨어 공동체)에서 관리하는 툴킷이다. SWT는 AWT의 헤비급 컴포넌트와 많은 공통점을 가지고 있다. 이는 기본 윈도우 툴킷과의 더욱 정확한 호환성과 프로그래밍 모델에서 기본 네이티브 윈도우 툴킷에 대한 노출이 증가하는 장점을 제공한다.[14]
SWT는 스윙에 비교하면 비교적 저수준의 GUI 툴킷으로, 많은 경우 고수준 제어를 위해 JFace와 함께 사용된다. AWT와 비슷하게 시스템의 컴포넌트를 직접 사용하며 지원하지 않는 경우에만 에뮬레이트한다. 그러나 최신의 대부분 운영 환경에서는 시스템에서 동일한 기능을 제공한다.
시스템 자원을 직접 활용하기에 대개의 경우 스윙에 비해 속도가 빠르며 해당 운영 환경 고유의 모습을 나타낸다. 그러나 시스템 자원 활용을 위하여 JNI(Java Native Interface영어)를 사용하기 때문에 이식성에 제한이 있다.
SWT와 Swing의 성능에 대한 상당한 논쟁과 추측이 있어 왔다. 일부에서는 SWT가 JNI에 크게 의존하기 때문에 GUI 컴포넌트와 Java가 데이터를 통신해야 할 때는 느리지만, 데이터 모델이 GUI에 로드된 경우에는 렌더링 속도가 더 빠를 것이라고 암시했지만, 어느 쪽도 확인되지 않았다.[15]
5. 예제
스윙 컴포넌트는 `Runnable` 인터페이스를 구현하는 클래스의 인스턴스를 생성하여 인스턴스화 및 처리된다. 그런 다음 main 메서드에서 생성된 메서드를 사용하여 이벤트 디스패치 스레드에서 실행된다 (스윙과 스레드 안전성 참조). 스윙 코드는 이 기술을 사용하지 않고도 실행할 수 있지만, 스윙은 스레드 안전하지 않으므로 여러 스레드에서 리소스를 호출하면 스레드 간섭 및 메모리 일관성 오류가 발생할 수 있어 바람직하지 않다.[16]
스윙에서 텍스트 필드를 만들려면 `JTextField` 객체를 인스턴스화하고 컨테이너에 추가하면 된다. `DocumentListener` 인터페이스를 연결하여 텍스트 내용 변경 사항을 동적으로 모니터링할 수 있으며, 이를 통해 입력 데이터의 실시간 유효성 검사, 서식 지정 또는 자동 완성을 구현할 수 있다. 텍스트 필드 입력 유효성 검사는 데이터 무결성을 보장하고 오류를 방지하는 데 매우 중요하다. 스윙은 정규 표현식, 입력 마스크 또는 사용자 정의 유효성 검사 로직을 포함한 여러 유효성 검사 기술을 제공한다. `InputVerifier` 인터페이스를 구현하여 특정 유효성 검사 규칙을 정의하고 입력이 유효하지 않을 때 사용자에게 즉각적인 피드백을 제공할 수 있다.
5. 1. 기본 예제 (Hello World)
다음은 스윙 기반의 간단한 프로그램 예시이다. 이 프로그램은 레이블과 버튼이 있는 창(javax.swing.JFrame)을 표시한다.```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() {
// 창 생성
JFrame f = new JFrame("Hello, !");
// 창이 닫힐 때의 동작 설정
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 버튼이 레이블 위에 겹쳐지지 않도록 레이아웃 관리자 추가
f.setLayout(new FlowLayout());
// 레이블과 버튼 추가
f.add(new JLabel("Hello, world!"));
f.add(new JButton("Press me!"));
// 창 내부의 컴포넌트 정렬
f.pack();
// 기본적으로 창은 보이지 않습니다. 보이도록 설정합니다.
f.setVisible(true);
}
public static void main(String[] args) {
SwingExample se = new SwingExample();
// 이벤트 큐에서 올바른 시간에 애플리케이션을 실행하도록 예약합니다.
SwingUtilities.invokeLater(se);
}
}
```
다음은 "Hello World"를 포함하는 단일 창을 생성하는 스윙 응용 프로그램 예제이다.
```java
// Hello.java (Java SE 8)
import javax.swing.*;
public class Hello extends JFrame {
public Hello() {
super("Hello World");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
add(new JLabel("Hello, world!"));
pack();
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(Hello::new);
}
}
```
첫 번째 `import`는 `javax.swing` 패키지의 모든 public 클래스와 인터페이스를 포함한다.
`Hello` 클래스는 `JFrame` 클래스를 `extends`한다. `JFrame` 클래스는 윈도우를 제목 표시줄 및 닫기 컨트롤과 함께 구현한다.
`Hello()` 생성자는 먼저 상위 클래스 생성자를 호출하여 `"Hello World"` 매개변수를 전달하여 프레임을 초기화하며, 이 매개변수는 윈도우의 제목으로 사용된다. 그런 다음 `JFrame`에서 상속된 `setDefaultCloseOperation(int)` 메서드를 호출하여 제목 표시줄의 닫기 컨트롤을 선택했을 때 기본 작업을 `WindowConstants.EXIT_ON_CLOSE`로 설정한다. 이렇게 하면 프레임이 닫힐 때 `JFrame`이 해제되어 (단순히 숨겨지는 것과 반대로) Java 가상 머신이 종료되고 프로그램이 종료된다. 다음으로 문자열 `"Hello, world!"`에 대한 `JLabel`이 생성되고 상위 클래스에서 상속된 `add(Component)` 메서드를 호출하여 레이블을 프레임에 추가한다. 상위 클래스에서 상속된 `pack()` 메서드를 호출하여 윈도우의 크기를 조정하고 내용을 배치한다. 상위 클래스에서 상속된 `setVisible(boolean)` 메서드는 Boolean 매개변수 `true`로 호출되어 프레임이 표시된다.
`main()` 메서드는 프로그램이 시작될 때 Java 가상 머신에 의해 호출된다. 이 메서드는 새로운 `Hello` 프레임을 인스턴스화한다. 이 코드는 AWT 이벤트 디스패칭 스레드에서 생성자를 호출하기 위해 `invokeLater(Runnable)` 메서드를 사용하여 코드의 스레드 안전 방식으로 실행되도록 한다. 프레임이 표시되면 `main` 메서드를 종료해도 프로그램이 종료되지 않는데, 이는 모든 Swing 최상위 윈도우가 해제될 때까지 이벤트 디스패칭 스레드가 활성 상태로 유지되기 때문이다.
아래 코드는 스윙 기반의 매우 간단한 프로그램이다. 레이블과 버튼을 포함하는 창을 표시한다.
```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 {
private JFrame f;
public SwingExample() {
// 창 생성
f = new JFrame("Hello World!");
// 창이 닫힐 때의 동작 설정
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 버튼이 레이블 위에 겹쳐지지 않도록 레이아웃 관리자 추가
f.setLayout(new FlowLayout());
// 레이블과 버튼 추가
f.add(new JLabel("Hello, world!"));
f.add(new JButton("Press me!"));
}
@Override
public void run() {
// 창 내부의 컴포넌트 정렬
f.pack();
// 기본적으로 창은 보이지 않습니다. 보이도록 설정합니다.
f.setVisible(true);
}
public static void main(String[] args) {
// 이벤트 큐에서 올바른 시간에 애플리케이션을 실행하도록 예약합니다.
SwingUtilities.invokeLater(new SwingExample());
}
}
```
모든 스윙 컴포넌트의 인스턴스화 및 처리가 Runnable 인터페이스를 구현하는 클래스의 인스턴스를 생성하여 수행되는 방식에 주목해야 한다. 그런 다음 main 메서드에서 생성된 메서드를 사용하여 이벤트 디스패치 스레드에서 실행된다 (스윙과 스레드 안전성 참조). 스윙 코드는 이 기술을 사용하지 않고도 실행할 수 있지만 (예: Runnable을 구현하지 않고 모든 명령을 run 메서드에서 main 메서드로 이동) 스윙은 스레드 안전하지 않으므로 여러 스레드에서 리소스를 호출하면 스레드 간섭 및 메모리 일관성 오류가 발생할 수 있으므로 좋은 형식으로 간주된다.[16]
```java
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class HelloWorld implements Runnable {
@Override
public void run() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new JLabel("Hello, world!"));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
HelloWorld hello = new HelloWorld();
SwingUtilities.invokeLater(hello);
}
}
5. 2. 텍스트 필드
텍스트 필드를 통해 사용자는 애플리케이션에 텍스트 또는 데이터를 입력할 수 있다. 스윙에서 텍스트 필드를 만드는 것은 간단하다. `JTextField` 객체를 인스턴스화하고 컨테이너에 추가하면 된다.```java
import javax.swing.*;
public class TextFieldExample {
public static void main(String[] args) {
// JFrame 생성
JFrame frame = new JFrame("텍스트 필드 예시");
// JTextField 생성
JTextField textField = new JTextField(20);
// 텍스트 필드를 JFrame에 추가
frame.add(textField);
// JFrame 크기 설정 및 표시
frame.setSize(300, 200);
frame.setVisible(true);
}
}
```
텍스트 필드의 기능을 향상시키면 사용자 상호 작용이 개선된다. `DocumentListener` 인터페이스를 연결하여 텍스트 내용의 변경 사항을 동적으로 모니터링할 수 있으며, 이를 통해 입력 데이터의 실시간 유효성 검사, 서식 지정 또는 자동 완성을 구현할 수 있다.
텍스트 필드 입력의 유효성 검사는 데이터 무결성을 보장하고 오류를 방지하는 데 매우 중요하다. 스윙은 정규 표현식, 입력 마스크 또는 사용자 정의 유효성 검사 로직을 포함한 여러 유효성 검사 기술을 제공한다. `InputVerifier` 인터페이스를 구현하여 특정 유효성 검사 규칙을 정의하고 입력이 유효하지 않을 때 사용자에게 즉각적인 피드백을 제공할 수 있다.
5. 3. 버튼 이벤트 처리
javaimport 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 {
private JFrame f;
public SwingExample() {
// 창 생성
f = new JFrame("Hello World!");
// 창이 닫힐 때의 동작 설정
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// 버튼이 레이블 위에 겹쳐지지 않도록 레이아웃 관리자 추가
f.setLayout(new FlowLayout());
// 레이블과 버튼 추가
f.add(new JLabel("Hello, world!"));
f.add(new JButton("Press me!"));
}
@Override
public void run() {
// 창 내부의 컴포넌트 정렬
f.pack();
// 기본적으로 창은 보이지 않음. 보이도록 설정.
f.setVisible(true);
}
public static void main(String[] args) {
// 이벤트 큐에서 올바른 시간에 애플리케이션을 실행하도록 예약.
SwingUtilities.invokeLater(new SwingExample());
}
}
```
모든 스윙 컴포넌트의 인스턴스화 및 처리는 `Runnable` 인터페이스를 구현하는 클래스의 인스턴스를 생성하여 수행된다. 그런 다음 main 메서드에서 생성된 메서드를 사용하여 이벤트 디스패치 스레드에서 실행된다 (스윙과 스레드 안전성 참조). 스윙 코드는 이 기술을 사용하지 않고도 실행할 수 있지만 (예: `Runnable`을 구현하지 않고 모든 명령을 `run` 메서드에서 `main` 메서드로 이동) 스윙은 스레드 안전하지 않으므로 여러 스레드에서 리소스를 호출하면 스레드 간섭 및 메모리 일관성 오류가 발생할 수 있으므로 좋은 형식으로 간주된다.[16]
참조
[1]
뉴스
What is Java Swing? - Definition from Techopedia
https://www.techoped[...]
2018-11-03
[2]
웹사이트
JAVA SWING GUI TUTORIAL
https://cs.nyu.edu/~[...]
2018-11-03
[3]
웹사이트
Developing a basic GUI application using JavaFX in Eclipse
https://opensourcefo[...]
2017-07
[4]
웹사이트
Sun and Netscape to jointly develop Java Foundation Classes
http://www2.prnewswi[...]
Netscape Communications Corporation
2011-08-08
[5]
웹사이트
SUN DELIVERS NEXT VERSION OF THE JAVA PLATFORM
http://www.sun.com/s[...]
Sun Microsystems
2012-01-08
[6]
웹사이트
JDK 11 update: JavaFX will be decoupled from the JDK
https://jaxenter.com[...]
2018-03-08
[7]
웹사이트
Developing a basic GUI application using JavaFX in Eclipse
https://opensourcefo[...]
2017-07
[8]
웹사이트
The Future of JavaFX and Other Java Client Roadmap Updates
https://blogs.oracle[...]
2018-03-07
[9]
웹사이트
Why is Swing Called Swing?
https://blogs.oracle[...]
2020-09-24
[10]
웹사이트
Rich clients emerge as alternatives for Web applications
https://www.computer[...]
2020-09-24
[11]
웹사이트
Swing threading and the event-dispatch thread
https://www.infoworl[...]
2020-07-26
[12]
웹사이트
A Swing Architecture Overview
https://www.oracle.c[...]
Sun Microsystems
2020-07-26
[13]
웹사이트
Mixing Heavyweight and Lightweight Components
https://www.oracle.c[...]
Oracle
2020-07-26
[14]
웹사이트
Swing vs. SWT Performance - Have a Look at the Call Stacks
http://www.javalobby[...]
2006-03-03
[15]
웹사이트
SWT Vs. Swing Performance Comparison
http://public.cosyla[...]
Cosylab
2006-03-03
[16]
웹사이트
The Event Dispatch Thread
https://docs.oracle.[...]
[17]
문서
The Event Dispatch Thread
https://geeksprogram[...]
[18]
서적
Thinking in Java
http://www.agentgrou[...]
Prentice Hall
2016-05-13
[19]
웹사이트
JavaFX Developer Home
https://www.oracle.c[...]
[20]
서적
Java Swing
O'Reilly Media, Inc
[21]
웹사이트
JavaFX FAQ
http://www.oracle.co[...]
2016-08-01
[22]
문서
"Swing threading and the event-dispatch thread - JavaWorld"
http://www.javaworld[...]
[23]
문서
"LookAndFeel (Java Platform SE 7 )"
http://docs.oracle.c[...]
Oracle Documentation
2012-05-26
[24]
웹인용
스윙으로 구현한 이클립스(Fakeclipse) - UI만 구현
http://www.jgoodies.[...]
2010-01-21
[25]
웹인용
MSJVM(Microsoft Java Virtual Machine) 지원
http://www.microsoft[...]
2010-01-21
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com