Properties

Java/Core Utilities 2013. 2. 9. 12:29

다음의 코드는 파일에 저장된 Properties를 읽고 저장하는 코드이다.

 

 

package test;

 

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Enumeration;

import java.util.Properties;

 

public class PropertyTest {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

              Properties properties = new Properties();

              // Read properties file.

              try {

                     properties.load(new FileInputStream("example01.properties"));

              } catch (IOException e) {

              }

 

              String avalue = properties.getProperty("name");

              System.out.println(avalue);

              properties.setProperty("name", "properties test");

 

              // Write properties file.

              try {

                     properties.store(new FileOutputStream("example01.properties"), null);

              } catch (IOException e) {

              }

 

              // Print out all of properties

              for (Enumeration e = properties.propertyNames(); e.hasMoreElements();) {

                     String name = (String)e.nextElement();

                     System.out.println("Property Name : " + name);

              }

 

       }

}

 

 

 

System property의 추가와 Java Code에서 읽기

 

JVM의 옵션으로 –D를 다음과 같은 형식으로 사용한다.

                         > java –D[propertyName=설정값] 어플리케이션명

 

JVM에 설정된 Property값은 다음과 같이 얻으면 된다.

          System. getProperty(propertyName);

 

 

'Java > Core Utilities' 카테고리의 다른 글

Logger  (0) 2013.02.09
Preferences & PreferenceChangeListener  (0) 2013.02.09
Collection, Map 클래스의 사용시 성능과 계층구조  (0) 2013.02.09
Collections과 정렬  (0) 2013.02.09
Timer, TimerTask & TimeZone  (0) 2013.02.09
Posted by Steven J.S Min
,

컬랙션계열의 Type Map계열의 Type들을 사용할때 어떠한 관계를 갖는지 그리고 각각 어떤 성능상의 차이가 있는지 그리고 어떤 장단점이 있는지 고려를 하지 않고 원하는 결과만을 위해서 무분별 하게 사용했던것 같다. 우선 이들의 주요 관계는 다음과 같다.

 

 

 

 

ArrayList, Vector, LinkedList는 모두 List 인터페이스를 구현한 클래스이다.

따라서 다음의 코드는 모두 유효하다.

List list = new ArrayList();

List list = new Vector();

List list = new LinkedList();

또한 HashMap Hashtable Map 인터페이스를 구현한 클래스이다. 따라서 다음의 코드들도 유효하다.

Map map = new HashMap();

Map map = new Hashtable();

 

 

 

ArrayList, Vector, LinkedList

 

우선 ArrayListVector간의 API는 유사하다. 모두 List인터패이스를 구현한 클래스로서 순서가 존재하며 인덱스를 사용해서 테이터에 접근이 가능하며 중복된 데이터를 허용한다. 또한 일반적으로 순차적으로 대량의 데이터를 억세스하거나 입력할때 유리한 방식이다. 하지만ArrayList의 경우 동기화(토근을 부여받아 순차적으로 객체에 접근)가 보장되지 않으므로 동기화를 위해서는 직접 처리해줘야 하지만 Vector의 경우 동기화를 자동으로 보장한다.

, 동기화의 경우 그만큼 데이터의 보장 측면에서는 장점이 되지만 성능상에서는 단점이 될수 있다.

 

ArrayList LinkedList의 경우는 어떨까?

이는 연산의 종류에따라 성능상 차이를 확인 할수 있는데

단순히 읽는 시간(접근시간)’을 비교한다면

ArrayList LinkedList에 비해 빠르다.
LinkedList의 데이터 개수가 많아질수록 차이가 심해진다.

 

추가/삭제의 경우

순차적으로 추가/삭제하는 경우에는 ArrayList LinkedList보다 빠르다.

중간 데이터를 추가/삭제하는 경우에는 LinkedList ArrayList보다 빠르다.
다만, ArrayList의 저장공간이 부족해, 더 큰 저장공간을 가진 ArrayList 객체를 만드는 상황이 없다는 가정하에서만 만족한다. (다시 말해, 저장공간이 충분할 때를 가정으로 한다는 말이다)
그렇지 않을 경우 LinkedList가 순차적으로 추가/삭제하는 경우에도 ArrayList보다 빠를 수 있다.

 

결국 다루고자 하는 데이터의 개수가 변하지 않는 경우 : ArrayList가 최상의 선택
데이터 개수의 변경이 잦은 경우 : LinkedList가 더 나은 선택

두 클래스의 장점을 이용해 혼합해서 사용하는 것이 좋음
데이터 저장은 ArrayList를 사용하고, 데이터를 수정하는 작업을 할 때에는 LinkedList로 데이터를 옮겨서 작업하는 것이 권장할만 하겠다.

 

 

HashMap, Hashtable

 

