싸미~*

Java) Sublist , Not-serializable

.Tech/Java

자바 프로그램의 상태를 저장할때,

일반 텍스트 파일로 저장할 수도 있고, 직렬화를 통해서 저장할 수도 있다.

 

직렬화를 하려면, Class에서 "implements Serializable"을 통해서 인터페이스를 구현해야 한다.

또, 직렬화를 하면, 이 객체와 관련된 것이 모두 직렬화(자동) 되어서 저장이 된다.

 

하지만, 직렬화 되지 않는 경우가 있다.

예를들어, Collection 클래스에서 'sublist'라는 메서드를 사용하는 경우

sublist 는 'java.util.RandomAccessSubList'의 instance를 리턴하게 되는데,

이는 직렬화가 안된다.

 

이런 경우, ArrayLIst와 같은 'Serializable List'에 그 내용을 담아야 한다.

 

다음은 직렬화 되지 않는 경우

Collections.sort(userList,userComp);

userList.sublist(min,max);

 

직렬화를 하려면..

List list = new ArrayList();

Collections.sort(userList,userComp);

userList.sublist(min,max);

list.addAll(userList);

 

 

..관련 자료

http://journeymanjournal.blogspot.com/2005/07/collectionssublist-returns-non.html

http://xrath.com/javase/ko/6/docs/ko/technotes/guides/collections/designfaq.html#5

http://dmi.ensica.fr/doc/Java/j2sdk-1_4_2-doc/docs/j2h/java/util/Collections.java.html

신고

Java) Matrix Package (Jama, Colt, MTJ)

.Tech/Java

Java 에서 SVD 계산하는 일이 있어서,

관련 Package 를 찾아봤는데, 제목에 있는 3개가 유명하다는 것을 알았다.

 

1. Jama

    JAMA 링크

   Dense Matrix을 다루는데 있어서 작고 가볍다.

   LNPACK , EISPACK 에 적용된 알고리즘과 같은 알고리즘을 사용한다.

 

2. Colt

    COLT 링크

    Jama 보다 조금 높은 성능을 보인다 하는데, (테스트 결과로는 별 차이 없다)

   다양한 Matrix Algorithm을 보여주고 있다.

 

3. MTJ

    MJT 링크

    Jama 보다 더 많은 Matrix Type을 포함하고 있고,

    Colt 보다 조금더 최적화된 Sparse matrix을 다룰 수 있다 한다.

 

* 위 3개의 Library을 통해서 MxN Matrix에 대한 SVD 을 구해보았다.

   M, N의 다양한 값들과 Dense/Sparse Matrices 을 다루어 보았는데,

   테스트 결과는 3개다 비슷하다.

 

* Java Forum에서 논의 된 내용 보는 것도 도움이 될 듯 하다.

신고

Java) Exception 요약

.Tech/Java

참고 : http://benelog.egloos.com/1901121
http://crosscutter.info/56
http://crosscutter.info/63

1. Exception 사용 예제

    1) 예외를 던지는 위험한 코드
    코드에서 예외를 던진다면, 반드시 메소드를 선언하는 부분에서
    throws 키워드를 써서 선언해줘야한다.

	public void takeRisk() throws BadException {
          if(abandonAllHope) {

              throw new BadException();

          }

      }

    exception를 선언하는 과정을 통해, BadException을
    던질 수 있다는 것을 외부에 알린다.

    2) 위험한 메소드를 호출하는 코드
    예외를 던지는 메소드를 호출하면, 예외발생 가능성이 있음을 알고
    있다는 것을 표현해야 한다. 즉 try/catch 사용

    public void crossFingers(){
          try{

              anObject.takeRisk();

          } catch (BadException ex) {

              System.out.println("A~~~ gh~!");

              ex.PrintStackTrace();

          }

      }

 

2. Exception은 반드시 처리(try/catch)하거나,선언(회피, throws 사용) 해야 한다.

   1) 처리 하기

          try{

              laundry.doLaundry();

          } catch (ClothingException cex){

              //exception처리

          }

   2) 선언(회피하기)

          void foo() throws ClothingException {

              laundry.doLaundry()

          } 

   % 메소드에서 예외를 던지면, 그 메소드는 스택에서 곧바로 제거된다.
   exception은 스택 바로 밑에 있는 메소드(즉, 이를 호출한 메소드)로
   던져진다.  

