컬렉션
Collection 이란 같은 타입의 참조값을 여러개 저장하기 위한 자바 라이브러리로 배열과 비슷한데 더 편리한 것 정도로 접근하자.
다음 그림은 Collection주요 인터페이스의 계층관계를 보여 주고 있다.
컬렉션 클래스를 선택할 때 다음을 고려하자.
- Set - 중복을 허용하지 않고 순서도 가지지 않는다.
- List - 중복을 허용하고 순서를 가진다.
- Map - Key와 Key에 대한 Value의 형태로 저장한다.
인터페이스를 구현한 Collection 클래스를 살펴보겠다.
다음 테이블은 자바 2에 소개된 6개의 Collection 구현 클래스와 자바 2 이전에 쓰였던 Collection 클래스를 보여준다.
| 인터페이스 | 구현 클래스(자바 2) | 구현 클래스(자바 2이전) |
|---|---|---|
| Set | HashSet | |
| TreeSet | ||
| List | ArrayList | Vector |
| LinkedList | Stack | |
| Map | HashMap | Hashtable |
| TreeMap | Properties |
컬렉션 클래스 예제
Set
예제는 Set 구현 클래스의 사용법을 보이고 있다.
프로그램은 HashSet을 생성하고 거기에 많은 이름을 추가하고 있다.
그런데 한 이름은 중복하여 추가하고 있다.
프로그램은 다음 Set에 저장된 이름 리스트를 출력합니다.
Set 은 중복을 허용하지 않기에 중복된 이름은 출력되지 않음을 확인할 수 있다.
다음 프로그램은 기존의 Set을 TreeSet으로 처리한다.
그런 후 출력을 해보면 리스트가 정렬되어 있는 것을 확인할 수 있다.
SetExample.java
package net.java_school.example;
import java.util.*;
public class SetExample {
public static void main(String args[]) {
Set set = new HashSet();
set.add("양효선");
set.add("홍용표");
set.add("황진호");
set.add("김동진");
set.add("전경수");
set.add("양효선");
System.out.println(set);
Set sortedSet = new TreeSet(set);
System.out.println(sortedSet);
}
}
다음은 제네릭을 사용하여 변경한 코드입니다.
SetExample.java
package net.java_school.example;
import java.util.*;
public class SetExample {
public static void main(String args[]) {
Set<String> set = new HashSet<String>();
set.add("양효선");
set.add("홍용표");
set.add("황진호");
set.add("김동진");
set.add("전경수");
set.add("양효선");
System.out.println(set);
Set<String> sortedSet = new TreeSet<String>(set);
System.out.println(sortedSet);
}
}
두 예제의 차이는 아래를 참고한다.
Collection API 를 JDK 1.5 이상의 문서에서 보면 인터페이스나 클래스 명 옆에 <E>, <T>, <K, V>
가 붙어있는 것을 볼 수 있다.
이것은 JDK 1.5 부터 소개된 제네릭 표기법이다.
<E>는 Element, <T>는 Type, <K, V> 는 Key, Value 이다.
이렇듯 제네릭을 쓰면 표기법으로 지정한 데이터 타입만을 저장하는 콜렉션을 얻을 수 있다.
List
List는 Collection 인터페이스를 상속하며, 순서가 있고 중복을 허락한다.
List는 또한 위치를 지정하는 기능을 추가로 가지고 있다.
다음 예제는 이러한 특징을 가진 List의 사용법을 보여준다.
프로그램의 처음은 ArrayList를 생성하고 있다.
리스트를 채운 후 특정 위치에 저장된 데이터를 추출하는 방법을 보여준다.
예제의 LinkedList는 큐로 다루어지고 있다.
참고로 큐란 컴퓨터의 기본적인 자료 구조의 한가지로, 먼저 집어 넣은 데이터가 먼저 나오는 FIFO(First In First Out)구조로
저장하는 형식을 말한다.
ListExample.java
package net.java_school.example;
import java.util.*;
public class ListExample {
public static void main(String args[]) {
List list = new ArrayList();
list.add("양효선");
list.add("홍용표");
list.add("황진호");
list.add("김동진");
list.add("전경수");
list.add("양효선");
System.out.println(list);
System.out.println("2: " + list.get(2));
System.out.println("0: " + list.get(0));
LinkedList queue = new LinkedList();
queue.addFirst("양효선");
queue.addFirst("홍용표");
queue.addFirst("황진호");
queue.addFirst("김동진");
queue.addFirst("전경수");
queue.addFirst("양효선");
System.out.println(queue);
queue.removeLast();
queue.removeLast();
System.out.println(queue);
}
}
다음은 제네릭을 사용하여 변경한 코드이다.
ListExample.java
package net.java_school.example;
import java.util.*;
public class ListExample {
public static void main(String args[]) {
List<String> list = new ArrayList<String>();
list.add("양효선");
list.add("홍용표");
list.add("황진호");
list.add("김동진");
list.add("전경수");
list.add("양효선");
System.out.println(list);
System.out.println("2: " + list.get(2));
System.out.println("0: " + list.get(0));
LinkedList<String> queue = new LinkedList<String>();
queue.addFirst("양효선");
queue.addFirst("홍용표");
queue.addFirst("황진호");
queue.addFirst("김동진");
queue.addFirst("전경수");
queue.addFirst("양효선");
System.out.println(queue);
queue.removeLast();
queue.removeLast();
System.out.println(queue);
}
}
Map
다음예제는 Map구현 클래스의 사용법을 보여주고 있다.
프로그램의 처음 부분에서 HashMap이 사용되어 데이터를 저장한다.
후반 부분에서 맵을 TreeMap으로 바뀌는데 TreeMap에 저장된 데이터를 출력하면 키 리스트가 정렬되어 있다는 것을 확인 할 수 있다.
MapExample.java
package net.java_school.example;
import java.util.*;
public class MapExample {
public static void main(String args[]) {
Map map = new HashMap();
map.put("1", "양효션");
map.put("2", "홍용표");
map.put("3", "황진호");
map.put("4", "김동진");
map.put("5", "전경수");
System.out.println(map);
System.out.println((String)map.get("4"));
Map sortedMap = new TreeMap(map);
System.out.println(sortedMap);
}
}
다음은 제네릭을 사용하여 변경한 코드이다.
MapExample.java
package net.java_school.example;
import java.util.*;
public class MapExample {
public static void main(String args[]) {
Map<String,String> map = new HashMap<String,String>();
map.put("1", "양효션");
map.put("2", "홍용표");
map.put("3", "황진호");
map.put("4", "김동진");
map.put("5", "전경수");
System.out.println(map);
System.out.println((String)map.get("4"));
Map<String,String> sortedMap = new TreeMap<String,String>(map);
System.out.println(sortedMap);
}
}
Vector
다음 과거 컬렉션 클래스로 자주 쓰였던 Vector를 사용하는 방법을 보여주고 있다. 참고로 현재는 Vector대신에 ArrayList가 더 많이 사용하고 있다.
VectorExample.java
package net.java_school.example;
import java.util.*;
public class VectorExample {
public Vector vect;
public VectorExample () {
vect = new Vector();
}
public static void main ( String[] args ) {
VectorExample ve = new VectorExample();
for ( int i = 0; i < 10; i++ ) {
ve.vect.addElement( String.valueOf( Math.random() * 100 ) );
}
for ( int i = 0; i < 10; i++ ) {
System.out.println( ve.vect.elementAt(i) );
}
}
}
다음은 제네릭을 사용하여 변경한 코드입니다.
VectorExample.java
package net.java_school.example;
import java.util.*;
public class VectorExample {
public Vector<String> vect;
public VectorExample () {
vect = new Vector<String>();
}
public static void main ( String[] args ) {
VectorExample ve = new VectorExample();
for ( int i = 0; i < 10; i++ ) {
ve.vect.addElement( String.valueOf( Math.random() * 100 ) );
}
for ( int i = 0; i < 10; i++ ) {
System.out.println( ve.vect.elementAt(i) );
}
}
}
Properties
자바에서 설정 파일로부터 값을 읽을 때 많이 사용하는 클래스이다.
PropertiesTest1.java
package net.java_school.example;
import java.util.*;
import java.io.*;
public class PropertiesTest1 {
public static void main(String[] args) {
Properties prop = new Properties();
prop.put("name", "김태희");
prop.put("address", "서울 서초구");
try {
prop.store(new FileOutputStream("test.properties"),"My Favorite Actress");
} catch ( IOException e ) {}
}
}
PropertiesTest2.java
package net.java_school.example;
import java.util.*;
import java.io.*;
public class PropertiesTest2 {
public static void main(String[] args) {
Properties prop2 = new Properties();
try {
prop2.load(new FileInputStream("test.properties"));
} catch ( IOException e ) {}
System.out.println(prop2.getProperty("name"));
System.out.println(prop2.getProperty("address"));
}
}
PropertiesTest1 예제를 실행하면 파일시스템에 test.properties 파일이 만들어진다. 파일을 열어보면 다음과 같다.
test.properties
#My Favorite Actress
#Thu Sep 18 21:03:24 KST 2008
address=\uC11C\uC6B8 \uC11C\uCD08\uAD6C
name=\uAE40\uD0DC\uD76C
예상과 달리 한글 부분이 이상한 문자로 되어 있다.
자바 프러퍼티는 자바 프로그램에서 설정에 관련된 부분에 이용하기 위해 만들어 졌지만 비영어권을 위한 배려는 하지 않은 것 같다.
한글은 프로퍼티 파일에서 자바에서 사용하는유니 코드값으로 저장되어 있어야 한다.
이것이 우리로서는 자바 프로퍼티의 단점이다.
Enumeration 인터페이스
열거형 형태로 저장된 객체를 처음부터 끝까지 차례로 조회하는데 유용한 인터페이스이다.
메소드는 다음 2개가 전부이다.
hasMoreElements()
nextElement()
아래 코드는 Vector<E> v 의 모든 요소를 출력한다.
for (Enumeration<E> e = v.elements(); e.hasMoreElements();) {
System.out.println(e.nextElement());
}
Iterator 인터페이스
Collection 인터페이스의 iterator() 메소드는 Iterator를 리턴한다.
Iterator는 Enumeration 인터페이스와 비슷하나 Enumeration 보다 나중에 만들어졌다.
Enumeration보다 메소드명이 간단하며 Enumeration과는 달리 요소를 삭제하는 메소드가추가되어 있다.
hasNext()
next()
remove()
랩퍼(Wrapper) 클래스
컬렉션은 참조값만을 담을 수 있다.
기본 자료형인 경우는 컬렉션 담을 수 없다.
기본 자료형을 컬렉션에 담기 위해선는 랩퍼 클래스 이용하는 것이 답일 될 수 있다.
모든 기본 자료형에 대해서 그에 대응하는 랩퍼 클래스가 존재한다.
기본 자료형의 값을 멤버 변수의 값으로 저장하고 이 값 주위로 값을 가공하는 메소드들이 감싸고 있다 해서 랩퍼(Wrap:감싸다)클래스라고
불리는 것이다.
| 기본 자료형 | 랩퍼 클래스 |
|---|---|
| boolean | Boolean |
| byte | Byte |
| char | Character |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
참고 자료
http://java.sun.com/developer/onlineTraining/collections/Collection.html
- 다음 : 예외
- 이전 : static 키워드
