본문 바로가기

old drawer/Java

[Java] AWT와 Swing의 차이점

1. AWT와 Swing의 차이

1> Swing의 등장배경

AWT는 사용하기에는 쉽지만 어느정도 한계가 있다. 가령 버튼에 롤오버 이미지를 사용한다던지 풍선말 기능 등 실제로 많이 사용하는 기능들을 AWT로 구현하기란 쉽지가 않다. 또한 운영체제마다 매우 다른 GUI 구현 방식 때문에 AWT의 컴포넌트를 사용함에 있어서 많은 버그가 발견되고 있다. 즉 AWT는 모든 컴포넌트를 운영체제의 자원을 사용한다. 따라서 각기 다른 운영체제에서는 문제가 발생할 수 밖에 없다. 이런 이유 때문에 나온 것이 Swing 이다. Swing은 Top-Level 컨테이너만을 운영체제의 자원을 사용할 뿐 그 하부에 있는 모든 컴포넌트는 직접 자바 코드에 의해 그리는 방식을 가지고 있다.

1> AWT와 Swing의 차이

AWT
Swing
사용 구조

Heavy-weight Componet
- 컴포넌트을 운영체제의 GUI와 연결시키므로 운영체제에 따라 다른 모양과 배치가 나타난다.

Light-weight Componet
- 운영체제가 제공하는 컴포넌트를 사용하지 않고 직접 컴포넌트를 만들어 구현한다.

지원 패키지 java.awt.*; javax.swing.*;
장점

- 컴포넌트를 추상화함으로써 각 운영체제에서 구현하는것이 편하다.

-운영체제의 자원을 빌리지 않고 직접 화면에 그리므로 이질적인 운영체제간에 발생한 버그를 자동적으로 해결
- 발행하더라도 자바가상머신에서 해결 가능

단점

- 운영체제에 따른 미묘한 버그 발생
- 불규칙한 컴포넌트의 모양과 레이아웃 설정 문제 발생

- 실행 속도가 느려진다. 실행시 메모리를 많이 차지함
--> JDK1.4 부터 보완됨,
<출처>
http://www.javastudy.co.kr/docs/getjava/swing/1-awtswing.htm


AWT, SWT, Swing 라이브러리의 다양한 특징들을 비교했다.

