공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 

 

 

Properties

   Properties 는 Hashtable을 상속받아 구현한 것으로,  Hashtable 은 키와 값을  (Object, Object) 의 형태로 저장하는데 비해  Properties  (String, String) 의 형태로 저장한다. 주로 애플리케이션의 환경설정과 관련된 속성(property)을 저장하는 데 사용되며 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공한다. 그래서 간단한 입출력은  Properties 를 활용하면 쉽게 해결된다.

 

메 서 드 설  명
Properties( )  Properties 객체 생성
Properties(Properties defaults) 지정된  Properties 에 저장된 목록을 가진  Properties 객체 생성
String getProperty(String key) 지정된 키( key )의 값( value )을 반환
String getProperty(String key, String defaultValue) 지정된 키( key )의 값( value )을 반환
키를 못찾으면 defaultValue를 반환
void list(PrintStream out) 지정된  PrintStream 에 저장된 목록을 출력
void list(PrintWriter out) 지정된  PrintWriter 에 저장된 목록을 출력
void load(InputStream inStream) 지정된  InputStream 으로부터 목록을 읽어와 저장
void load(Reader reader) 지정된  reader 로부터 목록을 읽어서 저장
void loadFromXML(InputStream in) 지정된  InputStream 으로부터 XML문서를 읽어서 XML문서에 저장된 목록을 읽어 담는다(load & store)
Enumeration propertyNames( ) 목록의 모든 키( key )가 담긴  Enumeration 을 반환
void save(OutPutStream out, String header) deprecated되었으므로 store( )를 사용해야함
Object setProperty(String key, String value) 지정된 키와 값을 저장.
이미 존재하는 키(key)면 새로운 값(value)으로 바뀐다.
void store(OutputStream out, String comments) 저장된 목록을 지정된  OutputStream 에 출력(저장)
comments는 목록에 대한 설명(주석)으로 저장된다.
void store(Writer writer, String comments) 저장된 목록을 지정된  Writer 에 출력(저장)
comments는 목록에 대한 설명(주석)으로 저장된다.
void storeToXML(OutputStream os, String comment) 저장된 목록을 지정된 출력스트림에 XML문서로 출력(저장)
comment는 목록에 대한 설명(주석)으로 저장된다.
void storeToXML(OutputStream os, String comment, String encoding) 저장된 목록을 지정된 출력스트림에 해당 인코딩의 XML문서로 출력(저장)
comment는 목록에 대한 설명(주석)으로 저장된다.
Set stringPropertyNames( )  Propertyies에 저장되어 있는 모든 키( key )를  Set 에 담아 반환

데이터에 한글이 포함된 경우  Store( ) 보다는  storeToXML( ) 을 이용해서 XML로 저장하는 것이 좋다.

( storeToXML( ) 로 저장한 XML은 Editplus나 Eclipse에서 한글편집이 가능하기 때문)

 

 

package Example;

import java.util.*;

public class Example {
	public static void main(String[] args) {
		Properties prop = new Properties();
		
		// prop에 키와 값(key, value)을 저장
		prop.setProperty("timeout", "30");
		prop.setProperty("language", "kr");
		prop.setProperty("size", "10");
		prop.setProperty("capacity", "10");
		
		//Enumeration을 이용해서 prop에 저장된 요소들을 출력
        //Properties는 컬렉션프레임워크 이전의 구버전이므로 Iterator가 아닌 Enumeration을 사용한다.
		Enumeration e = prop.propertyNames();
		
		while(e.hasMoreElements()) {
			String element = (String)e.nextElement();
			System.out.println(element + " = " + prop.getProperty(element));
		}
		
		System.out.println();
		prop.setProperty("size", "20");
		System.out.println("size = " + prop.getProperty("size"));
		System.out.println("capacity = " + prop.getProperty("capacity", "20"));
		System.out.println("loadfactor = " + prop.getProperty("loadfactor", "0.75"));	//읽어오려는 값이 존재하지 않으면 지정된 기본값(defaultValue)을 반환
		
		System.out.println();
		System.out.println(prop);	//prop에 저장된 요소 출력
        
		System.out.println();
        //list메서드를 이용하면 저장된 모든 데이터를 화면 또는 파일에 편리하게 출력할 수 있다.
		prop.list(System.out);	//prop에 저장된 요소들을 화면(System.out)에 출력
	}
}

 

실행결과

 Properties 의 기본적인 메서드를 이용해서 저장하고 읽어오고 출력하는 예제이다.

데이터를 저장할 때 사용하는  setProperty( ) 는 단순히  Hashtable  put 메서드를 호출하는 것이다. 또한 기존에 같은 키로 저장된 값이 있는 경우 그 값을  Object 타입으로 반환하며, 그렇지 않을 때는  null 을 반환한다.  Properties  Hashtable 을 상속받아 구현한 것이라  Map 의 특성대로 저장 순서를 유지하지 않는다. 그래서 저장 순서와 실행결과의 순서가 다른 것을 알 수 있다.

 

 Properties 는 컬렉션 프레임워크 이전의 구버전 이므로  Iterator 가 아닌  Enumeration 을 사용한다. 그리고  list 메서드를 이용하면  Properties 에 저장된 모든 데이터를 화면 또는 파일에 편리하게 출력할 수 있다.

 



 

 


Collections

  Collections 는 컬렉션과 관련된 메서드를 제공한다.  Arrays  fill( ) ,  copy( ) ,  sort( ) ,  binarySearch( ) 등의 메서드와 이름과 기능이 같다.(java.util.Collection은 인터페이스고 java.util.Collections는 클래스이다.) 

 

 

  ■ 컬렉션의 동기화