모두 Map계열의 클래스이며 HashMap은 데이터 입출력이 동기화되지 않고 처리속도가 빠른 반면  HashTable은 모든 입출력이 동기화며 처리속도는 다소 떨어지는 특징이 있다.

 

'Java > Core Utilities' 카테고리의 다른 글

Preferences & PreferenceChangeListener  (0) 2013.02.09
Properties  (0) 2013.02.09
Collections과 정렬  (0) 2013.02.09
Timer, TimerTask & TimeZone  (0) 2013.02.09
Date, Calendar and TimeZone  (0) 2013.02.08
Posted by Steven J.S Min
,

Colleciton에 대해 연산을 수행하고 결과로 Collection을 리턴하는 유용한 유틸리티 메소드를 제공한다.  Collection,List,Map,Set,SortedMap,SortedSet등의 Collection계열의 유틸리티 클래스라고 볼수 있겠다.

 

Collections 클래스의 정렬은 속도가 비교적 빠르고 안정성이 보장되는 합병 정렬을 이용한다. 합병 정렬은 시간 복잡도가 0이며 특히 거의 정렬된 리스트에 대해서는 상당히 빠르다. 안정성이란 동일한 값을 가지는 원소를 다시 정렬하지 않는 것을 의미한다. 안정성은 같은 리스트를 반복하여 다른  기준에 따라 정렬할 대 중요하다. 만약 상품 주문 리스트를 날짜를 기준으로 먼저 정렬하고 이후에 주문처를 기준으로 정렬한다면 사용자는 같은 주문처가 보낸 주문은 날짜 별로 정렬될 것이라고 가정한다. 하지만 이것은 정렬이 안정성있는 정렬인 경우에만 가능하다.

 

모든 메소드들은 Static 으로 정의되어 있기때문에 사실상 객체를 생성할 필요가 없으며 주요 메소드로서는 sort(), shuffle() 메소드 등이 있다.

 

Collections를 이용한 Sort

Collections를 이용한 Sort에는 비교할 대상(통상 Bean)Comparable 인터페이스를 Implements하여 CompareTo()Overriding하는 방법과 Comparator Implements한 클래스를 생성하여 compare()메소드를 Overriding하는 방법이 있는데 두번째 방법이 보다 유연한 방법을 제공하지만 다음의 예에서는 단순하게 첫번째 방법을 사용하겠다.

 

Comparable<T> 인터페이스를 통하여 정렬하는 방법은 public int compareTo(T o)Bean에서 구현해 주면 된다. 이 부분에서 구현해 줘야할 내용은 A B를 비교하는데 무었을 기준으로 비교할 것이냐 라는 것이다. 그것을  compareTo 함수에서 정해주고 어느것을 오름차순으로 혹은 내림차순으로 정열할지도 설정해 주면 되는 것이다.

 

요점은 A B의 비교이다. A는 자기자신. BanOther 입니다. 둘다 같은 클래스 라고 가정했을때 정렬기준을 해당 클래스의 넘버값으로 하고 싶다면

 

    if( getNumber() > anOther.getNumber() ) return 1;

      else return -1;

 

과 같이 해주면 된다.

 

1을 리턴하면 어찌되고 -1을 리턴하면 어찌되는지 애매 할것이다..

음수를 리턴할경우.        현재 클래스가 앞으로 간다.

     0을 리턴할경우.       변화가 없다.

양수를 리턴할경우.        비교대상 클래스가 앞으로 간다.

 

즉 위의 소스에서는 현재 클래스의 값이 클경우 1을 리턴 한는 것이다. 이를 간단하게 표현하자면 큰놈은 뒤로가게된다. 즉 오름차순 정렬임을 알 수 있다.

 이와 같이 compareTo의 구현이 끝났으면정렬을 하려면 정렬하려는 배열과 같은 "집단" 이어야 한다.

 

배열의경우 Arrays.sort( Object [] )   의 매개변수로 Comparable 인터페이스가 구현된 클래스 배열을 넣는다. ArrayList 같은 경우 Collections.sort( List<T> )  의 매개변수로 Comparable 인터페이스가 구현된 클래스 리스트를 넣는다.

 

Comparable을 구현한 Bean클래스 

 


public class Song implements Comparable<Song> {

       private String title;

       private String author;

       private int rank;

 

       public Song(String title, String author, int rank) {

              super();

              this.title = title;

              this.author = author;

              this.rank = 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;

       }

 

       @Override

       public int compareTo(Song o) {

              // 리턴값을 비교한 결과를 직접 -1, 0 또는 1 지정해도 된다.

              return title.compareTo(((Song) o).title);

       }

 

}

 



Bean들을 정렬하는 예제

 

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

 

/**

 * @author Steven J.S Min

 *

 */

public class SongSortTest {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

 

              List<Song> songList = new ArrayList<Song>();