표 1. AWT, SWT, Swing 비교
기능/역할/양상 AWT Swing SWT (style)
정적 텍스트 디스플레이 Label JLabel Label, CLabel
멀티 라인 정적 텍스트 디스플레이 Multiple Labels Multiple JLabels 또는 JLabel과 HTML content Multiple Labels 또는 Label과 newlines
멀티 라인 포맷의 정적 텍스트의 디스플레이 Multiple Labels와 다양한 폰트 JLabel과 HTML content Multiple Labels와 다양한 폰트
싱글 라인 텍스트 엔트리 TextField JTextField Text(SWT.SINGLE)
멀티 라인 텍스트 엔트리 TextArea JTextArea Text(SWT.MULTI)
이미지 디스플레이 N/A JLabel Label
텍스트와 이미지 디스플레이 N/A JLabel CLabel
ToolTip 팝업 도움말 N/A setToolTip on component, subclass JToolTip setToolTip on control
텍스트 엔트리 스타일링 N/A JEditorPane StyledText
아이템 리스트 선택하기 List JList List
푸쉬 버튼과 텍스트 Button JButton Button(SWT.PUSH)
푸쉬 버튼, 텍스트/이미지 N/A JButton Button(SWT.PUSH)
그리기 영역 Canvas JPanel Canvas
On/off 체크박스 CheckBox JCheckBox Button(SWT.CHECK)
라디오 선택 CheckBoxGroup ButtonGroup과 메뉴 Group과 메뉴
드롭다운 리스트 선택 Choice JComboBox Combo, CCombo
텍스트 입력하기 또는 드롭다운 리스트에서 선택하기 N/A JComboBox Combo, CCombo
스크롤 영역 ScrollPane JScrollPane Create Scrollable subclass
탑 레벨 윈도우 Dialog, Frame, Window JDialog, JFrame, JWindow Shell과 different styles
기본 윈도우 Window JWindow Shell
프레임 윈도우 Frame JFrame Shell(SWT.SHELL_TRIM)
다이얼로그 윈도우 Dialog JDialog Shell(SWT.DIALOG_TRIM)
메뉴 Menu JMenu Menu
MenuItem MenuItem JMenuItem MenuItem
메뉴 단축 키 스트로크 AWT와 동일 host dependent mnemonics과 accelerators
팝업 메뉴 PopupMenu JPopupMenu Menu(SWT.POPUP)
메뉴 바 MenuBar JMenuBar Menu(SWT.BAR)
삽입 기호 디스플레이 N/A Caret Caret
웹 브라우저 N/A JTextPane (HTML 3.2) Browser (임베디드 브라우저)
웹 페이지에 컨트롤 삽입하기 Applet JApplet Host control (ex. OLE)
기타 컨트롤의 컨테이너 Panel JPanel Composite
기타 컨트롤과 보더의 컨테이너 Panel (직접 그릴 경우) JPanel과 Border Composite(SWT.BORDER)
기타 컨트롤과 보더와 타이틀의 컨테이너 N/A JPanel과 TitledBorder Group
라디오 버튼 Checkbox JRadioButton Button(SWT.RADIO)
라디오 버튼의 확장 제어 CheckboxGroup RadioButtonGroup Group
화살표 버튼 N/A JButton과 image Button(SWT.ARROW)
국제 텍스트 지원 via ComponentOrientation AWT와 동일 많은 컴포넌트들이 지원하고 있음
포커스 트래버스 Policy와 Manager objects AWT와 동일 Next on control
커스텀 다이얼로그 Dialog subclass JDialog subclass Dialog subclass
시스템 이벤트로의 액세스 EventQueue services AWT와 동일 Display services (AWT 보다 덜함)
시스템 액세스 다이얼로그 FileDialog JColorChooser, JFileChooser ColorDialog, DirectoryDialog, FileDialog, FontDialog, PrintDialog
간단한 메시지 다이얼로그 디스플레이 N/A (Dialog 분류 필수) JOptionPane static methods MessageBox와 다양한 스타일
프롬프트 다이얼로그 디스플레이 N/A (Dialog 분류 필수) JOptionPane static methods N/A (JFace에는 존재하지 않음)
레이아웃 매니저 BorderLayout, CardLayout, FlowLayout, GridLayout, GridBagLayout AWT plus BoxLayout, CenterLayout, SpringLayout FillLayout, FormLayout, GridLayout, RowLayout, StackLayout
기본 그리기 제어 Canvas JPanel Canvas
기본 그리기 Graphics와 Graphics2D 객체 – 기본 모양과 텍스트, 임의의 Shapes와 Strokes, Bezier, 파일 등 AWT와 동일 GC object – 기본 모양과 텍스트
그리기 변형 Affine, composites AWT와 동일 N/A
오프 스크린 그리기 BufferedImage, drawImage AWT와 동일 Image, drawImage
더블 버퍼링 수동 자동/수동 호스트 컨트롤이 없을 경우 수동
프린팅 PrintJob과 PrintGraphics AWT와 동일 Printer 장치
커스텀 컬러 Color AWT와 동일 Color
커스텀 폰트 Font, FontMetrics AWT와 동일 Font
커서 선택 Cursor AWT와 동일 Cursor
이미지 기능 load from file, create dynamically, extensive edits AWT와 동일 load from file, create dynamically, basic edits
인풋 자동화 Robot AWT와 동일 N/A
툴바 디스플레이 N/A JToolBar ToolBar, CoolBar
프로그레스 바 디스플레이 N/A JProgressBar ProgressBar
영역 간 공간 분리 N/A JSplitPane Sash 또는 SashForm
탭 영역 디스플레이 N/A JTabbedPane TabFolder, CTabFolder
테이블 형태 정보 디스플레이 N/A JTable Table
테이블 칼럼 포맷 N/A TableColumn TableColumn
계층적 정보 디스플레이 N/A JTree Tree
값 범위에서 선택하기 N/A JSlider Slider
분리된 값의 범위에서 선택하기 N/A JSpinner Scale
베이스 디스플레이로 액세스 하기 Toolkit, GraphicsConfiguration, GraphicsDevice AWT와 동일 Display
시스템 트레이에 아이템 추가하기 N/A N/A Tray