3. 참고사항


    * 컴파일러에서는 RuntimeException을 제외한 모든 것을 확인함

    * Checked Exception
      RuntimeException 의 하위클래스에 속하지 않는 Exception 객체는
      컴파일러에서 확인해야 하는데, 이런 에외를 "Checked Exception" 이라 함.
      예를들어, IOException/ InterruptedException등
      Exception - IOException
                       - InterruptedException
                       - RuntimeException      - ClassCastException
                                                             - NullPointerException

    * Unchecked Exception
      RuntimeException 객체는 컴파일러에서 확인하지 않는데,
      이런 예외를 "Unchecked Exception"이라 한다.


    * RuntimeExcpetion 유형에 속하는 Exception에 대해서는,
      컴파일러에서 신경을 쓰지 않는다. RuntimeException은 선언하지
      않아도 되고, try/catch로 포장할 필요도 없다.

    * 메소드에서 두개의 Exception을 던질 수도 있다. 
     

public void doLaundray() throws PantsException, LingerieException {

        ..

        }


    * 여러 exception이 있는 경우, JVM에서는 순서대로 확인하기 때문에,
      맨 위부터 하위 Exception부터 사용해야함

 

4. 주의점
    * try/ catch 불록에 return이 있어도, finally 블록은 실행됨


    * exception 발생시, catch 실행후 이후 모두 실행함(return아님)

신고

Java) 정렬, Collections 사용

.Tech/Java

Java에서 정렬을 하려면, TreeSet을 이용하는 방법이 있다.

또 다른 방법으로는, Collections 클래스를 활용하는 방법이 있다.

 

Song 클래스를 다음과 같이 정의하자

public class Song {
    private String title;
    private String author;
    private int    rank;

    public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public int getRank() {
		return rank;
	}
	public void setRank(int rank) {
		this.rank = rank;
	}
}

main함수내에서 다음럼 song list을 만든다

public class A{
    ArrayList songList = new ArrayList();

    public static void main(String[] args){
        addSong();
        ..
    }

    
    //Song list을 만들자
    private static void addSong(){
        Song song1 = new Song("누난 예뻐","누구냐",1);
        songList.add(song1);
        
        Song song2 = new Song("가질수 없는 너","기억안남",2);
        songList.add(song2);

        Song song3 = new Song("사랑해","나두",3);
        songList.add(song3);
    }
}

main 함수내에서, Collection.sort(songList); 을 통해서 정렬을 시도할 것이다.

다음의 두 방법이 있다.

 

방법 1. Song 클래스에서 "Comparable" 를 구현함 (비교는 하나의 구성원만 됨)

public class Song implements Comparable {
    private String Title;
    ..
    ..
    //Comparable 의 compareTo 메서드 구현함
    public int compareTo(Object o){
        return title.compareTo(((Song)o).title );
    }
}

public class A{
    ArrayList songList = new ArrayList();

    public static void main(String[] args){
    ..

    //song class에서 title 만 compareTo로 지정하였기때문에,Title 별 정렬함
        Collenctions.sort(songList);
    ..
    }
}

방법 2. Song 클래스의 각 구성원들을 구별할 수 있게 함

public class A{
    ArrayList songList = new ArrayList();

    class TitleCompare implements Comparator {
        public int compare(Song s1, Song s2) {


            //ascending 정렬
            return s1.getTitle().compareTo(s2.getTitle());
        }
    }
    
    //Author 도 Title 처럼 "AuthorCompare" 만들어서 진행
    
    class RankCompare implements Comparator {
        public int compare(Song s1, Song s2) {


            //ascending 정렬
            return (s1.getRank() > s2.getRank() ? 1:0);
        }
    }

    public static void main(String[] args){


        //Title 순으로 정렬
        TitleCompare titleCompare = new TitleCompare();
        Collection.sort(songList, titleCompare);
        

        //Rank 순으로 정렬
        RankCompare rankCompare = new RankCompare();
        Collection.sort(songList, rankCompare);
    }
    ..
}
신고

Java) Int , int , Object

.Tech/Java
1. int 타입과 Object 타입의 Casting 할 때 다음처럼 하자.

# int 형을 Object형으로

int cnt = 5;

Object CNT = new Integer(cnt);

cnt는 int 형, CNT는 Object형이라는것.


# Object형을 int형으로

Ojbect 형 ==>  Integer 형 ==> int형 메소드 사용

int cnt = ( (Integer) CNT ).intValue();


