서블릿 관련한 내용을 설명하는 API DOCs를 구했다.

<< Download JSR-000151 J2EE(TM) 1.4 Platform API Documentation >>

ㅡㅅ-)> 아쉽게도... 현재까지 한글화 된 녀석은 찾지 못했다.
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에서 실행된 내용을 스크린샷을 뜨지 못하는군요. 뭐~ 이렇습니다.

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

피할 수 없다면, 즐겨라!! 푸하하하하하... ㅡㅅ-);; 그렇다고 정신줄을 놓을 필요는 없겠죠?
프로그래밍 작업에 있어서 예제를 보면서 작업을 하는 것이 매우 효율적이라는 연구들이 많은데 정작 API에 대해서 가장 먼저 배울수 있는 자바 Doc등의 API 문서에는 매우 적은 양의 API가 포함되어 있다는 것이다.(저희가 조사한바에 Java6 API 문서는 1% 의 메소드에만 예제가 달려 있다.)
출처 -  HannKim, 소프트웨어 스토리(http://www.se.or.kr/16) 중

  자바를 공부하면서, 새로운 클래스와 메소드를 찾아서 사용해야할 때 많이 사용하는 API 문서.

  ^^ 자바의 바이블이라고도 할 수 있는 API 문서 내에서 자동으로 API문서 관련한 예제를 찾아준다면, 나와 같은 초보를 비롯해서 API를 수시로 열여봐야 하는 프로그래머라면 누구든지 대환영을 할 것으로 여겨진다. ^^

API문서 생성기 내에 예제 검색 로봇이 탑재되는 방식일까요? ^^
API문서를 작성하는 사람이 선택하는 방식!? 과연 어떤 방식으로 나올까요!? ^^

저의 짧은 의견을 제시하자면, API 문서의 예제를 별도로 관리하는 API 예제 서버를 만들어서, 거기에서 새로운 업데이트가 있을 때마다 업데이트가 진행되는 방식은 어떨까요? ^^; 이 예제는 Wiki - 백과 처럼 작성을 하는 방법도 좋지 않을까 생각합니다.

● 예제를 테스트해볼 수 있는 곳 :  http://ids.postech.ac.kr:8080/exoaExamples/api/
● 한나님이 OKJSP에 올리신 글 : http://www.okjsp.pe.kr/seq/137424

사진 출처 : http://farm4.static.flickr.com/3298/3507015519_7a22bb5cd3.jpg



꼬오오옥!! >ㅅ< 완성해주십시오. ㅎㅎ.

Java Generic Programming 관련 내용 :

WIKI 사이트 : http://en.wikipedia.org/wiki/Generics_in_Java

SUN 사이트 : http://java.sun.com/developer/technicalArticles/J2SE/generics/index.html


  J2SE 5.0에서 가장 두드러진 특징 중의 하나는 제네릭(Generic) 프로그래밍을 지원한다는 것이다. 제네릭 프로그래밍이란 효율적인 알로그림의 추상적인 형태로 표현하기 위한 프로그래밍 기법이다(Generic Programming is a programming mehod that is based in finding the most abstract representations of efficient algorithms. - Alexander Stepanov 정의, WIKI 사이트 참조).


  자바는 제네릭 프로그래밍을 위해서 제네릭 타입과 메소드를 제공한다. 자바 제네릭 프로그래밍은 기존 C++언어의 템플릿과 유사한 점도 있지만 차이점도 많이 갖고 있다. 이러한 차이점들은 C++ 템플릿에 비해 자바 제네릭 프로그래밍에 여러 가지 장점을 제공한다. 자바 제네릭 프로그래밍은 C++ 의 템플릿에 대해서 다음과 같은 장점을 갖는다.

  • 컴파일 시 타입 체킹 가능 - 자바 제네릭 프로그래밍은 컴파일 시에 타입 체킹이 가능하기 때문에 실행 시에 형변환에서 발생할 수 있는 많은 에러를 방지할 수 있다.

  • 하나의 컴파일 된 코드 생성 - C++의 템플릿은 실제로 사용되는 데이터에 따라 여러 개의 컴파일된 코드를 생성하는 데 비해서 자바는 하나의 컴파일된 코드를 생성한다.

  • 소스 코드 불필요 - C++의 템플릿을 사용하는 경우에 템플릿을 사용하기 위해서는 템플릿 소스 코드가 필요하지만, 자바 제네릭 프로그래밍을 사용하는 경우에는 컴파일된 라이브러리만 존재하면 된다.


● 제네릭 클래스, 인터페이스

자바에서 제네릭 클래스, 인터페이스, 메소드는 '<' 과 '>' 문자를 이용해서 표현한다. 예를 들어, GList라는 제네릭 클래스는 다음과 같은 형태로 정의할 수 있다. 이 때 E는 타입을 표현하기 위해서 사용되며, 포멀 파라미터 타입(Formal parameter type)이라고 한다.

   

제네릭 Glist 클래스 정의

class GLisst<E> {
    void add(E x) {
        ...
    }
    ...
}

  정의된 제네릭 클래스는 생성해서 사용할 수 있다. 이 때 제네릭 클래스를 생성할 때 사용되는 타입( 예 : Integer )을 Actual Type Argument라고 한다. 또한 제네릭 타입 선언을 위해 호출하는 것( 예 : GList<Integer> )을 파라미터화된 타입이라고 한다.


● List 인터페이스 사용

GList<Integer> myList = new GList<Integer>();

  파라미터화된 타입(parameterized type)은 클래스 혹은 인터페이스 이름 C와 파라미터 섹션에 해당되는 <T1, ... , Tn>으로 구성된다. 즉, C<T1, ... , Tn>으로 표현된다. 파라미터화된 타입은 다음과 같은 형태로 선언될 수 있다.


형태 : 파라미터화된 타이(Parameterized type)

Class Or Interface < ReferenceType [, ReferenceType ] >


다음 예는 파라미터화된 타입을 선언하는 것을 보여준다.

파라미터화된 타입

Vector<String>

Seq<Seq<A>>

Seq<String>.Zipper<Integer>

Collection<Integer>

Paint<String, String>


J2SE 5.0 에서 작성된 제네릭 프로그램은 컴파일된 후에 J2SE 1.4의 JVM에서도 실행될 수 있다. 이것은 제네릭 특성을 기존 JVM에서도 호환성 있도록 변환하기 떄문에 가능하다. 이처럼 제네릭 프로그램을 제네릭을 사용하지 않는 형태로 변환하는 것을 타입 제거(Type erasure)라고 한다.


java.util 패키지의 자바 컬렉션(Collection) 클래스들은 기본적으로 제네릭 프로그래밍을 지원하도록 만들어졌다. 예를 들어, java.util 패키지의 Vector 클래스도 제네릭 클래스 형태로 정의되어 있다. 따라서 우리는 Vector 클래스를 제네릭 프로그래밍 방법으로 사용할 수 있다. 다음의 StrinVector.java 예제는 Vector 를 이용해서 제네릭 프로그래밍을 사용하는 방법을 보여준다. 제네릭 프로그래밍을 사용하는 경우에 보다 편리하게 프로그래밍을 작성할 수 있다.


ex) StringVector.java

