1 / 49

Understanding Personal Java

Understanding Personal Java. 김 명 호 , ( 주 ) 비트웹 기술이사 (toodull@hitel.net). J2ME 와 PersonalJava PJAE API API 요소의 분류 최소 PJAE 의 정의 효율성을 고려한 PersonalJava 프로그램 설계. PJAE 를 위한 개발 지원 도구 JavaCheck 과 PJEE 주요 PJAE 구현사와 제품 PersonalJava 프로그래밍 프레임워크 e-Spider 프로그램 개발사례. 목 차.

abba
Download Presentation

Understanding Personal Java

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Understanding Personal Java 김 명 호, (주)비트웹 기술이사 (toodull@hitel.net)

  2. J2ME와 PersonalJava PJAE API API 요소의 분류 최소 PJAE 의 정의 효율성을 고려한 PersonalJava 프로그램설계 PJAE를위한개발 지원 도구 JavaCheck과 PJEE 주요 PJAE 구현사와 제품 PersonalJava 프로그래밍 프레임워크 e-Spider 프로그램 개발사례 목 차

  3. Micro & Mobile Java’s • Java2 Micro Edition (J2ME) • Personal Java • Embedded Java, JavaCard, JavaTV, ...

  4. Personal Java • 네트웍연결성이 있는 소형기기를 위한소규모의Java 실행환경 • Classic VM 기반 • Java API의부분집합으로구성 • 새로운API도추가로정의 • Truffle 그래픽툴킷, PTimer 타이머 클래스

  5. EmbeddedJava, ... • 여러유형의Closed System을정의 • J2ME를보완하는스펙으로 볼 수 있음

  6. J2ME와PersonalJava PersonalJava도CDC를위한하나의Profile로정의되어J2ME에포함될예정

  7. J2ME와PersonalJava(계속) • PersonalJava ~ CDC + Foundation Profile + Personal Profile

  8. PJAE - PersonalJava Application Environment • JDK 1.1.8 API의 패키지, 클래스,메서드를수정하여정의 • 보안기능은Java 2 Security API를일부채택 • PJAE API의구성 • 필수, 선택, 미지원, PJAE-전용 • 하나의 완성된 API가 아니라API 스펙트럼을 정의 • JDK 1.1.8의 후속 API가PJAE에자동으로포함되지는않음

  9. Java 2 API JDK 1.1.8 API PJAE-전용API Security API PJAE의 개념도

  10. PJAE의 필수API • JDK 1.1.8에서의대응하는기능을 그대로 유지하도록정의된API

  11. PJAE의 선택API • PJAE에서반드시구현하도록요구되지는않는기능들의집합 • 지원여부는PJAE 구현자선택에달려있음 • 지원하는경우반드시JDK 1.1.8의기능과일치하도록구현하여야함 • “미지원선택기능” • 구현되지 않은 선택 API의 기능

  12. PJAE의 선택API (계속) • 미지원선택기능참조를의미하는예외클래스 com.sun.lang.UnsupportedOperationException • 구현되지않은선택패키지의클래스참조 시 java.lang.NoClassDefFoundError 예외가발생 • 구현되지않은선택클래스의내용참조 시 java.lang.NoClassDefFoundError 혹은com.sun.lang.UnsupportedOperationException예외가발생

  13. PJAE의 미지원 API • PJAE에서지원되지않는기능들의집합 • 미지원API의클래스, 메서드, 필드는PJAE 구현에어떤형태로든제공되지않아야함 • 미지원패키지나 그내용을참조하면java.lang.NoClassDefFoundError예외발생

  14. PJAE의 변경 API • JDK 1.1.8와는 다르게 정의된PJAE의기능 • 변경패키지 일부클래스가선택, PJAE-전용, 혹은변경클래스 • 변경클래스 일부메서드가선택, PJAE-전용, 혹은변경메서드 • 변경메서드 메서드의기능이JDK 1.1.8에서와다르게정의

  15. PJAE의 전용 API • PJAE에는있지만JDK에는대응하는기능이없는기능들의집합 • com.sun.lang 패키지 com.sun.util.PTimer 클래스 com.sun.awt 패키지의input method 인터페이스 java.awt.Component.isDoubleBuffered 메서드

  16. 최소 PJAE • 모든 선택패키지/클래스/메서드, 변경메서드의선택적기능이 제공되지 않는 PJAE의구현 • PersonalJava 프로그래머는최소PJAE를목표로프로그램을설계, 구축하라!

  17. PJAE API의대표적요소 • java.applet (필수) • java.awt (변경) • 변경클래스 • Frame: 생성자를한번만호출할수있음 • Dialog: 하나의모드가 있는(modal) 다이얼로그를지원 • Window: 윈도우 객체의 직접생성금지 • 선택클래스 • FileDialog • CheckboxMenuItem, Menu, MenuBar, MenuShortcut: Frame과미지원 선택 클래스 그룹을형성

  18. PJAE API의대표적요소(계속) • java.awt.datatransfer (필수) • java.awt.event (필수) • java.awt.iamge (필수) • java.beans (필수) • java.io (변경) • 가시적인파일시스템관련클래스들은미지원선택클래스그룹을형성함 • java.lang (변경) • Java 2 Security API의클래스와메서드를제공

  19. PJAE API의대표적요소(계속) • java.lang.reflect (변경) • Java 2의정밀액세스제어클래스를제공 • Constructor, Field, Method의직접상위클래스가java.lang.reflect.AccessibleObject로변경 • java.math (선택) • java.security 패키지의코드서명기능과미지원 선택클래스의그룹을형성함

  20. 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 (변경)

  21. PJAE API의대표적요소(계속) • java.sql (선택) • java.math와 미지원 선택클래스의그룹을형성함 • java.text (필수) • 지원되는문자인코딩은구현에따라다를수있음 • ISO 8859-1, Unicode, 플랫폼자체의문자인코딩은반드시제공

  22. PJAE API의대표적요소(계속) • java.util (변경) • 정밀액세스제어를위한 Java 2 Security API 관련클래스를제공하여야함 • 코드서명기능을구현할경우Java 2의Collection API도완전하게제공하여야함 • java.util.jar, java.util.zip (변경)

  23. PJAE API의대표적요소(계속)

  24. PJAE API의대표적요소(계속)

  25. PJAE를위한프로그램설계 • 최소PJAE를추구하라 • GUI는단일프레임만가질수있음 • RMI, JDBC 등의API가지원되지않을가능성이있음 • 인터넷기능은소켓과HTTP에의존해야함 • ... • 불편한 입출력을 고려하여 최소 입력, 최적 출력을추구하라 • 효율성을항상생각하라 • PJAE는 이식성이나유연성보다효율성을고려해야할경우가많다

  26. 효율성을고려한PersonalJava 프로그램설계 • 효율성의 요소 • 실행 시간, 실행 및 탑재에 필요한 기억 장소 • 효율성과 관련된 일반 원칙 • 효율성이의심스러우면Java를사용하지말라 () • Java는 효율성을 손쉽게 제어할 수 있는 언어가 아니다! • 복잡한 기능을 서버로이전하라 • 보다 효율적 알고리즘과 데이터 구조를 사용하라

  27. PersonalJava와 효율성(계속) • 실행시간을고려하여코드를작성하라 • 객체 초기화 과정에 필요한 비용을 최소화하라 • 문자열접속에String 대신StringBuffer를사용하라 • 필드나정적변수보다는지역변수를사용하라 • 스레드를사용하되불필요한동기화를피하라 • Vector나 Hashtable의 사용을자제하라 • ...

  28. PersonalJava와 효율성(계속) • 실행에요구되는기억장소양을최소화하라 • 객체보다는기본형과배열을활용하라 • 가능한 적은 개수의 객체를 생성하라 • 객체 생성을최대한지연시켜라 (lazy instantiation) • 불필요한 객체의 생성을 피하고기존 객체를 재사용하라 • 자동적 가비지수집에 지나치게 의존하지말라 • ...

  29. PJAE를위한프로그램개발 • J2SE용 RAD 도구는 별로 도움이되지않음 • PersonalJava를 위한 통합형개발도구는거의없음 • Sun사의 개발도구를 활용할 경우 • 개발: javac + pjcc (PJAE compatibility classes) • 검사: JavaCheck • 실험: PJEE (PersonalJava Emulation Environment) • 프로파일링, 벤치마킹, 튜닝 • java –Xrunhprof:cpu=samples MainClass

  30. JavaCheck • 플랫폼 사양 파일을 기준으로 코드에 포함된 • 패키지/클래스/메서드가 특정 사양의 만족여부를 판단하기 위한 도구 • 플랫폼 사양 파일 • SGML 형식으로 인코딩된 텍스트 파일 • 현재 최소 PJAE 1.1.0을 위한 사양 파일만 제공 • PJAE를 위한 JavaCheck 메시지 • 에러: 미지원/Unsupported, 선택/Optional • 경고: 변경/Modified, 미해결/Unresolved, OK

  31. JavaCheck 실행의 예 • 우측 예에서는java.awt.Frame 생성자가변경된기능임을경고하고있으며,프로그램변경이필요하지않으면 무시해도괜찮다는 것을의미

  32. PJEE-PersonalJava Emulation Environment • PJAE 준수 코드를 실행할 수 있는 데스크 탑 소프트웨어 • 최소 및 최대 PJAE를 위한 환경을 제공, 다양한 구현을 위한 코드 실험 가능 • 최소PJAE + Touchable LAF에서실험한예

  33. 주요 PJAE 구현사와 제품 • Sun의Reference Implementation(http://java.sun.com/) • 지원환경 • 프로세서: MIPS, SH3, SH4, ARM • 운영체제: Windows CE • 구현수준 • java.awt, java.io, java.math, java.rmi, java.sql, java.util.zip 패키지를구현하였으나java.security는구현하지않음

  34. 주요 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의모든기능을완전하게구현하였음

  35. 주요 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 • 구현수준 • 주문자의 요구에따라 다양한수준의구현을제공

  36. 주요 PJAE 구현사와 제품(계속) • KadaSystems의KadaVM(http://www.kadasystems.com/) • Sun 코드에의존하지않고가상머신(Kada VM)을새로이구축 • 지원환경 • Palm Computing Platform, Win32 환경 • 구현수준 • java.beans(필수), java.rmi(선택), java.security(변경) 패키지를지원하지않음

  37. PersonalJava 프로그래밍 프레임워크 • package personal.framework • Main(Frame)+Skeleton(Cards)+RatioLayout • 최소PJAE를 위한프로그래밍에적합한 구조 • RatioLayout • 최소 자원 사용으로 복합 레이아웃을 효과적으로 표현 • 메뉴 처리 모듈 스켈리튼 Skeleton • 카드스택설정, 디스플레이 조정등을 자동화 • 객체의 배치를 위해 RatioLayout을사용

  38. PersonalJava 프로그래밍프레임워크(계속) • Skeleton (계속) • 최소 PJAE 환경에 적합한 대화 모델 정의 • look-and-feel 의 일관성 유지 • 사용자 인터페이스 구축을 위한 코드의 중복 방지 • 카드할당을최대한지연, 불필요한카드 즉시회수 • 각 메뉴 처리 모듈 • Skeleton 클래스를 확장하여 작성 • 생성자, initialize, execute, cleanup메서드작성 • 모듈 사용자는 setup, fire 메서드 호출

  39. personal.framework.Skeleton package 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()); } ...

  40. 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; ... }

  41. PersonalJava응용 프로그램 e-Spider • personal.framework와 Wire Server로 개발된 모바일형 실시간 웹 기반 종합정보시스템 • 증권, 뉴스, 웹 메일, SMS, 영화 리뷰, 일기 예보, 게시판, 영한사전, … • 유선 인터넷을 위한 웹 서비스를 수정 없이 활용 • 60KB 규모의 초경량 프로그램으로 배포 가능

  42. e-Spider스크린 샷

  43. Wire 웹자동화미들웨어Wire = WebIDL Runtime Engine Wire 클라이언트 모듈 Wiring Protocol 클라이언트 코드 Wire Server 웹서버 웹 자동화 프로그램 서비스 스크립트 웹 서비스 설계와 검증 Wire Inspector HTTP

  44. “주요뉴스” 서비스스크립트 <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>

  45. 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> 요소를 추상화

  46. “주요뉴스” 메뉴처리모듈 import personal.framework.*;// Skeleton, UI, ... import wire.proto.*; // Wire 클라이언트 모듈 API import 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); }

  47. “주요뉴스” 메뉴처리모듈(계속) class Newsextends 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();

  48. 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!

  49. Final Thoughts • PersonalJava 프로그래밍의 요소 • 최소 PJAE 에 대한 충분한 이해 • 실행 성능과 기억 장소를 위한 프로그램 최적화 기술 • 재사용 프레임워크 구축과 활용 기술 • PersonalJava와 WORA • Write-Once, Really Run-Anywhere ? • 상위 스펙이나 프로파일에 대한 호환성은 제공 • 하위 스펙이나 서로 다른 구현 수준에 대한 이식성은 보장되지 않음!

More Related