2. boolean, Boolean ( Obejct ) 는 다음처럼

# boolean 형을 Object 형으로

boolean bool = true;

Boolean objBool = Boolean.valueOf(bool);

or

Boolean objBool = new Boolean(bool);


# Object 형을 boolean형으로

boolean bool;

Boolean objBool;

bool = ((Boolean)objBool).booleanValue();

or

bool = Boolean.TRUE.equals(objBool);






신고

Java) Eclipse + Junit

.Tech/Java

환경 : Eclipse 3.3.x + JDK 1.4

문제 : Junit 특정(3.8) 버전 사용하기

 

JDK 1.4 기반에서는, Junit 4.x 을 사용하지 못한다.

따라서, Junit 3.8로 환경을 맞추어서, 테스트 하려는 데 다음과 같은 에러가 발생한다.

(물론, Library Path 를 3.8로 잘 맞추었다.)

 

image

 

문제는, Eclipse 3.3 에서는 기본으로 Junit 4.3 을 제공한다는 것이다.

다음은 Eclipse -> plugins 에서 확인된 것이다.

 

image

 

 

방법은 2개이다.

 

첫째는, Test 할 소스의 "Open Run Dialog" 을 통해서 Junit 버전을 지정해준다.

image

 

다음처럼 지정해주자.

image

 

두번째 방법으로는,

Whiteship Blog의 "Eclipse가 빌드경로에 추가해주는 Jar 파일 바꾸기"를 참고하자.

쉽게 말하면, Junit 4가 깔린 디렉토리에서,

Jar 파일을 바꾸면 된다는 것이다.

신고

Java) DataSource 란...

.Tech/Java