SWT Swing AWT 툴킷을 비교해 보았다. 이 글이 자신에게 맞는 GUI 툴을 선택하는데 도움이 되었기 바란다.

대부분의 경우 Swing과 JFace와 결합한 SWT를 선택한다. 일반적으로 이들 툴킷들은 완벽한 기능을 갖춘 GUI를 구현하기에 충분하다. 하지만 Swing은 SWT 단독(JFace 없음)보다 우수하다. Swing은 자바에 구현된다는 장점이 있다. 완벽히 이식 가능하고 아키텍처도 뛰어나다. Swing은 또한 고급 그래픽 애플리케이션도 갖추고 있다. SWT는 SWT 기반 GUI의 퍼포먼스와 원시 호환성을 높이는 애플리케이션으로서 구현된다는 장점이 있다.

한 개의 플랫폼만을 위해 개발하고 있다면 호스트 호환성 측면에서는 SWT가 낫다. ActiveX 컨트롤 같은 호스트 기능과도 통합된다.


자바를 이용해서 데스크탑 애플리케이션을 개발하는 경우 SWT를 이용해서 구현할 것인가? Swing을 이용한 것인가?

SWT가 네이티브(native) UI를 제공하는 것이 목적이라면, Swing은 플랫폼에 독립적인(동일한) UI를 제공하기 위해서 만들어졌습니다. (UI 관점에서...)

물론 SWT 역시 플랫폼 독립적인 API를 제공합니다. SWT는 일종의 네이티브 API의 랩퍼(wrapper) 역할을 하고 있습니다. 그러므로 플래폼 별로 소스 코드가 동일하다는 것을 의미입니다. (아직 확인해보지 않았습니다)

SWT은 그 구조가 단순하기 때문에 Swing과 비교해서 상대적으로 이용 진입 장벽이 낮다고 볼 수 있습니다. 그러나 SWT에서 사용된 자원들은 garbage colleting되지 않기 때문에 명시적으로 de-allocating해야하는 번거로움이 있습니다. 그러나 이점은 오히려 전화위복이 될 수 있습니다. 자원을 빨리 반환하기 때문에 그만큼 시스템 성능이 향상되기 때문입니다. 반면 SWT이 Swing보다 유연성과 확장성이 떨어지는 것은 당연한 결과입니다.

만약 진행중인 프로젝트가 자바를 사용하지만, 특정 플랫폼에 편중되어 있는 경우 SWT가 적합합니다. 예를 들어 사용자의 대부분이 MS 윈도우를 사용하며, 나머지 일부가 Mac을 사용하는 경우입니다. 그러나 다양한 플랫폼을 지원하면서 UI 스타일의 비중이 그리 높지 않는 경우 Swing을 이용하는 것이 좋습니다.

끝으로 UI 스타일에 민감한 사용자의 관점에서는 Swing의 UI는 다소 불만족스러울 수 있습니다. 윈도우 사용자가 볼 때 Swing의 UI는 심플하지만 왠지 이질적이며, 이미 눈이 높아져버린 Mac 사용자의 입장에서 Swing은 덜 세련되어 보일 수 있습니다. 물론 Swing의 장점인 Pluggable Look and Feel을 활용할 수 있지만, 왠만한 기업에서 MS 윈도우나 Mac보다 멋진 UI를 만들기는 쉽지 않을 것 같습니다. ^^;


<출처>
http://kimswave-textcube.blogspot.com/2010/03/awt-swt-swing-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EC%9D%98-%EB%8B%A4%EC%96%91%ED%95%9C-%ED%8A%B9%EC%A7%95%EB%93%A4%EC%9D%84-%EB%B9%84%EA%B5%90.html