최근 Sun에서는 Java를 기반으로 하는 RIA 애플리케이션 개발툴인 JavaFX 1.1 버전을 내놓았습니다. 6월 1일에 JavaOne(http://java.sun.com/javaone)에서 JavaFX를 기반으로 하는 자바 앱스토어(Java AppStore)를 발표할 가능성이 높습니다. ^^ Vector project 라는 이름으로 준비 중인 것 같습니다. Sun 사이트에는 그 내용을 찾아보기는 어렵습니다.

어쨌든~ JavaFX는 몇 년 안에 큰 유행의 흐름을 만들어낼 수 있지 않을까라는 기대를 하면서 JavaFX에 대한 공부를 시작하기로 하였습니다. JvavFX SDK를 설치하는 방법부터 알려드리겠습니다. 현재로는 윈도우와 맥 만 지원을 하는 것으로 보입니다. ㅡㅅ-);; Java SE SDK1.6을 지원한다고 하는데, 사용하는 소스를 보면 1.5 버전을 사용하는 것으로 나오더군요. 버전업되면서 점점 나아지겠지요?

우선 JavaFX를 다운받으러 가야겠지요? ^^ JavaFX 공식 사이트(http://www.javafx.com) 으로 이동합니다. 오른쪽에 보이는 Get 버튼이나 Download Now 버튼을 누르시면 JavaFX SDK를 다운 받는 페이지로 이동합니다.


위의 네모친 JavaFX 1.1.1 SDK를 다운 받으시면 됩니다. JavaFX_sdk-1_1_1-windows-i586.exe 를 다운 받으시면 됩니다. 이를 실행하시면 아래와 같은 화면이 나타납니다. ㅡㅅ-)> 별다른 거 없습니다.  중간에 동의한다고 해주시고 경로확인해 주시고 Next~ Next 설치를 해주시면 됩니다. ^^ 그럼 설치 완료!!!







요렇게 Finish 가 뜨면 완료 된 것입니다. 참 쉽죠잉~~?? JavaFX는 NetBeans 에서 사용을 하시는 게 좋은 듯 합니다. 이클립스에서도 JavaFX에 대한 플러그인을 내놓기는 했지만, 아직은 그 기능을 완전히 지원하지는 못하는 듯 합니다. 그렇지만 NetBeans 의 크기가 좀 비대해서 설치하기 곤란한 상황도 있습니다. 아직 저에게는 이클립스나 넷빈이나 낯설기는 마찬가지군요. ㅡ0-);;

JavaFX와 관련된 내용도 꾸준하게 올려보도록 하겠습니다. ^^
지난 2009년 5월 18일, SUN의 CEO인 Jonathan Schwartz는 자신의 블로그에서

"Will the Java Platform Create The World's Largest App Store?"


라는 제목으로 영상 포스팅을 올렸습니다. 그는 거기서 아래처럼 말했습니다. 의역이 많이 들어갔습니다. ㅡ0-);; A4 2페이지분량의 글이었지만, 핵심은 마지막 몇줄 안되더군요. A4 2페이지 읽는데 많은 시간이 걸리네요.ㅠㅅ-) 영어만 보면 졸려.
  오는 2009년 6월 2일, 샌프란시스코에서 JavaOne(http://java.sun.com/javaone/) 을 통해 SUN 사에서는 새로운 플랫폼이라고 할 수 있는 JavaFX(http://www.sun.com/software/javafx/index.xml, 공식 홈페이지 : http://www.javafx.com/)를 공식적으로 선보일 예정이다. 이 JavaFX를 기반으로 하는 Project Vector도 선보일 것으로 보입니다.


RIA 개발 플랫폼이라고도 할 수 있는 JavaFX가 공식 발표되면사람들의 많은 관심과 함께 새로운 흐름을 만들어내지 않을까라는 당연한 생각을 하게 됩니다. ^^ 조만간 JavaFX를 통해제작된 세계최대의 app Store의 탄생을 기다려 봅니다. 이클립스에서도 JavaFX 관련한 Plug-in을 내놓을까요??




● SUN CEO Jonathan's blog
http://blogs.sun.com/jonathan

● JavaFX 관련 홈페이지
http://www.sun.com/javafx
http://www.javafx.com

● 플랫폼(PlatForm) 이란 무엇인가?
http://www.ihoney.pe.kr/353

● 대표적인 App Sotre (APPLICATION Store)
애플 스토어 : http://store.apple.com/kr
MS 앱스토어 : http://www.microsoft.com/emea/windowsmobileapps/default.mspx
SK 앱스토어(9월 출시예정) : http://tvpot.daum.net/my/MyClipView.do?clipid=14651110&ownerid=.ywpQd7EUPU0

● JavaFX란 무엇인가? 많이 부족해서 부끄럽군요....ㅡ0-);;
http://java.ihoney.pe.kr/9
http://java.ihoney.pe.kr/26