## DataSource란..
    (참고 : http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/getstart/datasource.html )

    일단, "DataSource"는 자바에서 Data souce들을 표현하는 객체를 의미한다.

    data source란 말은, 데이터를 저장하는 기능을 의미하는데,
    규모가 큰 회사의 데이타베이스처럼 복잡할수도 있고, row/column등으로 표현되는 파일일 수도 있다.
    또한 원격서버에 있을수도 있고, 로컬 데스크탑에 있을 수도 있다.

    어플리케이션은 Connection을 맺어, data source에 접근하는데,
    이때 DataSource 객체는, DataSource 의 인스턴스가 나타내는 특정 data source에 대해 연결을 맺는
    "Factory"로 취급된다.

    DataSource 객체를 사용하는것이 , DriverManager보다 선호되는 경향이 있다.

    기능은 대부분 비슷하지만 다른점을 찾아보면..
    DriverManger와 달리, DataSource 객체는, 'data source'를 기술하고, 규정하고 있는
    property를 갖는다는 것이다.
   
    또한 JNDI와 작업이 된다는 것과, 어플리케이션과 별도로 생성/삭제/운용이 된다.

    Driver 업체는, JDBC 2.0이나 3.0의 한 부분으로,
    DataSource 인터페이스의 기본적인 구성을 갖는 클래스를 제공한다.

    어떤 시스템 관리자가, JNDI naming 서비스에 DataSource Object를 등록하는지,
    또 어떤 어플리케이션이 JNDI에 등록된 DataSource Object를 사용하여,
    data source와 연결을 맺는지 살펴보자.

    JNDI Naming service에 DataSource 객체를 등록하는 것이, DriverManager보다 좋은 점은?

    첫번째 장점은..
       어플리케이션 입장에서, 하드코딩된 Driver 정보들을 필요로 하지 않는다.
       개발자는 단순히, data source의 논리적 이름만을 선택하여,
       이를 JNDI naming 서비스에 등록만 하면 되는것이다.
      
       어플리케이션은 이런 '논리적 이름'을 사용하기만 하면 되고,
       JNDI는 이름과 매칭되는 DataSource 객체들을 제공하기만 하면 된다.
    두번째 장점은..
       DataSource 을 통해서, Connection Pooling / 분산 Transaction과 같은 기능들을 구현 할 수 있다.
        Connection Pooling이란, Connection이 요청될때마다 매번 물리적인 Connection을 생성하기 보다,
        기존의 커넥션을 동적으로 재사용하여 성능을 향상 시키는 기술이다.

    1) Properties

        DataSource 객체는 db server 위치/ db server 이름/ network protocol등의 속성등을 지니고 있다.
        DataSource 속성들은, JavaBeans Design Pattern을 따른다.
        여러 DB업체들이, 동일한 DataSource 구현이 가능하게끔,
        JDBC 2.0 API는 이 속성들의 표준 Set들을 명시하고 잇다.

        예를들어서
        Property             | Type
        -----------------------------
        databaseName    | String
        dataSourceName | String
        .....

        DataSource  객체는 위에서 보인 Property만을 사용하라는 제한은 두지 않는다.
        업체에서 자신들의 속성을 추가할 수도 있다.

        다음은 get/ set 메서드를 통해서 속성을 사용하는 예제이다.

            ds.setServerName("my_database_server");
            String serverName = ds.getServerName();

    2) Using JNDI

        JNDI는, 어플리케이션이 네트워크상의 원격 서버를 찾고, 액세스하는 방법을 제공한다.

        일단 DataSource 객체가 생성이 되고, JNDI Naming 서비스에 등록이 되면,
        어플리케이션은 JNDI API을 통하여, DataSource 객체에 접근 할 수가 있다.
        (이 DataSource 객체는 data source에 연결하는데 사용된다)

    3) Creating & Registering a DataSource Object

        DataSource 객체는 Java Application와는 별도로, 생성/소멸/운영이 된다.
       

        한가지 유념할 것은,
        DataSource 객체는, 개발자 또는 시스템 관리자를 통해서 생성/소멸/운영이 되는것이지

        일반 서비스 사용자에 의해 되는 것은 아니다.

            //Create "DataSource Object"
            VendorDataSource vds = new VendorDataSource( );
            vds.setServerName("my_database_server");
            vds.setDatabaseName("my_database");
            vds.setDescription("the data source for inventory and personnel");

            /*
            * JNDI API을 통해서, vds을 JNDI naming service 에 등록한다.
            */
            //InitalContext() 을 호출하여, JNDI naming context을 참조하고 있는 Java Object "ctx"을 생성함
            Context ctx = new IntialContext( );
            // data source "vds"를, logical name "jdbc/AcmeDB" 와 연결함
            ctx.bind("jdbc/AcmeDB", vds);
 

    4) Connecting to a Data Source

        위에서, DataSource 객체 "vds"는, property를 설정 한 후, logical name "AcmeDB"로 바운드 되었다.

        다음은 이 AcmeDB라는 Logical NameA을 사용하여,
        vds가 나타내고 있는 Database에 어떻게 연결하는지 살펴보자.


            //JNDI을 통하여, AcmeDB에 대한 DataSource 객체를 얻어온다. 
            Context ctx = new InitialContext();
            DataSource ds = (DataSource)ctx.lookup("jdbc/AcmeDB");
            //ds는 (위에서) vds가 참조하고 있는 data source와 같은 것을 가리킴.

            //db id와 passwd을 주고 연결을 함.
            Connection con = ds.getConnection("genius", "abracadabra");
            con.setAutoCommit(false);
            PreparedStatement pstmt = con.prepareStatement(
                                        "SELECT NAME, TITLE FROM PERSONNEL WHERE DEPT = ?");
            ....
            (statement 처리 구절).
            ....
            con.close();



    5) DataSource Implementations

        DataSource 인터페이스는 3가지 타입의 Connection을 제공한다.

        다음은 DataSource 인터페이스를 구현하는 일반적인 3가지 타입이다.

        * Basic DataSource class
        * DataSource class implemented to provide connection pooling
        * DataSource class implemented to provide distributed transactions

    6) Loggin & Tracing

    7) Advantages of Using JNDI
        DriverManager 보다, JNDI naming 서비스에 등록된 DataSource 객체를 사용하여,
        data source 에 연결하는 장점이 있다.

        첫째는 "Portability"이다.
            DriverManager에서, JDBC driver class 이름(보통 Vendor을 지칭하는)이 Application 코드에
            포함되어 잇어, 어플리케이션이 특정 업체에 종속된 결과를 부른다.

        둘째는, "Maintanence"이다.
            만약 data source에 대한 필요한 정보가 변경 된 경우,
            단지 DataSource의 관련된 Property만 변경하면 된다.

            모든 어플리케이션에서 data source에 연결할 필요가 없는 것이다.
            예를들어, DB 서버가 바뀌어서 다른 Port Number을 쓴다고 가정하자.
            이때 DB Name과 Port Number만 바뀌면 되는것이다.

신고

Java) Business Object 와 DAO

.Tech/Java