              songList.add(new Song("제목5", "홍길동", 4));

              songList.add(new Song("제목2", "이순신", 2));

              songList.add(new Song("제목4", "윤봉길", 3));

              songList.add(new Song("제목1", "김말자", 5));

              songList.add(new Song("제목3", "김두식", 1));

 

              System.out.println("정렬전---------------------");

              for (Song song : songList) {

                     System.out.println(song.getTitle() + ", " + song.getAuthor() + ", " + song.getRank() + "");

              }

 

              System.out.println("정렬후---------------------");

              Collections.sort(songList);

              for (Song song : songList) {

                     System.out.println(song.getTitle() + ", " + song.getAuthor() + ", " + song.getRank() + "");

              }

 

              System.out.println("역순정렬-------------------");

              Collections.reverse(songList);

              for (Song song : songList) {

                     System.out.println(song.getTitle() + ", " + song.getAuthor() + ", " + song.getRank() + "");

              }

 

       }

}

 

 

결 과

정렬전---------------------

제목5, 홍길동, 4위

제목2, 이순신, 2위

제목4, 윤봉길, 3위

제목1, 김말자, 5위

제목3, 김두식, 1위


정렬후---------------------

제목1, 김말자, 5위

제목2, 이순신, 2위

제목3, 김두식, 1위

제목4, 윤봉길, 3위

제목5, 홍길동, 4위


역순정렬-------------------

제목5, 홍길동, 4위

제목4, 윤봉길, 3위

제목3, 김두식, 1위

제목2, 이순신, 2위

제목1, 김말자, 5위


Comparator을 구현한 Bean클래스

Comparable 인터페이스를 Implements하여 정렬하는 것은 간단하지만 열가지 필드를 조합하여 정렬한다거나 하는 경우에는 제약이 있다. 이런경우 보다 유연한 정렬을 구현하기 위하여 Comparator Implements한 클래스를 생성하여 compare()메소드를 Overriding하는 방법을 이용하여 정렬하는 것이 바람직하다.


Comparator를 이용한 정렬 예제

 


?



참조 : http://ssami.tistory.com/291
http://blog.naver.com/skykingkjs?Redirect=Log&logNo=150154268470


'Java > Core Utilities' 카테고리의 다른 글

Preferences & PreferenceChangeListener  (0) 2013.02.09
Properties  (0) 2013.02.09
Collection, Map 클래스의 사용시 성능과 계층구조  (0) 2013.02.09
Timer, TimerTask & TimeZone  (0) 2013.02.09
Date, Calendar and TimeZone  (0) 2013.02.08
Posted by Steven J.S Min
,

Timer & TimerTask

Timer클래스는 일종에 스케쥴러이다. 이 클래스는 Single쓰레드를 갖으며 백그라운드에서 실행되면서 Clock 을 모니터링 하고있다가 지정된 스케쥴에 따라 하나 이상의 TimerTask를 실행하는 구조이다.


TimerTask 는 사실상 java.lang.Runnerable 인터페이스를 구현한 쓰레드 프로그래밍이다. 따라서 이 클래스의 서브클래스를 만들어 Timer Task로 이용하면 되는데 Runnerable 인터페이스의 run()메소드를 구현해 줘야한다.(쓰레드 프로그래밍과 동일)


import java.util.Calendar;

import java.util.GregorianCalendar;

import java.util.Timer;

import java.util.TimerTask;

 

public class DateTest {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

             Timer timer = new Timer();

             TimerTask task = new TimerTask() {

                 public void run() {

                    System.out.println("JUNGSIG's Birthday !!");

                 }

             };

 

             Calendar cal = new GregorianCalendar(2013, Calendar.JULY, 17);

             timer.schedule(task, cal.getTime());

 

       }

 

}


 

코드에서는 2013 7 17일에 TimerTask 행하도록 스케쥴링 되어있다.

 

 

Calendar & Time zone

TimeZone 클래스를 Calendar클래스와 함께 이용하게되면 해당 지역의 시간으로 설정 할 수있다.

 

     // 기본 Time Zone

     TimeZone tz = Calendar.getInstance().getTimeZone();

 

     // 런던의 시간을 기준으로 Calendar를 설정한다.

     TimeZone timeZone = TimeZone.getTimeZone("Europe/London");

     Calendar calendar = new Calendar.getInstance();

     calendar.setTimeZone(timeZone);

 

'Java > Core Utilities' 카테고리의 다른 글

Preferences & PreferenceChangeListener  (0) 2013.02.09
Properties  (0) 2013.02.09
Collection, Map 클래스의 사용시 성능과 계층구조  (0) 2013.02.09
Collections과 정렬  (0) 2013.02.09
Date, Calendar and TimeZone  (0) 2013.02.08
Posted by Steven J.S Min
,