static Collection synchronizedCollecion(Collection c)
static List synchronizedList(List list)
static Set synchronizedSet(Set s)
static Map synchronizedMap(Map m)
static SortedSet synchronizedSortedSet(SortedSet s)
static SortedMap synchronizedSortedMap(SortedMap m)

  멀티 쓰레드(multi - thread) 프로그래밍에서는 하나의 객체를 여러 쓰레드가 동시에 접근할 수 있기 때문에 데이터의 일관성(consistency)을 유지하기 위해서는 공유되는 객체의 동기화가 필요하다.  Vector  Hashtable 과 같은 구버전의 클래스는 자체적으로 동기화 처리가 되어있는데, 멀티 쓰레드 프로그래밍이 아닌 경우에는 성능을 떨어뜨리는 요인이 된다. 그래서  ArrayList  HashMap 과 같은 컬렉션은 동기화를 자체적으로 처리하지 않고 필요한 경우에만  java.util.Collections 클래스의 동기화 메서드를 이용해서 동기화 처리가 가능하도록 만들어져 있다. 동기화가 필요할 때 위의 메서드를 사용하면 된다.

 

 

  ■ 변경 불가(읽기 전용) 컬렉션

static Collection unmodifiableCollection(Collection c)
static List unmodifiableList(List list)
static Set unmodifiableSet(Set s)
static Map unmodifiableMap(Map m)
static NavigableSet unmodifiableNavigableSet(NavigableSet s)
static SortedSet unmodifiableSortedSet(SortedSet s)
static NavigableMap unmodifiableNavigableMap(NavigableMap m)
static SortedMap unmodifiableSortedMap(SortedMap m)

  주로 멀티 쓰레드 프로그래밍에서 여러 쓰레드가 하나의 컬렉션을 공유하다 보면 데이터가 손상될 수 있는데, 이를 방지하려고 변경 불가(읽기 전용)로 만드는 경우가 있다.

 

 

  ■ 싱글톤 컬렉션

static List singletonList(Object o)
static Set singleton(Object o)	//주의!) singletonSet이 X
static Map singletonMap(Object key, Object value)

   singleton 으로 시작하는 메서드들은 인스턴스를  new 연산자가 아닌 메서드를 통해서만 생성할 수 있게 함으로써 생성할 수 있는 인스턴스의 개수를 제한하는 것과 관련된 기능을 제공한다.

 

 

  ■ 한종류의 객체만 저장하는 컬렉션

static Collection checkedCollection(Collection c, Class type)
static List checkedList(List list, Class type)
static Set checkedSet(Set s, Class type)
static Map checkedMap(map m, Class keyType, class valueType)
static Queue checkedQueue(Queue queue, Class type)
static NavigableSet checkedNavigableSet(NavigableSet, Class type)
static SortedSet checkedSortedSet(SortedSet, Class)
static NavigableMap checkedNavigableMap(NavigableMap m, Class keyType, Class valueType)
static SortedMap checkedSortedMap(SortedMap m, Class keyType, Class valueType)

  컬렉션에 지정된 종류의 객체만 저장할 수 있도록 제한할 때 위의 메서드를 사용한다. 사용할 때 두 번째 매개변수에 객체의 클래스를 지정하면 된다. 호환성 때문에 남겨진 메서드이기 때문에 보통은 지네릭스(generics)를 이용해서 처리한다. 

 

 

package Example;

import java.util.*;
import static java.util.Collections.*;

public class Example {
	public static void main(String[] args) {
		List list = new ArrayList();
		System.out.println(list);
		
		addAll(list, 1, 2, 3, 4, 5);
		System.out.println(list);
		
		rotate(list, 2);	//오른쪽으로 2칸씩 이동
		System.out.println(list);
		
		swap(list, 0, 2);	//첫 번째와 세 번째를 교환(swap)
		System.out.println(list);
		
		shuffle(list);
		System.out.println(list);
		
		sort(list);	//정렬
		System.out.println(list);
		
		sort(list, reverseOrder());	//역순정렬 reverse(list);와 동일
		System.out.println(list);
		
		int idx = binarySearch(list, 3);	//3이 저장된 위치(index)를 반환
		System.out.println("index of 3 = " + idx);
		
		System.out.println("max = " + max(list));
		System.out.println("min = " + min(list));
		System.out.println("min = " + max(list, reverseOrder()));
		
		fill(list, 9);	//list를 9로 채운다
		System.out.println("list = " + list);
		
		// list와 같은 크기의 새로운 list를 생성한 뒤 2로 채운다. 단, 결과는 변경불가
		List newList = nCopies(list.size(), 2);
		System.out.println("newList = " + newList);
		
		System.out.println(disjoint(list, newList));	//공통요소가 없으면 true
		
		copy(list, newList);
		System.out.println("newList = " + newList);
		System.out.println("list = " + list);
		
		replaceAll(list, 2, 1);
		System.out.println("list = " + list);
		
		Enumeration e = enumeration(list);
		ArrayList list2 = list(e);
		
		System.out.println("list2 = " + list2);
	}
}

 

실행결과

 Collections 와 관련된 메서드들의 기능들을 확인해보는 예제이다.

'Back end > Java' 카테고리의 다른 글

[Java] 지네릭스(Generics)  (0) 2019.07.29
[Java] 해싱(hashing)과 해시함수(hash function)  (0) 2019.07.25
[Java] HashMap과 Hashtable, TreeMap  (0) 2019.07.25
[Java] HashSet, TreeSet  (0) 2019.07.24
[Java] Iterator, Arrays, Comparator  (0) 2019.07.23

+ Recent posts