## Business Objects와 DAO에 대해서 짧게 잘 설명이 되어있슴.
    (참고 : http://mariaflorea.blogspot.com/2007/05/business-objects.html 
              http://openframework.or.kr/framework_reference/spring/ver1.2.2/html/dao.html )

    1. DAO란, 객체지향 설계 패턴중 하나로서

        Database나 File등과 같은 '여러 저장매체'와 Application간의 Common Interface를
        제공해주는 컴포넌트이다.

        즉, 어플리케이션 입장에서, 일관성 있는 데이터 접근을 보장해준다.

    2. Business Object

        비지니스 객채란, 객체지향 프로그램에서 Domain내 Entity들을 추상화하는 객체이다.
        때로는 도메인 객체라 불리기도 한다. 이때 도메인 모델은 여러 도메인 객체와
        그들간의 관계로 표현 될 수 있다.

        참고로, 비즈니스 객체는 실제 비즈니스 로직의 객체들을 나타낼 필요는 없다.

신고

DAO (Data Access Object) (짧게)

.Tech/Java

DAO

DAO는 MS에서 4GL 언어 아키텍처 작업 당시, 객체단위 DB접근 인터페이스로 제안한

DB 접근 객체 인터페이스를 의미한다.

 

참고

Webdizen's Blog  - DAO 구현기술

ZDNet 's "[객체지향 SW 설계의 원칙] 사례 연구, 단일 책임 원칙"

신고

Java) Java Beans와 EJB

.Tech/Java

우선 JavaBeans에 대해 알아보자.

(JavaBeans와 EJB는 이름만 유사할 뿐, 직접적인 관계는 없다)


## Java Beans란...

1. 정의 by Sun 사

    자바 빈이란 개발자 도구에서 비주얼하게 수행되어질 수 있는 재사용 가능한 Software Component다.

    또한 JavaBeans 컴포넌트들을 Beans이라고 한다.

    참고 : 나비이야기님의 자바빈즈 설명
             (정의니 어쩌고 하다가, 그냥 코드에서 이런게 자바빈즈다! 하니깐 이해가 잘감..;;)

 
2. 자바 빈과 클래스 라이브러리의 차이점

    자바언어로 모든 소프트웨어 모듈들을 자바빈으로 만들 필요는 없다.

    자바빈은 비주얼하게 다룰 수 있으며, 특정 목적을 위해 기능이나 데이터를 비주얼하게 변경할 수 있는

    소프트웨어 컴포넌트에 적당하다.


    반면, 클래스는 비주얼하게 다룰 수 없고, 프로그램 소스상에서 특정 기능을 구현하기 위해 사용되는

    소프트웨어 모듈에 적당하다.


n. 참고 목록

  - 자바스터디 '김형일'님의 Java Beans - Java Component Architecture

  - Sun의 JavaBeans Specification 1.01



## EJB란..

1. 정의

EJB는 Client-Server 모델의 Server부분에서 운영되는 자바 프로그램 Component를 설정하기 위한 아키텍처이다. by [텀즈]


EJB 아키텍처는 객체지향 분산 Enterprise 어플리케이션의 개발 및 분산 배치를 위한 컴포넌트 아키텍처이다. by [Sun Microsystems]

2. 설명

    - EJB 아키텍쳐를 이용해 만들어진 Application은 확장성이 있거나 / 트랜잭션을 보장하며,

    다수 사용자 환경에서도 안전한 특징을 갖는다. 이들 EJB Application은 한 번 작성되면 Enterprise JavaBeans

    스펙을 지원하는 어떤 서버 플랫폼에서도 배치되고 운영될 수 있다.


    - EJB는 제품이 아니라 스펙이다.

     (스펙은 여기 참조)

   

    - EJB 컨테이너 모델 개요(JStorm 의 Enterprise JavaBeans 참고)

   


    - EJB 와 JavaBeans

  JavaBeans EJB
만든 곳 Sun Sun
목적 비주얼 개발환경에서 사용되는
재사용 가능한 컴포넌트 모델
미션 크리티컬한 서버쪽 비즈니스
어플리케이션에서 사용될 수 있는
분산객체 컴포넌트 모델
주로 동작하는 위치 클라이언트 > 서버 오직 서버
개발 난이도 상대적으로 쉬움 상대적으로 어려움
트랜잭션/페일오버
,동시동작 보장
불가능 가능
패키지 java.bean.* javax.ejb.*
동작 프로세스 Intra-process Inter-process
신고