'Java > Language' 카테고리의 다른 글

JavaFX SDK 1.1 설치하기  (0) 2009.05.24
j2ee API DOCs, 자바EE 한글화 API 문서(1.3.1 버전)  (0) 2009.05.21
09/05/19, 서블릿과 JDBC를 연결하다.  (0) 2009.05.19
JSP(Java Server Page)  (0) 2009.05.18
서블릿(Servlet) 용 API DOCs  (0) 2009.05.18
DTFE에서 5월 23일, JAVAFX 관련한 기술 관련 세미나가 있다.
'JAVAFX? 그게 뭐지? 처음 듣는데..?' 라는 생각에 한번 찾아봤다. ㅡㅅ-)>

Adobe에서 Flex( 관련 사이트 : http://www.adobe.com/kr/products/flex/ )를 발표한 뒤 얼마 있지 않아서 MS 측에서는 SilverLight( 관련사이트 : http://silverlight.net/ )를 발표했다. 여기에 호응하여 JAVA 측에서도 JAVAFX( 관련사이트 : http://javafx.com/)를 발표했다. 순서야 어찌되었든, 웹2.0(웹 2.0 - 위키백과) 에 들어서고 AJAX 기법이 도입되고 RIA를 요구하게 되면서 탄생을 한 웹 애플리케이션 개발툴 이라고 할 수 있겠다. ㅡㅅ-)> 이렇게 말하니까 내가 뭔가 아는 것 같잖아? 훗~ 난 아직 초보 개발자.

● Adobe Flex
● MicroSoft SiverLight
● JavaFX

ㅡㅅ-);; 실버라이트만 큰데...?? Adobe는 Flex를 간단히 Fx라고만 하고 있다. ㅡㅅ-)> 우훗~

세가지에 모두 관심을 기울일 수는 없는 노릇이고...
ㅡㅅ-)> 허니몬은 JAVAFX에 중점을 두겠습니다.

오늘은 넷빈(http://www.netbeans.org/)에 대한 간단한 정보를 얻기 위해 java.sun.com 에 방문했다가 아래 링크의 관련한 글이 눈에 띄어서 한번 링크를 클릭하고 들어가 보았습니다. ^^

http://java.sun.com/developer/technicalArticles/javafx/AppORama/
맛뵈기 JAVAFX 라고 할까요? 3개의 JAVAFX 애플리케이션이 있습니다. 오른쪽에 있는 Launch 에서 클릭하여 직접 실행하여 볼 수가 있습니다. ^^
아래의 것은 윈도우에서 실행되는 위젯과 관련된 widgetFX 입니다. ㅡㅅ-)
자바를 기반으로 하고 있기 때문에, jre가 설치된 컴퓨터 환경에서는 운영체제 상관없이 설치가 될 것입니다. 오른쪽 하단에 보시면 살짝 나와있는 부분(Get the WidgetFX SDK)보시면 아시겠지만, 표준개발도구도 있으니까 다운 받아서 한번 사용해보세요. ^^; ㅎㅎ. 정작 저는 이녀석을 만져보려면 시간이 좀 필요합니다. 후훗...

제 컴퓨터에 설치한 화면.

ㅡㅅ-)> Picasa에서는 widgetFX에서 실행된 내용을 스크린샷을 뜨지 못하는군요. 뭐~ 이렇습니다.

흥미를 끄는 녀석들이 많이 나타나고 있습니다. 항상 하는 말이지만!! 머리는 입력량의 한계가 있는데!!
배워야 할 것들은 많아져만 가고!!! 이것이 개발자가 되기 위해 짊어지어야 할 숙명인가!?

피할 수 없다면, 즐겨라!! 푸하하하하하... ㅡㅅ-);; 그렇다고 정신줄을 놓을 필요는 없겠죠?

'상속'은 클래스를 확장하기 위해 편리한 방법이지만 클래스간의 연결을 강하게 고정시킨다. 소스코드 상에서

  1. class SomethingGood extends Something {
       ...
    }

라고 쓰면 SomethingGood 클래스는 Something 클래스의 하위 클래스가 됩니다. 그리고 이 관계는 소스 코드를 고쳐 쓰지 않는 한 바꿀 수 없는 매우 견고한 연결이 된다. 프로그램의 필요에 따라서 클래스 간의 관계를 척척 바꾸고 싶을 때에 상속을 사용하는 것은 부적절하다. 교체할 때마다 소스 코드를 변경할 수 없기 때문이다. 이와 같은 경우에는 '상속'이 아니라 '위임'을 사용한다.

 

