Understanding Personal Java
description
Transcript of Understanding Personal Java
목 차
J2ME 와 PersonalJava PJAE API
API 요소의 분류 최소 PJAE 의 정의
효율성을 고려한 PersonalJava 프로그램 설계
PJAE 를 위한 개발 지원 도구 JavaCheck 과 PJEE
주요 PJAE 구현사와 제품 PersonalJava 프로그래밍
프레임워크 e-Spider 프로그램 개발사례
Micro & Mobile Java’s
Java2 Micro Edition (J2ME)
Personal Java
Embedded Java, JavaCard, JavaTV, ...
Personal Java
네트웍 연결성이 있는 소형 기기를 위한 소규모의 Java 실행 환경
Classic VM 기반 Java API 의 부분 집합으로 구성새로운 API 도 추가로 정의
Truffle 그래픽 툴킷 , PTimer 타이머 클래스
EmbeddedJava, ...
여러 유형의 Closed System 을 정의 J2ME 를 보완하는 스펙으로 볼 수 있음
J2ME 와 PersonalJava
PersonalJava 도 CDC 를 위한 하나의 Profile 로 정의되어 J2ME 에 포함될 예정
J2ME 와 PersonalJava( 계속 )
PersonalJava ~
CDC +
Foundation Profile + Personal Profile
PJAE - PersonalJava Application Environment
JDK 1.1.8 API 의 패키지 , 클래스 ,메서드를 수정하여 정의
보안 기능은 Java 2 Security API 를 일부 채택 PJAE API 의 구성
필수 , 선택 , 미지원 , PJAE- 전용하나의 완성된 API 가 아니라 API 스펙트럼을 정의
JDK 1.1.8 의 후속 API 가 PJAE 에 자동으로 포함되지는 않음
PJAE 의 개념도
Java 2 API
JDK 1.1.8 API
JDK 1.1.8 API
Security API
PJAE- 전용 API
PJAE 의 필수 API
JDK 1.1.8 에서의 대응하는 기능을 그대로 유지하도록 정의된 API
PJAE 의 선택 API
PJAE 에서 반드시 구현하도록 요구되지는 않는 기능들의 집합
지원 여부는 PJAE 구현자 선택에 달려 있음
지원하는 경우 반드시 JDK 1.1.8 의 기능과 일치하도록 구현하여야 함
“ 미지원 선택 기능”구현되지 않은 선택 API 의 기능
PJAE 의 선택 API ( 계속 )
미지원 선택 기능 참조를 의미하는 예외 클래스com.sun.lang.UnsupportedOperationException
구현되지 않은 선택 패키지의 클래스 참조 시java.lang.NoClassDefFoundError 예외가 발생
구현되지 않은 선택 클래스의 내용 참조 시java.lang.NoClassDefFoundError 혹은 com.sun.lang.UnsupportedOperationException 예외가 발생
PJAE 의 미지원 API
PJAE 에서 지원되지 않는 기능들의 집합미지원 API 의 클래스 , 메서드 , 필드는 PJA
E 구현에 어떤 형태로든 제공되지 않아야 함
미지원 패키지나 그 내용을 참조하면 java.
lang.NoClassDefFoundError 예외 발생
PJAE 의 변경 API
JDK 1.1.8 와는 다르게 정의된 PJAE 의 기능 변경 패키지
일부 클래스가 선택 , PJAE- 전용 , 혹은 변경 클래스
변경 클래스일부 메서드가 선택 , PJAE- 전용 , 혹은 변경 메서드
변경 메서드메서드의 기능이 JDK 1.1.8 에서와 다르게 정의
PJAE 의 전용 API
PJAE 에는 있지만 JDK 에는 대응하는 기능이 없는 기능들의 집합
com.sun.lang 패키지
com.sun.util.PTimer 클래스
com.sun.awt 패키지의 input method 인터페이스
java.awt.Component.isDoubleBuffered 메서드
최소 PJAE
모든 선택 패키지 / 클래스 / 메서드 , 변경 메서드의 선택적 기능이 제공되지 않는 PJAE 의 구현
PersonalJava 프로그래머는 최소 PJAE를 목표로 프로그램을 설계 , 구축하라 !
PJAE API 의 대표적 요소 java.applet ( 필수 ) java.awt ( 변경 )
변경 클래스Frame: 생성자를 한번만 호출할 수 있음Dialog: 하나의 모드가 있는 (modal) 다이얼로그를 지원Window: 윈도우 객체의 직접 생성 금지
선택 클래스FileDialogCheckboxMenuItem, Menu, MenuBar, MenuShortcut: Fra
me 과 미지원 선택 클래스 그룹을 형성
PJAE API 의 대표적 요소 (계속 )
java.awt.datatransfer ( 필수 ) java.awt.event ( 필수 ) java.awt.iamge ( 필수 ) java.beans ( 필수 ) java.io ( 변경 )
가시적인 파일 시스템 관련 클래스들은 미지원 선택 클래스 그룹을 형성함
java.lang ( 변경 )Java 2 Security API 의 클래스와 메서드를 제공
PJAE API 의 대표적 요소 (계속 )
java.lang.reflect ( 변경 )Java 2 의 정밀 액세스 제어 클래스를 제공Constructor, Field, Method 의 직접 상위 클래스가 ja
va.lang.reflect.AccessibleObject 로 변경
java.math ( 선택 ) java.security 패키지의 코드 서명 기능과 미지원 선택 클래스의 그룹을 형성함
PJAE API 의 대표적 요소 (계속 )
java.net ( 변경 )URL 클래스
필수 프로토콜 : HTTP 1.0선택 프로토콜 : SSL, Gofer, FTP, SMTP, File
java.rmi 관련 패키지 ( 선택 ) java.security ( 변경 )
Java 2 Security API 를 채택정밀 액세스 제어는 필수 , 코드 서명은 선택 기능임 java.security.acl ( 미지원 ) java.security.cert/interfaces/spec ( 변경 )
PJAE API 의 대표적 요소 (계속 )
java.sql ( 선택 ) java.math 와 미지원 선택 클래스의 그룹을 형성함
java.text ( 필수 )지원되는 문자 인코딩은 구현에 따라 다를 수 있음
ISO 8859-1, Unicode, 플랫폼 자체의 문자 인코딩은 반드시 제공
PJAE API 의 대표적 요소 (계속 )
java.util ( 변경 )정밀 액세스 제어를 위한 Java 2 Security API 관련 클래스를 제공하여야 함
코드 서명 기능을 구현할 경우 Java 2 의 Collection API 도 완전하게 제공하여야 함
java.util.jar, java.util.zip ( 변경 )
PJAE API 의 대표적 요소 (계속 )
JDK 1.1.8JDK 1.1.8 Package Package PersonalJavaPersonalJava 포함여부포함여부java.applet 필수java.awt 변경java.awt.datatransfer 필수java.awt.event 필수java.awt.image 필수java.beans 필수java.io 변경java.lang.reflect 변경
PJAE API 의 대표적 요소 (계속 )
JDK 1.1.8JDK 1.1.8 Package Package PersonalJavaPersonalJava 포함여부포함여부java.math 선택
java.rmi 관련 선택
java.security 관련 변경
java.sql 선택
java.text 필수
java.util 변경
java.util.zip 변경
PJAE 를 위한 프로그램 설계 최소 PJAE 를 추구하라
GUI 는 단일 프레임만 가질 수 있음RMI, JDBC 등의 API 가 지원되지 않을 가능성이 있음인터넷 기능은 소켓과 HTTP 에 의존해야 함 ...
불편한 입출력을 고려하여 최소 입력 , 최적 출력을 추구하라
효율성을 항상 생각하라PJAE 는 이식성이나 유연성보다 효율성을 고려해야 할 경우가 많다
효율성을 고려한 PersonalJava 프로그램 설계
효율성의 요소실행 시간 , 실행 및 탑재에 필요한 기억 장소
효율성과 관련된 일반 원칙효율성이 의심스러우면 Java 를 사용하지 말라 ()
Java 는 효율성을 손쉽게 제어할 수 있는 언어가 아니다 !
복잡한 기능을 서버로 이전하라보다 효율적 알고리즘과 데이터 구조를 사용하라
PersonalJava 와 효율성 ( 계속 )
실행 시간을 고려하여 코드를 작성하라객체 초기화 과정에 필요한 비용을 최소화하라문자열 접속에 String 대신 StringBuffer 를 사용하라필드나 정적 변수 보다는 지역 변수를 사용하라스레드를 사용하되 불 필요한 동기화를 피하라
Vector 나 Hashtable 의 사용을 자제하라
...
PersonalJava 와 효율성 ( 계속 )
실행에 요구되는 기억장소 양을 최소화하라객체 보다는 기본형과 배열을 활용하라가능한 적은 개수의 객체를 생성하라
객체 생성을 최대한 지연시켜라 (lazy instantiation)불필요한 객체의 생성을 피하고 기존 객체를 재사용하라
자동적 가비지 수집에 지나치게 의존하지 말라...
PJAE 를 위한 프로그램 개발 J2SE 용 RAD 도구는 별로 도움이 되지 않음
PersonalJava 를 위한 통합형 개발 도구는 거의 없음 Sun 사의 개발도구를 활용할 경우
개발 : javac + pjcc (PJAE compatibility classes)검사 : JavaCheck실험 : PJEE (PersonalJava Emulation Environment)
프로파일링 , 벤치마킹 , 튜닝 java –Xrunhprof:cpu=samples MainClass
JavaCheck 플랫폼 사양 파일을 기준으로 코드에 포함된 패키지 / 클래스 / 메서드가 특정 사양의
만족여부를 판단하기 위한 도구 플랫폼 사양 파일
SGML 형식으로 인코딩된 텍스트 파일현재 최소 PJAE 1.1.0 을 위한 사양 파일만 제공
PJAE 를 위한 JavaCheck 메시지에러 : 미지원 /Unsupported, 선택 /Optional경고 : 변경 /Modified, 미해결 /Unresolved, OK
JavaCheck 실행의 예
우측 예에서는 java.awt.Frame 생성자가 변경된 기능임을 경고하고 있으며 , 프로그램 변경이 필요하지 않으면 무시해도 괜찮다는 것을 의미
PJEE-PersonalJava Emulation Environment
PJAE 준수 코드를 실행할 수 있는 데스크 탑 소프트웨어
최소 및 최대 PJAE를 위한 환경을 제공 , 다양한 구현을 위한 코드 실험 가능
최소 PJAE + Touchable LAF 에서 실험한 예
주요 PJAE 구현사와 제품
Sun 의 Reference Implementation (http://java.sun.com/)지원 환경
프로세서 : MIPS, SH3, SH4, ARM운영체제 : Windows CE
구현 수준java.awt, java.io, java.math, java.rmi, java.sql, j
ava.util.zip 패키지를 구현하였으나 java.security는 구현하지 않음
주요 PJAE 구현사와 제품 ( 계속 )
Insignia 의 Jeode (http://www.insignia.com/)Sun 코드에 의존하지 않고 가상머신 (Jeode EVM) 과 라이브러리 (Jeode Classes) 를 새로이 구축
지원 환경프로세서 : ARM, MIPS, x86, SH3, SH4, PowerPC운영체제 : Win32, VxWorks, Linux, Nucleus, BSDi, pSOS
구현 수준PJAE 1.2 의 모든 기능을 완전하게 구현하였음
주요 PJAE 구현사와 제품 ( 계속 )
NSIcom 의 JSCP/CrEme (http://www.nsicom.com)JSCP 는 Sun 사의 PersonalJava 코드를 이식 , CrEme 은 JSCP 를 WinCE 환경을 위하여 최적화 한 것지원 환경
프로세서 : 68k, Sparc, MIPS, ARM, x86, PowerPC, SH3운영체제 : DOS, Win32, Linux, LynxOS, pSOS, VRTX, VxWorks
구현 수준주문자의 요구에 따라 다양한 수준의 구현을 제공
주요 PJAE 구현사와 제품 ( 계속 )
KadaSystems 의 KadaVM (http://www.kadasystems.com/)Sun 코드에 의존하지 않고 가상머신 (Kada VM) 을 새로이 구축
지원 환경Palm Computing Platform, Win32 환경
구현 수준java.beans( 필수 ), java.rmi( 선택 ), java.security( 변경 ) 패키지를 지원하지 않음
PersonalJava 프로그래밍 프레임워크
package personal.framework Main(Frame)+Skeleton(Cards)+RatioLayout
최소 PJAE 를 위한 프로그래밍에 적합한 구조 RatioLayout
최소 자원 사용으로 복합 레이아웃을 효과적으로 표현 메뉴 처리 모듈 스켈리튼 Skeleton
카드 스택 설정 , 디스플레이 조정 등을 자동화객체의 배치를 위해 RatioLayout 을 사용
PersonalJava 프로그래밍 프레임워크 (계속 )
Skeleton ( 계속 )최소 PJAE 환경에 적합한 대화 모델 정의
look-and-feel 의 일관성 유지사용자 인터페이스 구축을 위한 코드의 중복 방지
카드 할당을 최대한 지연 , 불필요한 카드 즉시 회수 각 메뉴 처리 모듈
Skeleton 클래스를 확장하여 작성생성자 , initialize, execute, cleanup 메서드 작성모듈 사용자는 setup, fire 메서드 호출
personal.framework.Skeletonpackage personal.framework;import wire.proto.*;import java.awt.*;import java.awt.event.*;
public abstract class Skeleton extends Panel { public Skeleton(String ident, final String parent) { this.ident = ident; this.parent = parent; send = UI.makeButton(" 실행하기 "); exit = UI.makeButton(" 이전메뉴 "); send.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { fire(); }}); exit.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { cleanup(); UI.delete(this); hide(); UI.front(parent); }}); message = UI.makeStrongLabel(" 실행 대기중입니다 ", Label.LEFT); if (UI.isColor()) message.setForeground(Color.red.darker()); } ...
personal.framework.Skeleton ( 계속 )
public abstract class Skeleton extends Panel { … public Skeleton setup() { setLayout(new RatioLayout()); initialize(); UI.insert(ident, this); UI.front(ident); return this; } public void fire() { … try { execute(); … } catch (Exception ex) { putMessage(ex.toString()); } finally { … } } protected abstract void initialize(); protected abstract void execute() throws Exception; protected void cleanup() { send = exit = null; message = null; System.gc(); }
Button send, exit; Label message; ...}
PersonalJava 응용 프로그램 e-Spider
personal.framework 와 Wire Server 로 개발된 모바일형 실시간 웹 기반 종합정보시스템
증권 , 뉴스 , 웹 메일 , SMS, 영화 리뷰 , 일기 예보 , 게시판 , 영한사전 , …
유선 인터넷을 위한 웹 서비스를 수정 없이 활용
60KB 규모의 초경량 프로그램으로 배포 가능
e-Spider 스크린 샷
Wire 웹 자동화 미들웨어Wire = WebIDL Runtime Engine
웹 서버
HTTP
Wiring Protocol
Wire Inspector
웹 자동화프로그램
웹 서비스 설계와 검증
서비스 스크립트
클라이언트 코드
Wire Server
Wire 클라이언트 모듈
“ 주요 뉴스” 서비스 스크립트 <MODULE NAME="news"> <SERVICE NAME="top"
OUTPUT="topOutput" URL="http://www.kdaily.com/news/newslist.php"/>
<BINDING NAME="topOutput"> <VARIABLE NAME="stories" NULLOK="TRUE" TYPE="STRING[]"> doc.table[3].a['*[*]*'].text</VARIABLE> <VARIABLE NAME="links" NULLOK="TRUE" TYPE="STRING[]"> doc.table[3].a['*[*]*'].href</VARIABLE></BINDING>
</MODULE>
PersonalJava 클라이언트 API
class Connector Connector(String host, [int port], [boolean mode]); Binding request(String mod, String svc, Binding inputs) throws RequestFailureException; void quit();
boolean TRANSIENT = false;boolean PERMANENT = (! TRANSIENT);
class Binding WIDL 언어의 <BINDING> 요소를 추상화
“ 주요 뉴스” 메뉴 처리 모듈 import personal.framework.*; // Skeleton, UI, ...import wire.proto.*; // Wire 클라이언트 모듈 APIimport java.awt.*;
class News extends Skeleton { public News(String parent) { super(" 주요 뉴스 ", parent); } protected void initialize() { titles = UI.makeList( new ListAction() { public void fire(int index) { titles.select(index); new NewsView(titles.getItem(index), links[index]).fire(); }}); add(".02, .02; .96, .81", titles); // RatioLayout 에 따라 객체를 배치 add(".02, .84; .48, .08", send); // class Skeleton 에서 상속 받은 필드 add(".50, .84; .48, .08", exit); add(".02, .92; .96, .08", message); }
“ 주요 뉴스” 메뉴 처리 모듈 ( 계속 )class News extends Skeleton { ... protected void execute() throws Exception { // Connector Spider.getWire() throws ConnectionFailureException; Binding outputs = Spider.getWire().request("news", "top", null); // news.top 호출 stories = (String[])outputs.get("stories"); if (stories != null) for(int i = 0; i < stories.length; i++) titles.addItem(stories[i]); links = (String[])outputs.get("links"); } protected void cleanup() { if (titles != null) { titles.removeAll(); titles = null; } stories = links = null; super.cleanup(); } private java.awt.List titles; private String[] stories, links;}// News 모듈 호출 : (new News("e-Spider")).setup().fire();
e-Spider 의 배포 독자 실행형 PersonalJava 클라이언트
최소 PJAE + i18n.jar 환경 독자 실행형 Java 클라이언트
JDK1.1.8 이상을 지원하는 임의의 Java 환경 Java 혹은 PersonalJava 애플릿
http://210.217.5.110/demo.html 애플릿 참조
e-Spider is a DONATION-ware!
Final Thoughts
PersonalJava 프로그래밍의 요소최소 PJAE 에 대한 충분한 이해실행 성능과 기억 장소를 위한 프로그램 최적화 기술
재사용 프레임워크 구축과 활용 기술 PersonalJava 와 WORA
Write-Once, Really Run-Anywhere ?상위 스펙이나 프로파일에 대한 호환성은 제공하위 스펙이나 서로 다른 구현 수준에 대한 이식성은 보장되지 않음 !