저자: 『Learning Wireless Java』의 저자 Qusay Mahmoud, 역 최원용
이 기사는 『Learning Wireless Java』의 저자 Qusay Mahmoud가 작성한 시리즈 기사의 첫 번째에 해당하는 기사입니다. 여기서 우리는 5 챕터의 첫 번째 색션을 다룰 것이며 여러분에게 MIDP GUI 프로그래밍과
Abstract Window Toolkit(AWT)를 사용법을 소개할 것입니다.
핸드헬드의 사용자 인터페이스 필요 조건은 데스크탑과는 차이가 있습니다. 예를 들면 핸드헬드의 디스플레이 크기는 더 작고, 입력장치로는 마우스나 펜과 같은 포인팅 도구까지는 포함하지 않습니다. 이와 같은 이유 때문에 여러분이 데스크탑 상에서 할 수 있는 핸드헬드 디바이스 애플리케이션 작동을 위해 같은 유저 인터페이스 프로그래밍 가이드라인을 따르지 않을 수도 있습니다.
CLDC 자체로는 GUI 기능성을 정의하지 않습니다. 그 대신, J2ME를 위한 공식 GUI 클래스들은 MIDP같은 프로필을 포함하며, Java Community Process(JCP)에 정의됩니다. 여러분은 MIDP에 포함시키되는 GUI클래스가 Abstract Window Toolkit(AWT)을 기반으로 하지 않는 점을 알아야 합니다. 아래에 열거된 질문들은 중요한 이슈입니다.
왜 AWT를 재사용하지 않는가?
많은 생각을 거친 후 전문가 그룹은 기존 AWT와 Project Swing class를 다음과 같은 이유로 하위 목록에 두지 않기로 결정했습니다.
- AWT는 데스크탑 컴퓨터에 맞게 디자인되고 최적화되었습니다.
- AWT는 사용자 상호 작용 모델을 가정합니다. AWT의 컴포넌트 세트는 마우스처럼 포인팅 디바이스로 작업하기 위해 디자인되었습니다. 그렇지만 핸드폰을 비롯한 수많은 핸드헬드 디바이스들은 사용자가 입력하기 위한 키패드만 가지고 있습니다.
- AWT에는 많은 특징이 있으며, 핸드헬드 디바이스상에서는 발견할 수 없는 기능을 위한 지원이 포함되어 있습니다. 예를 들어 AWT는 윈도우 관리를 위해 윈도우 오버래핑을 재조정하는 것과 같은 광범위한 지원을 합니다. 그러나 핸드헬드 디바이스의 제한된 디스플레이 크기는 윈도우를 비현실적으로 만듭니다. 그러므로 AWT의 레이아웃 관리자나 윈도우 관리자는 핸드헬드 디바이스에서는 필요하지 않습니다.
- 유저가 AWT 기반의 애플리케이션과 상호작용 할 때 이벤트 오브젝트는 동적으로 생성됩니다. 이 오브젝트들은 단지 연합된 이벤트들이 애플리케이션이나 시스템에 의해 처리될 때까지만 존재합니다. 또한 오브젝트가 가비지 컬렉션에 적절하게 될 대에도 그러합니다. 그렇지한 핸드헬드의 제한된 CPU나 메모리로는 그 모든 것을 다룰 수 없습니다.
MIDP GUI APIs
사전에 드러난 문제들 때문에 MIDP는 AWT와는 아주 상이한 GUI로 생략한 것을 포함합니다. MIDP GUI는 이벤트 세트를 각각 더불어 소유하는 고수준과 저수준 API로 구성되어 있습니다. 이 챕터는 고수준과 저수준 API에서 사용하는 오브젝트 예제에 대해 논의할 것입니다. 그렇지만 API에서 이벤트 핸들링 하기는 다음 챕터에서 논의하기로 합시다.
고수준 API는 정보 이동 디바이스간의 이식성을 중요하게 여기는 애플리케이션을 위해 디자인되었습니다. 정보 이식을 위해 API는 보고 느끼는 것을 넘어선 고수준의 추상적인 면을 사용합니다. 예를 들어 여러분은 고수준 컴포넌트의 시각화 표현(모양, 색, 글꼴)을 정의할 수 없습니다. 컴포넌트와 관련된 대부분의 상호작용은 위의 방법에 의해 인캡슐되지만 애플리케이션은 그것들을 알 수 없습니다. 결과적으로 기본적인 구현으로는 디바이스 하드웨어와 사용자 인터페이스 스타일에 필요한 적용을 해주어야 합니다. 고수준 API를 구현하는 클래스들은 모두
javax.microedition.lcdui.Screen 클래스를 계승하고 있습니다.
저수준 API는 추상적인 면을 거의 제공하지 않습니다. 저수준 입력 이벤트의 접근뿐만 아니라 그래픽 요소들의 정확한 배치와 통제를 필요로 하는 애플리케이션을 위해 디자인되었습니다. 이 API는 디스플레이를 이용하는 것에 대한 완벽한 조정능력을 애플리케이션에게 부여합니다.
javax.microedition.lcdui.Canvas와
javax.microedition.lcdui.Graphics 클래스는 저수준 API를 실행합니다. 그러나 이 API가 특정 디바이스를 전문으로하는 세부사항에 접근하는 메커니즘을 제공하기 때문에 우리는 저수준 API에 접근하는 MIDlets이 이동할 수 있지는 않습니다.
MIDP GUI 모델
간단히 말해 MIDP GUI 모델이 작동하는 방법은 다음과 같습니다. MIDP 디바이스에서 어떤 것을 보여주기 위해
javax.microedition.lcdui.Display 클래스에 의해 표현되는 디바이스의 디스플레이가 필요할 것입니다.
Display 클래스는 위와 같은 기능과 디바이스의 디스플레이 능력들에 대하여 정보 검색 방법들을 제공하고 각 동적 MIDlet위해 구체적인 예를 드는 디스플레이 관리자입니다.
디바이스의 디스플레이를 얻기는 쉽습니다. 그러나 이 오브젝트 자체는 별 흥미가 없습니다. 대신, 더욱 흥미로운 추상적인 면은 디바이스를 통해 유저 입력을 조정하고 그래픽 오브젝트를 구성 및 인캡슐하는 스크린(screen)입니다. 스크린은
javax.microedition.lcdui.Screen 오브젝트에 의해 재구성되며,
setCurrent() 메소드에 의해 요청되는
Display 오브젝트에 의해 보여집니다. 애플리케이션에는 여러 가지 스크린이 있지만 딱 하나의 스크린만 디스플레이에서 보이며 사용자는 그 스크린 상에 있는 항목을 통해 거부할 수 있습니다. 그림-1은 디스플레이(display)와 스크린(screen)간의 1대 다수의 관계도 입니다.
[그림 1] 디스플레이와 스크린의 관계도
MIDP GUI에는 세 가지 타입이 있습니다.
- List나 TextBox 컴포넌트같은 복잡한 사용자 인터페이스 컴포넌트를 요약하는 스크린(List 컴포넌트는 [그림 2]와 같으며 TextBox 컴포넌트는 [그림 3]과 같다). 이 스크린의 구조는 미리 정해지며 애플리케이션은 이 스크린에 다른 컴포넌트를 추가할 수 없습니다.
|
|
|
[그림 2] 독립적인 선택 리스트 |
|
[그림 3] TextBox 예제 |
- 컴포넌트로 사용되는 일반적인 스크린. 애플리케이션은 텍스트, 이미지, 컨테이너 역할을 하는 폼의 UI 컴포넌트와 관련된 간단한 세트를 추가할 수 있습니다.
- 스크린은 Canvas나 Graphics 클래스의 하위클래스 같은 저수준 API의 전후관계에서 사용됩니다.
lcdui 패키지
모든 MIDP GUI는
javax.microedition.lcdui 패키지를 포함합니다. 이 패키지는 [테이블 1]과 [테이블 2]에서처럼 세 가지 인터페이스와 21개의 클래스들을 포함합니다.
[테이블 1] lcdui 인터페이스들 |
인터페이스
|
설명
|
Choice |
Choice의 미리 정의된 수에서 선택을 구현하는 사용자 인터페이스 컴포넌트를 위해 API를 정의 |
CommandListener |
구현에서 고수준 이벤트를 받는데 필요한 애플리케이션에 의해 사용됨 |
ItemStateListener |
인터랙티브 아이템의 내부 상태에서 변화를 지시하는 이벤트를 받는데 필요한 애플리케이션에 의해 사용됨 |
[테이블 2 ] lcdui 클래스들 |
클래스
|
설명
|
Alert |
사용자 데이터를 보여주며, 다음 스크린이 실행되기 전에 일정시간을 기다리게 하는 스크린 |
AlertType |
Alert의 특성을 지시하는 유틸리티 클래스 |
Canvas |
저수준 이벤트를 다루며 그래픽을 디스플레이로 끌어내기 위해 요청을 해야 하는 애플리케이션 작성을 위한 기본
클래스 |
ChoiceGroup |
Form 내에 위치시킬 의도인 선택 가능한 요소 그룹 |
Command |
실행의 문법적 정보를 인캡슐하는 구성체 |
DateField |
Form으로 올 수 있는 캘린더 데이터와 시간 정보를 표현하기 위한 편집할 수 있는 컴포넌트 |
Display |
시스템 입력 장치와 디스플레이 관리자를 표현하는 유틸리티 |
Displayable |
디스플레이상에 올 수 있는 능력이 있는 오브젝트 |
Font |
글씨체와 자간을 표현하는 유틸리티 |
Form |
임의의 혼합된 아이템(예를 들어 이미지, 텍스트, 텍스트 필드, choice 그룹)을 포함하는 스크린 |
Gauge |
Form에서 사용되는 막대 그래프 값을 표현하기 위한 유틸리티 |
Graphics |
단순한 2차원 기하학 렌더링 능력을 제공하는 유틸리티 |
Image |
그래픽 이미지 데이터를 가지고 있는 유틸리티 |
ImageItem |
Image 오브젝트가 form또는 alert에 추가될 때 레이아웃 컨트롤을 제공하는 유틸리티 |
Item |
Form이나 Alert 에 추가될 수 있는 모든 컴포넌트의 수퍼클래스 |
List |
선택 목록을 포함하는 스크린 |
Screen |
모든 고수준 사용자 인터페이스 클래스들의 수퍼클래스 |
StringItem |
String(기호열)을 포함할 수 있는 아이템 |
TextBox |
사용자가 본문을 입력하고, 편집할 수 있는 스크린 |
TextField |
Form에서 있는 수정 가능한 텍스트 컴포넌트 |
Ticker |
디스플레이를 가로질러 연속적으로 실행되는 텍스트 ticker-type의 일부분. Canvas를 제외한 모든
스크린 타입에 첨부되어 있다. |
[그림 4]의 클래스 다이어그램은 중요 클래스들과 서로간의 관계를 보여줍니다.
[그림 4] lcdui 패키지의 중요한 클래스들의 클래스 다이어그램