예제 프로그램 Display.java

  1. public class Display {
        private DisplayImpl impl;
        public Display(DisplayImpl impl) {
            this.impl = impl;
        }

        public void open() {
            impl.rawOpen();
        }

        public void print() {
            impl.rawPrint();
        }

        public void close() {
            impl.rawClose();
        }

        public final void display(){
            open();
            print();
            close();
        }

    }

예제 프로그램(추상 클래스) DisplayImpl.java

  1. public abstract class DisplayImpl {
        public abstract void rawOpen();
        public abstract void rawPrint();
        public abstract void rawClose();
    }

 

예제 프로그램에서는 Display 클래스 내에서 위임이 사용되고 있다. Display 클래스의 impl 필드에는 구현되는 인스턴스가 저정되어 있어서

... open을 실행할 때에는 impl.rawOpen()을 호출한다.

... print를 실행할 때에는 impl.rawPrint()을 호출한다.

... close를 실행할 때에는 impl.rawClose()를 호출한다.

 라는 식으로 '떠넘기기:위임'을 하고 있다. 이것이 위임이다. 상속은 견고한 연결이고 위임은 느슨한 연결이다. DIsplay 클래스의 인스턴스를 만드는 단계에서 인수로 전달되어온 것과 연결되기 때문이다. 상속과 위임의 관계에 대해서는 Template Method 패턴에서 등장하므로 참고하기 바란다.

이 글은 스프링노트에서 작성되었습니다.

Java에서는 다음과 같이 인스턴스(객체)를 만드는 방법이 있다.

 

   new
 


일반적으로 인스턴스는 Java의 예약어 new를 사용해서 만든다. 다음과 같이 하면 Something 클래스의 인스턴스를 만들고 변수 obj에 대입할 수 있다.

--> obj라는 이름을 가지는 Something 클래스 타입의 객체를 가진다 라고 말할 수 있겠다.

Something obj = new Something();

 이 경우 클래스 이름(여기에서는 Something)을 소스 안에 기술할 필요가 있다.

 

   clone()
 

Prototype 패턴에서 등장했던 clone 메소드를 사용하면 이미 존재하는 인스턴스를 기초로 새로운 인스턴스를 만들 수 있다. 다음과 같이 하면 자신(this)을 기초로 새로운 인스턴스(객체)를 만들 수 있다(단, 생성자는 호출되지 않는다).

java.lang
클래스 Class<T>

java.lang.Object 
java.lang.Class<T>

java.lang
클래스 Object

java.lang.Object

clone

protected Object  clone()


throws
CloneNotSupportedException

이 객체의 카피를 작성해, 돌려줍니다. 「카피」의 정확한 이유는, 객체의 클래스에 의해 다릅니다. 일반적으로는, 임의의 객체 x 에 대해, 다음의 식
 x.clone() ! = x
하지만 true 이며, 다음의 식
 x.clone(). getClass() == x.getClass()
도 true 인 것입니다만, 이것들도 절대적인 요건이 아닙니다. 또 다음의 식
 x.clone(). equals(x)
도 일반적으로 true 가 됩니다만, 이것도 절대적인 요건이 아닙니다.

일반적으로,super.clone 를 호출하는 것으로 반환되는 객체를 취득할 수 있습니다. 클래스 및 그 슈퍼 클래스 모든 것 (Object 를 제외한다)이 이 규칙에 따르는 경우,x.clone(). getClass() == x.getClass() 가 성립합니다.

일반적으로, 이 메소드에 의해 반환되는 객체는, 이 객체 (복제되고 있다)로부터 독립하고 있을 필요가 있습니다. 이 독립성을 달성하기 위해(때문에),super.clone 가 돌려주는 객체의 필드를 1 개 이상 (객체가 돌려주기 전에) 변경하는 것이 필요하게 되는 경우가 있습니다. 이것은, 일반적으로, 복제하는 객체의 내부 「심층 구조」를 구성하는 가변 객체의 카피, 및 이러한 객체에의 참조를 카피에의 참조에 옮겨놓는 것을 의미합니다. 클래스에 프리미티브(primitive) 필드 또는 불변 객체에의 참조만이 포함되는 경우, 일반적으로,super.clone 에 의해 반환되는 객체내의 필드를 변경할 필요는 없습니다.