import java.util.*;

    public class StringVector {

    public static void main( String args[] ) {

    Vector<String> v = new Vector<String>();   // 문자열을 원소로 갖는 백터 객체 v를 생성한다.
    v.addElement("Hello");
    v.addElement("World!!");
    //v.add(5); 컴파일시 에러 발생, 5는 String 타입이 아니다.

    for ( String s : v ) { //for 문을 이용해서 백터에 포함된 원소들을 찾아서 출력한다.
        System.out.println( s );
    }
    }

    }



    ex) NormalVector.java (제네릭 프로그래밍 방법을 사용하지 않았을 경우)

    import java.util.*;


    public class NormalVector {

    public static void main( String args[] ) {
    Vector v = new Vector();   // 문자열을 원소로 갖는 백터 객체 v를 생성한다.
    v.addElement("Hello");
    v.addElement("World!!");
    //v.add(5); 컴파일시 에러 발생, 5는 String 타입이 아니다.
    int n = v.size();
    for ( int i = 0 ; i < n ; i++ ) { //for 문을 이용해서 백터에 포함된 원소들을 찾아서 출력한다.
    String s = (String) v.elementAt( i );
    System.out.println( s )
    }
    }

    }

    제네릭 클래스를 사용할 때 타입 파라메터를 기술하지 않는 경우에 컴파일 시에 경고 메시지가 출력된다. -Xlint 옵션을 이용해서 컴파일 하면, 이 경고 메시지를 볼 수 있다.
    Note: VectorTest.java uses unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.


    ex) ValueWrapper.java ( 타입 파라메터 T를 갖고, T 타입의 멤버 필드 value와 value() 메소드를 갖는다.)

    public class ValueWrapper<T> {   // ValueWrapper 클래스는 타입 파라메터 T를 갖는 제네릭 클래스이다.

        private T value;            // value 멤버필드는 T타입이다.

        public ValueWrapper(T value) {    //ValueWrapper 의 생성자,
            this.value = value;
        }

        public T value() {
            return value;                  // value() 메소드는 T 타입의 값을 리턴한다.
        }

        public static void main(String[] args) {
           
            ValueWrapper<String> sf = new ValueWrapper<String>("Hello"); //<String>타입의 ValueWrapper의 객체 sf 생성
            System.out.println( sf.value() );

            ValueWrapper<Integer> si = new ValueWrapper<Integer>(new Integer(10)); // <Integer>타입은 <String>타입이 아니기 떄문에, new로 객체선언 해줘야한다.
            System.out.println( si.value() );

        }
    }


    실행결과( 객체 생성시 타입 파라메터 T를 <String>이나 <Integer>로 설정할 때 다른 값을 출력하는 것을 확인할 수 있다)

    Hello
    10


    자바의 제네릭 프로그래밍은 JVM은 변경하지 않으면서 새로운 기능을 제공한다. 따라서 J2SE 5.0 이전에 작성된 프로그램들과도 호환성이 유지된다. 예를 들어, Vector 클래스는 제네릭 클래스로 정의되어 있지만, 타입을 갖기 않는 다음과 같은 형태로 사용할 수도 있다.

     

    ex) 타입이 없는 경우

    Vector v = new Vector();

     

    이처럼 제네릭 클래스에서 타입 파라미터를 사용하지 않는 것을 로타입(Low Type)이라고 한다. 앞의 예에서 v는 로타입이다. 로타입을 사용하지 않는 경우에는 Object 클래스가 타입 파라메터로 사용된다. 파라미터화된 클래스 타입에서 로타입으로 할당은 가능하지만, 안전하지 않기 때문에 컴파일 시에 경고 메시지를 출력한다.


    ex) Cell.java

    1. class Cell<E> {
          private E value;

          public Cell(E v) {
              value = v;
          }

          public E get() {
              return value;
          }

          public void set(E v) {
              value = v;
          }

          public static void main(String[] args) {
             
              Cell<String> x = new Cell<String>( "abc" ); // <String>타입의 Cell 개체 x 생성
              String value = x.get();                        // 개체x가 생성되면서 데이터 "abc"를 반환하는 get() 이용하여 String value 에 넣는다.
              System.out.println( value );
              x.set( "def" );                                // 개체 x에 "def"를 대입한다.

              Cell y = x;                                    // String 타입을 갖는 Cell 객체 x는 로타입 형태인 y에 값을 할당할 수 있다.
              value = (String) y.get();                    // Y 는 로타입이기 때문에 타입 파라미터로 Object가 사용된다. 따라서 형변환을 해야 value에 값을 할당할 수 있다.
              System.out.println( value ) ;
              y.set( "hello" );

          }
      }

    로 타입을 사용하는 경우에는 컴파일 할 때 경고 메시지가 출력된다.

     

    Cell.java:26: warning: [unchecked] unchecked call to set(E) as a member of the raw type Cell
            y.set( "hello" );
                 ^
    1 warning

     

    제네릭 프로그래밍은 타입을 매개 변수로 사용함으로써 프로그램의 일반성을 높이지만, 때로는 타입 파라미터의 범위를 제한해야 하는 경우도 존재한다. 이러한 필요성 때문에 타입 파라미터는 다음과 같은 형태로 범위를 제한할 수 있다.

     

    ex) 타입 파라미터의 범위 제한

    1. public class C1<T extends Number> { ... }
    2. public class C2<T extends Person & Comparable> { ... }

    C1 클래스를 사용하는 경우에 파라미터로는 Number 클래스의 서브클래스만 가능하다.  C2 클래스의 경우에는 Person 클래스로부터 상속 받으며, Comparable 인터페이스를 구현한 클래스만 타입 파라미터로 사용될 수 있다. 타입 파라미터의 상위 타입을 지정하는 경우에는 부모 클래스를 처음에 오도록 하고, 인터페이스들은 & 를 이용해서 여러개 존재할 수 있다.

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

    http://xrath.com 에서 번역한 내용입니다.

    Java SE 6 한글 문서 : http://xrath.com/javase/ko/6/docs/ko/
    Java SE 6 한글 문서 다운로드 : http://xrath.com/files/jdk-6-docs-ko.zip

    자세한 내용은 http://xrath.com/blog/entry/697 를 참고하세요. ^^

    + Recent posts