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 인터페이스를 구현한 클래스만 타입 파라미터로 사용될 수 있다. 타입 파라미터의 상위 타입을 지정하는 경우에는 부모 클래스를 처음에 오도록 하고, 인터페이스들은 & 를 이용해서 여러개 존재할 수 있다.

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

    1. 안녕하세ㅛ 2014.05.16 12:36 신고

      담아가겠습니다~잘 배우고갑니다

    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 를 참고하세요. ^^

    객체 생성 : 만들어진 객체 사용, 변수, 메서드 혹은 멤버 필드

    class_name 변수 = new class_name_method();

    기본 자료 타입 변수는 선언하면 메모리 공간이 할당됨.

    ‘레퍼런스 타입(배열, 클래스, 인터페이스)’은 new를 이용해서 객체를 생성하기 전까지는 메모리 공간이 할당되지 않음.


    레퍼런스

    - " == " : 메모리 주소 비교 / 기본형에서는 크기 비교

    - “equals()" : 레퍼런스 에서만 쓰임. 내용 비교


    객체 생성과 패키지

    생성자(Constructor) : class 이름과 동일한 이름을 갖는 메서드

    default 생성자는 프로그램에서 생성자를 정의하지 않는 경우에 자바의 컴파일러에 의해서 자동적으로 생성된다.

    class 변수(객체) = new 메서드();

    I) memory 할당

    ii) default 초기화

    iii) 명시적 초기화 : 생성자에서 명시한 경우

    this : 클래스 내에서 자기 자신을 자리키는 레퍼런스

    1. 상속받은 부모 클래스가 아닌 자기 자신의 멤버필드나 메서드를 명확히 표현하기 위해서 사용한다.

    2. this 는 객체 전체를 함수(메서드)의 매개변수로 전달

    this()는 생성자 안에서만 사용가능. 명시적인 초기화 이용시 사용


    Overloading : 한 클래스 내에서 함수(메서드) 이름을 동일하지만, 함수의 매개변수(타입이나 수)가 다른 경우.


    상속(Inheritance)

    <!--[if !vml]--><!--[endif]-->

    class 자식 클래스 extends 부모 클래스

    크기 비교 : 부모 클래스 > 자식 클래스

    super : 상위 클래스(부모 클래스)의 메소드나 멤버필드 필요시 자식 클래스에서 사용

    super() : 상위 클래스(부모 클래스)의 생성자 호출



    오버라이딩(Overriding) : 얹어타기 : 나는 차려진 밥상에 숟가락만 얹는다.

    상위 클래스(부모 클래스)에 있는 메서드를 서브 클래스에서 다른 작업을 하도록 동일한 함수 이름으로 재정의 하는 것.

    ▩ 추상화 클래스를 상속받아 사용할 경우 대부분 오버라이딩

    public abstract class Human {

    public abstract void...

    }

    public class Korea_human extens Human {

    public void ...

    }

    public class Honeymon extends Korea_human {

    public void

    }

     단일 상속
    인터페이스 : 다중 상속
     
     


    언어의 추상화

    추상화(Abstract) 물체 또는 현상의 주요 특성만을 표현하는 개념

    1. 자료의 추상화 : 주어진 자료 구조, 자료를 사용자가 이해 가능하게 표현하는 방식

    기본적 추상 : 저장값이 추상화, 컴퓨터의 자료를 bit 열이 아닌 자료의 성질,

    기억 장소의 명칭을 이용하여 표현

    구조적 추상 : 서로 관계가 있는 메모리 셀 간의 구조에 대한 추상화로서 구조적

    자료형인 배열이 이에 해당

    단위적 추상 : 추상 자료형 / 자료의 캡슐화(package, class)

    2. 제어의 추상화 : 의미있는 여러 제어문(기계어)를 사용자가 이해 가능하게 표현하는 방식으로 조건문, 반복문 등이 이에 해당

    기본적 추상 : 몇 개의 명령문을 하나의 추상적 구문으로 구성

    구조적 추상 : 구조적 명령문 : 조근을 포함하여 실행될 명령문을 단일 그룹으로...




    내용이 많이 부족합니다. ^^;;
    아직 제 자신의 머릿 속에서 추상화라는 개념이 확실히 자리잡힌 상황이 아니라서 그런 것 같습니다.
    내 주변에서 일어나는 일들에 대해서 추상화를 하는 연습을 많이 해볼 예정입니다. ^^; 그렇게 적용하는 방법 밖에 없네요. ㅎㅎ

    JAVA SDK API 한글 번역 문서입니다.(html판)

    API 문서만 있습니다.

    웹번역기를 통해 번역한것을 틈틈히 수작업으로 번역했습니다.

    번역기를 통해서 번역한것이기 때문에 번역의 질은 낮습니다만,
    외계어같은 다른 번역 문서보다는 낫습니다.  그래도 이것은 참고보시면 볼만합니다.

    원래는 좀 더 깔끔하게 번역하려고 했는데 분량도 많고 귀찮아서 내버려 뒀었습니다. 번역시 어색하다고 생각되시는 점이 있거나, 도움주실분은 메일 주십시오. 조그만 분량이라도 좋습니다. (free_hewon@naver.com)

    SDK 1.4 문서도 있습니다, chm파일이나 구버전을 원하시는분은 메일 주세요...
    참고하시라고 번역된 단어 사전도 같이 올립니다.

    출처 : http://www.okjsp.pe.kr/seq/72472
    강혜원님



      티스토리의 파일첨부 크기가 10M 미만이어서 나누어 압축하다보니 이렇게 되었습니다. ^^;

      위의 exe 부터.006 까지 파일을 같은 폴더 안에 받으시고 exe를 실행하시면 api1.5.0_ko_06.07.zip 파일이 생성됩니다. 이 파일을 풀어보시면 index.html 이 있습니다. 그걸 브라우저로 열어서 사용하시면 됩니다.


    강혜원님이 자신의 홈페이지에 올려주신 내용입니다. 감사합니다. ^^

    출처 : 티엘로 http://www.twelo.com/tag/JAVA%20API%20DOC%20%ED%95%9C%EA%B8%80
    JAVA SE API 1.6 한글 버전 : http://xrath.com/javase/ko/6/docs/ko/api/


    관련정보 : http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=39&p_org_id=15&lang=KO

    OCP 는 아래 시험 3가지를 모두 패스하고, 오프라인 교육을 받아야 자격증을 발급해줍니다. ㅡㅅ-); 보통은 시험만 수료한다고 합니다.

    ① SQL

    ② Admin I : Oracle 저장구조

    ③ Admin II : User 관리, 데이터 관리, Backup & Recovery, 성능 tuning

     

    Prometric Online Testing :  http://oracle.prometric.com/

    ==>> 이 사이트에 접속하여 가입을 해야 합니다.

    ==>> 이 시험은, 가급적이면 Internet Explorer 로 보시는 게 좋을 듯 합니다. ㅡㅅ-);;

    Firefox로 가입하려고 하거나 할 때 마다 오류가 생깁니다. 오라클!! 왜그래!!!


      ※ 이미지를 크게 보시기를 원하시면, 그림 위에서 마우스 우클릭, '그림 새창열기, 새탭 열기' 를 클릭하시면 됩니다. ㅡ0-);; 스프링노트에서 받아온 거라서 클릭하면 커지는 기능이 안되네요.


     1단계 >> OCT를 보기 위한 가입하기. 이 글을 읽으시는 분들은 모두 처음 이실테니, 하단에 있는 Frist Time registration 을 클릭합니다. 


    단계 2>> 시험을 볼 때 사용할 ID를 입력합니다. 9글자 이상 입력해야 합니다. 8글자 입력하면 9글자 이상 입력하라고 나옵니다.


    단계 3>> 9글자 입력한 후에 Step 2. 으로 이동!!


    단계 4>> 하단에 Test Provider 항목 중 Oracle 항목을 선택합니다.


    단계 5>> 이전 페이지에서 Continue를 눌러서 넘어온 페이지 입니다. 로그인에 사용할 ID, PW, 개인 정보를 입력하는 창입니다. ▶ 표시된 항목은 반드시 입력!!


    단계 6>> 정상적으로 입력이 완료되면 아래 페이지가 나타납니다. ^^ Continue를 누르세요.

    단계 7>> Take Test 를 클릭하세요. ㅡㅅ-)b 시험 볼 준비를 합시다.


    단계 8>> Public Tests 항목에서 Oracle 을 선택한 후 Submit를 클릭합니다.


    단계 9>> 봐야할 시험을 선택하는 항목 입니다. ^^ 우리가 봐야할 것은 SQL 시험(1Z0-007) 입니다. ^^

     단계 10>> 1Z0-007 (English) 버전을 선택합니다.

    단계 11>> Take This Test! 를 클릭합니다.


    단계 12>> 바우처 넘버를 입력합니다. ^^


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

    + Recent posts