Object 클래스의 clone 메소드는, 특정의 복제 처리를 실행합니다. 우선, 이 객체의 클래스가 Cloneable 인터페이스를 구현하고 있지 않는 경우는,CloneNotSupportedException 가 throw 됩니다. 배열은 모두, 인터페이스 Cloneable 를 구현하고 있는 것이라고 보여지는 것에 주의해 주세요. 구현하고 있지 않는 경우, 이 메소드는 이 객체의 클래스의 새로운 인스턴스를 생성해, 그 필드를 모두, 이 객체의 대응하는 각 필드의 내용으로 초기화합니다. 이것은 대입과 같아, 필드의 내용 자신이 복제되는 것은 아닙니다. 즉 이 메소드는, 객체의 「shallow 복사」를 생성합니다만, 「딥 카피」는 생성하지 않습니다.

Object 클래스 자체는,Cloneable 인터페이스를 구현하지 않기 때문에, 클래스가 Object 인 clone 메소드를 호출하면(자), 실행시에 예외가 throw 됩니다.

반환값:
이 인스턴스의 복제
예외:
CloneNotSupportedException - 객체의 클래스가 Cloneable 인터페이스를 지원하고 있지 않는 경우. clone 메소드를 오버라이드(override) 한 서브 클래스도, 인스턴스를 복제할 수 없는 것을 나타내기 위해서(때문에) 이 예외를 throw 하는 일이 있는
관련 항목:
Cloneable

JDK 1.6 API 상에 설명되는 clone() 메소드의 개요

 

  1. class Something {
        ...
        public Something createClone() {
            Something obj = null;
            try {
                obj = (Something)clone();
            } catch ( CloneNotSupportedException e ) {
                e.printStackTrace();
            }
            return obj;
        } 
    }

 

   newInstance()
 

java.lang.Class 클래스의 newInstance 메소드를 사용하면 Class의 인스턴스(객체)를 기초로 그 Class가 표시하고 있는 클래스의 인스턴스(객체)를 만들 수 있다(인수 없는 생성자가 호출된다).

newInstance

public T  newInstance()


throws
InstantiationException ,


IllegalAccessException
이 Class 객체가 나타내는 클래스의 새로운 인스턴스를 생성합니다. new 식에 빈 상태(empty)의 인수 리스트를 지정했을 경우와 같이, 클래스의 인스턴스가 생성됩니다. 클래스는, 초기화되어 있지 않으면 초기화됩니다.

이 메소드는 확인이 끝난 예외 등, 인수 없음의 생성자 에 의해 throw 된 예외를 보내는 것에 주의해 주세요. 이 메소드를 사용하는 것으로, 그 외의 경우에는 컴파일러에 의해 실행되는 컴파일시의 예외 확인을 효과적으로 우회도로 할 수 있습니다. Constructor.newInstance 메소드는, (확인 끝난) InvocationTargetException 의 생성자 에 의해 throw 된 예외를 랩 하는 것으로, 이 문제를 회피합니다.


반환값:
이 객체가 나타내는, 클래스의 새롭게 할당할 수 있었던 인스턴스
예외:
IllegalAccessException - 클래스 또는 그 인수 없음의 생성자 에 액세스 할 수 없는 경우
InstantiationException - 이 Class 가 abstract 클래스, 인터페이스, 배열 클래스, 원시형, 또는 void 를 나타내는 경우, 클래스가 인수 없음의 생성자 을 보관 유지하지 않는 경우, 혹은 인스턴스의 생성이 다른 이유로써 실패했을 경우
ExceptionInInitializerError - 이 메소드에 의한 초기화가 실패했을 경우
SecurityException - 시큐리티 매니저 s 가 존재해, 이하의 조건의 어떤 것인가가 채워지는 경우
  • s.checkMemberAccess(this, Member.PUBLIC) 의 호출이 이 클래스의 신규 인스턴스의 작성을 허가하지 않는다
  • 호출측의 클래스 로더가 같지 않은지, 현재의 클래스 로더의 상위 클래스 로더와 s.checkPackageAccess() 의 호출이 이 클래스의 패키지에의 액세스를 허가하지 않는다

다음은 newInstance의 예입니다. Something 클래스의 인스턴스 someobj가 있다면 다음 식에서 Something 클래스의 인스턴스를 새롭게 만들 수 있다.

  1. someobj.getClass().newInstance();

 

실제로 newInstance 메소드는 InstantiationException이나 IllegalAccessException을 예외로 제공하기 때문에 try{ } catch() {}로 묶든지 메소드에 throws을 선언해야 한다.

 

이 글은 스프링노트에서 작성되었습니다.

+ Recent posts