1 배경
1.1 데이터 저장 공간
프로그래밍의 기본
데이터 저장 공간을 이해하는 것
데이터 저장공간
기본 데이터 타입의 변수
일반적인 클래스의 객체
배열(Array) 클래스
단순 용량적인 측면에서의 데이터 저장공간
컬렉션(Collection)류나 맵(Map)류의 클래스
자료구조적인 측면에서의 데이터 저장공간
1.2 용량적인 저장 공간
10개의int형변수선언
int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9;
배열을이용한10개의int형변수선언
int[] ar = new int[10];
Top 클래스
class Top {
//...클래스의 내용
}
Top 클래스객체10개선언
Top t0, t1, t2, t3, t4, t5, t6, t7, t8, t9;
배열을 이용한 Top 클래스 객체 10개 선언
Top[] t = new Top[10];
a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9]
t[0], t[1], t[2], t[3], t[4], t[5], t[6], t[7], t[8], t[9]
1.3 자료구조적인 저장 공간
단순 저장공간의 문제
자료를 처리하는 방식의 문제(자료구조적인 측면)
동적인 공간의 문제(메모리 공간)
빠른 검색의 문제
배열
양적인저장공간
배열의 검색
사용자가 직접 전체 데이터를 확인해서 검색해야 한다
해결책
컬렉션류나 맵류의 클래스 사용
2 Collection과 Map
2.1 배열의 발전된 형태
배열의 발전된 모델
컬렉션(Collection)과 맵(Map) 계열의 클래스
배열의 크기를 동적으로 늘릴수 없다는 단점을 보완하여 동적으 로 메모리를 확장할 수 있는 클래스이다
Collection과 Map 인터페이스
Collection과 Map은 인터페이스이기 때문에 메서드의 프로토 타입만 존재한다.
Collection계열 클래스는 집합적인 저장공간으로서의 기능을 구 현한 클래스가 된다.
Map계열 클래스는 검색적인 저장공간으로서의 기능을 구현한 클래스가 된다.
2.2 Collection과 Map의 특징
Collection, Map유형의 특징은 객체의 삽입, 삭제, 수정, 검색의 기능을 가지고 있다.
이들은 각 클래스마다 구현된 알고리즘의 약간의 차이가 있을 뿐 전부 같은 부류이다.
이 Collection과 Map 유형이 배열과 구분되는 점
크기를 동적으로 확장할 수 있다는 점과,
배열은 기본형 타입의 배열도 있는 반면에 오로지 객체만을 그 저 장대상으로 한다는 점이다.
2.2 Collection과 Map의 특징
Collection계열 클래스의 삽입과 삭제를 위한 추상 메서드
JDK 5이전
boolean add(Object o)
boolean remove(Object o)
JDK 5이후
boolean add(E o)
boolean remove(Object o)
Map계열 클래스의 삽입과 삭제를 위한 추상 메서드
JDK 5이전
Object put(Object key, Object value)
Object remove(Object key)
JDK 5이후
V put(K key, V value)
V remove(Object key)
2.3 Collection과 Map의 상속구조
Collection
Set
List
Map
HashSet
TreeSet
Stack
Vector
ArrayList
LinkedList
SortedMap
Hashtable
HashMap
TreeMap
SortedSet
키와 값으로 데이터 핸들
순서나 집합적인 저장공간
순서가 있는 저장 공간
집합적인 저장 공간
동기화 보장하는 Map 계열의 클래스
동기화 보장하지 않는 Map 계열의 클래스
정렬을 위한 Map 계열의 클래스
정렬을 위한 Set 계열의 클래스
동기화 보장
동기화 보장 하지 않음
스택자료구조
링크드리스트
Set계열의 대표클래스
2.3 Collection과 Map의 상속구조
Collection 인터페이스의 상속구조
List와Set이된다.
List는 순서가 있는 Collection으로 중복값을 허용한다.
Set은 수학적인 집합개념에 가까우며 중복값을 허용하지 않는다.
List를 구현한 클래스
Stack, Vector, ArrayList, LinkedList
Set을 구현한 클래스
HashSet, TreeSet
2.3 Collection과 Map의 상속구조
Map 인터페이스의 상속구조
List와 Set이 순서나 집합적인 개념의 인터페이스라면
Map은 검색기능이 강화된 인터페이스이다
데이터를 삽입할 때, key와 value의 형태로 삽입되며,
이 key를 이용해서 값을 얻을 수 있는 특징이 있다.
Map인터페이스를 구현한 클래스
HashMap, Hashtable, TreeMap
2.3 Collection과 Map의 상속구조
Sorted 계열의 상속구조
Set과 Map인터페이스를 상속받아 정렬기능이 추가된 SortedSet과 SortedMap인터페이스가 된다.
이들은 각각 TreeSet클래스와 TreeMap클래스로 구현된 다.
SortedSet : Set 인터페이스 상속
Set계열이면서정렬이가능한클래스
SortedMap : Map 인터페이스 상속
Map계열이면서정렬이가능한클래스
둘 다 모두 정렬기능을 포함한다!
2.4 Collection 인터페이스
Collection 인터페이스의 특징
이것을 구현한 클래스들은 모두 집합적인 저장공간으로서 의 기능을 가진다.
모두 객체의 묶음이지만 클래스 별로 약간씩 다르다.
Collection 인터페이스를 구현하고 있는 클래스
Stack, Vector, LinkedList, TreeSet, HashSet
대표적인 클래스는 Vector이다.
2.4 Collection 인터페이스
Collection 인터페이스의 데이터 확인을 위한 추상 메서드 (5.0이전 이후 동일)
boolean isEmpty();
비어 있는지 확인하는 메서드
boolean contains(Object o);
특정 객체가 포함되어 있는지 확인하는 메서드
int size();
포함된 객체의 수를 리턴하는 메서드
Collection 인터페이스의 데이터를 배열로 얻기 위 한 추상메서드도 가지고 있다.
Object[] toArray(); (T[] toArray() – JDK5이후)
포함된 모든 객체들을 배열 형태로 리턴하는 메서드
2.5 Map 인터페이스
Map 인터페이스의 특징
Collection과 달리 Map은 검색적인 개념을 담고 있 는 인터페이스
검색을위해key를가지고있다.
Map인터페이스는 비어있는지, 특정키가 있는지 특정 데이터가 있는지 데이터가 몇 개인지를 검사하는 메서 드를 지원한다.
Map으로 구현된 클래스
Attributes, HashMap, Hashtable, TreeMap
대표적인 클래스는 Hashtable이다.
2.5 Map 인터페이스
Map 인터페이스의 데이터 삽입 삭제를 위한 추상 메서드
Java 1.4까지
Object put(Object key, Object value);
데이터를 삽입하는 메서드
Object remove(Object key);
키(key)를 이용해서 데이터를 제거하는 메서드
Object get(Object key);
키(key)를 이용해서 데이터를 검색하는 메서드
int size();
포함된 객체가 몇 개인지 확인하는 메서드
Java 5부터
V put(K key, V value);
V remove(Object key);
V get(Object key);
2.5 Map 인터페이스
Map 인터페이스의 데이터 확인을 위한 추상 메서드
자바 5.0 이전 이후 동일하다.
boolean isEmpty();
비어 있는지 확인하는 메서드
boolean containsKey(Object key);
특정 키가 있는지 확인하는 메서드
boolean containsValue(Object value);
특정 데이터가 있는지 확인하는 메서드
int size();
포함된 객체가 몇 개인지 확인하는 메서드
3 컬렉션 클래스 비교
3.1 Vector와 ArrayList의 비교
Vector와 ArrayList의 공통점
순서가 있는 Collection이다.
배열을 컬렉션으로 만들었다고 보면 된다.
List 인터페이스를 구현하고 있다.
데이터를 중복해서 포함할 수 있다.
둘은 기능면에서 거의 동일하다
하지만 Vector는 동기화를 보장하는 반면
ArrayList는 동기화를 보장하지 않는다.
Collection
List
Stack
Vector
ArrayList
LinkedList
동기화보장
동기화보장하지 않음
3.1 Vector와 ArrayList의 비교
ArrayList도 동기화가 가능하다.
ArrayList의동기화지원방법
List list = Collections.synchronizedList(new ArrayList(...));
이렇게 되면 완전히 Vector와 동일한 클래스가 된다.
3.2 Hashtable, HashMap의 비교
Hashtable, HashMap의 공통점
Map 인터페이스를 구현하고 있다.
키(Key)와 값(Value)을 이용해서 데이터를 관리한다.
내부적으로 모두 Hash 기법을 이용하기 때문에 Hash란 단어가 사용되었다.
Hashtable과 HashMap
Hashtable은 동기화가 보장 되지만 HashMap은 동기화가 보 장되지 않는다.
Map
SortedMap
Hashtable
HashMap
동기화 보장
동기화 보장하지 않음
3.2 Hashtable, HashMap의 비교
HashMap의 동기화 지원 방법
Map m = Collections.synchronizedMap(new HashMap(...));
Vector와 ArrayList와 마찬가지로 이렇게 되면 Hashtable과 기능적으로 동일한 클래스가 된다.
Hashtable, HashMap과 HashSet과의 관계
Hashtable과 HashMap은 둘다 Map 인터페이스를 구현하고 있다.
HashSet은 내부적으로 Hash기법을 사용하지만 Set 인터페이 스를 구현하고 있다.
3.3 Sorted와 Not Sorted의 비교
Sorted를지원하지않는클래스
HashSet, HashMap
Sorted를 지원하는 클래스
TreeSet과 TreeMap
Collection
Set
Map
HashSet
TreeSet
SortedMap
Hashtable
HashMap
TreeMap
SortedSet
3.3 Sorted와 Not Sorted의 비교
TreeMap
Key와 Value로 데이터 관리
Key를 기준으로 오름차순으로 정렬된다.
Map인터페이스를 상속한 SortedMap인터페이스를 구현한 클래스
TreeSet
Set인터페이스를 상속한 SortedSet인터페이스를 구현한 클래스
데이터들이 자동으로 오름차순으로 정렬된다.
이 두 클래스는 기본적으로 정렬이 되지만 사용자가 직접 정렬 방식을 지정할 수 있다.
TreeSet과 TreeMap은 정렬을 위한 Comparator 인터페이스를 구현하면 된다.
4 Collection 계열 클래스
4.1 Stack
Stack 클래스
데이터의 삽입과 추출이 후입선출(Last-In First-Out)로 되어 있는 자료구조
즉, 맨 나중에 들어간 데이터가 제일 먼저 나오는 자료구조를 클래스화 한 것이다.
데이터를 삽입할 때는 push()메서드를 사용
추출할 때는 pop()메서드를 사용한다.
그리고 추출한 데이터를 삭제하지 않고 가져오기만 할 때는 peek()을 사용한다.
4.1 Stack
import java.util.*;
public class StackMain{
public static void main(String[] args) {
Stack<String> stack = new Stack<String>();
System.out.println(stack.empty());
stack.push(new String("jabook"));
stack.push(new String("java"));
stack.push(new String("소설같은자바"));
System.out.println(stack.empty()); //데이터가있는지검사
System.out.println(stack.peek()); //데이터삭제없이추출만!
System.out.println(stack.pop()); //데이터추출하며삭제도!
System.out.println(stack.peek());
System.out.println(stack.search("jabook")); //데이터검색
}
}
Collection
List
Stack
Vector
ArrayList
LinkedList
4.2 ArrayList
ArrayList 클래스
클래스명에서도알수있듯이배열의성격도가지고있으며 List자료구조적인 성격을 가지고 있는 클래스이다.
List인터페이스의 메서드를 사용해서
데이터를 삽입할 때는 add()를,
추출할 때는 get()메서드를 이용한다.
4.2 ArrayList
import java.util.*;
public class ArrayListMain{
public static void main(String args[]) {
ArrayList<String> list = new ArrayList<String>();
list.add("홍길동");
list.add("김삿갓");
list.add("이몽룡");
list.add("성춘향");
list.add("변사또");
System.out.println(list);
System.out.println("Index2 : " + list.get(2));
System.out.println("Index0 : " + list.get(0));
String[] arList = new String[list.size()];
list.toArray(arList);
System.out.println("Index1 : " + arList[1]);
System.out.println("Index3 : " + arList[3]);
}
}
Collection
List
Stack
Vector
ArrayList
LinkedList
4.3 HashSet
HashSet 클래스
Set의 성격을 가지고 있으면서 내부에는 해시의 기법을 사용 하는 클래스이다.
중복을 허용하지 않는 집합적인 성격을 가지고 있다
기본메서드로는
add(), remove(), contains(), size()등이 있다.
HashSet에서 데이터를 추출하기 위해서 Iterator를 사용한다
Iterator<String> iter= set.iterator();
while(iter.hasNext()){
String temp = iter.next();
System.out.print(temp+ ", ");
}
Iterator는 컬렉션내의 모든 데이터에 접근할 수 있다.
4.3 HashSet
import java.util.*;
public class HashSetMain{
public static void main(String args[]) {
Set<String> set = new HashSet<String>();
set.add("김삿갓");
set.add("홍길동");
set.add("춘향이");
set.add("이도령");
set.add("향단이");
System.out.println("HashSet: " + set);
set.remove("이도령");
System.out.println(set.contains("홍길동"));
Iterator<String> iter = set.iterator();
while(iter.hasNext()){
String temp = iter.next();
System.out.print(temp + ", ");
}
System.out.println();
}
}
Collection
Set
HashSet
SortedSet
4.4 Vector
Vector 클래스
순서의 개념을 가지고 있는 저장공간이다.
가장 많이 쓰이는 컬렉션 클래스 중의 하나이다.
삽입할때는 addElement()를
추출할 때는 elementAt()을 사용한다.
크기를 확인하는 size()메서드가 많이 쓰인다.
그 외에 insertElement()등의 메서드도 쓰이지만 거의 활용빈도는 없다.
데이터 삽입, 추출, 크기확인의 메서드만 알아도 된다.
4.4 Vector
public class VectorMain {
public static void main(String[] args) {
Vector<String> v = new Vector<String>();//Vector 객체생성
System.out.println("Vector 생성직후의size : " + v.size());
v.addElement(new String("망아지"));
v.addElement(new String("송아지"));
v.addElement(new String("강아지"));
v.addElement(new String("병아리"));
System.out.println("Vector에데이터삽입후의size : " + v.size());
for(int i=0; i< v.size(); i++){
String temp = v.elementAt(i);
System.out.println("Vector v의" + i + "번째:" + temp);
}
}
}
Collection
List
Stack
Vector
ArrayList
LinkedList
new String("망아지")
new String(”송아지")
new String(”강아지")
new String(”병아리")
인덱스 : 0
인덱스 : 1
인덱스 : 2
인덱스 : 3
Vector v = new Vector();
v.addElement(new String(”망아지"));
v.addElement(new String("송아지"))
v.addElement(new String("강아지"));
v.addElement(new String("병아리"));
4.4 Vector
Vector v에 데이터가 삽입된 순서
4.5 Vector
Vector 예제
import java.util.Vector;
class VectorTest{
public static void main(String[] args){
Vector<Object> v = new Vector<Object>(); //객체생성
v.addElement(newCharacter('A')); //Wrapper 클래스의사용
v.addElement(newString("굼뱅이"));
v.addElement(newInteger(100)); //Wrapper 클래스의사용
v.addElement(newInteger(200)); //Wrapper 클래스의사용
System.out.println("Vector의size():" + v.size());
v.insertElementAt(newFloat(3.141592), 1);
System.out.println("insertElementAt()-size():" + v.size());
v.setElementAt("Hello", 3);
System.out.println("setElement()-size():" + v.size());
System.out.println("v의0번째:" + (Character)v.elementAt(0));
System.out.println("v의1번째:" + (Float)v.elementAt(1));
System.out.println("v의2번째:" + (String)v.elementAt(2));
System.out.println("v의3번째:" + (String)v.elementAt(3));
System.out.println("v의4번째:" + (Integer)v.elementAt(4));
if(v.contains("Hello")){ //데이터가있는지확인
int find = v.indexOf("Hello"); //데이터위치확인
System.out.println("v의" + find + "번째:" + (String)v.elementAt(find));
}
}
}
4.4 Vector
Vector 예제
결과
Vector의 size():4
insertElementAt()-size():5
setElement()-size():5
v의0번째:A
v의1번째:3.141592
v의2번째:굼뱅이
v의3번째:Hello
v의4번째:200
v의3번째:Hello
Vector클래스 메서드들의 용법에 대해 알아보는 예제
4.5 AutoBoxing이없을때(자바1.4)
이전까지는 컬렉션 클래스에 데이터를 삽입할 경우
기본형 데이터의 경우에는 이에 matching되는 Wrapper클래스를 이용하여 데이터를 삽입하였다.
자바 1.4까지
Vector v = new Vector(); //객체생성
v.addElement(new Integer(100)); //Wrapper클래스사용
v.addElement(new Integer(200)); //Wrapper클래스사용
Integer t0 = (Integer)v.elementAt(0);
Integer t1 = (Integer)v.elementAt(1);
4.6 AutoBoxing(자바 5.0)
JDK5이상부터는더이상이러한작업이필요없게되 었다.
즉, 아래와 같이 컬렉션에 직접 기본형 데이터를 삽입할 수 있게 된 것이다.
자바 5.0 이후
Vector<Integer> v = new Vector<Integer>();
v.addElement(100); //AutoBoxing 발생
v.addElement(200); //AutoBoxing 발생
자바 5.0 이상에서는 컴파일러가 내부에서 자동으로 Wrapper 클래스의 객체로 변경시켜 준다.
int a0= v.elementAt(0);//AutoUnBoxing 발생
int a1= v.elementAt(1);//AutoUnBoxing 발생
자바 5.0 이상에서는 컴파일러가 내부에서 자동으로 객체 를 적절한 상수값으로 변경시켜 준다.
5 Map 계열 클래스
5.1 HashMap
Map계열의 대표적인 클래스
key와 value로 데이터를 관리하며 키를 이용해서 데 이터를추출할수있다.
데이터를 입력할 때는 put()을
데이터를 추출할 때는 get()을 이용하면 된다.
5.1 HashMap
import java.util.*;
public class HashMapMain{
public static void main(String args[]) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("홍길동", new Integer(1));
map.put("김삿갓", new Integer(2));
map.put("이도령", new Integer(3));
map.put("춘향이", new Integer(4));
map.put("향단이", new Integer(5));
System.out.println(map.get("홍길동"));
System.out.println(map.get("김삿갓"));
System.out.println(map.get("이도령"));
System.out.println(map.get("춘향이"));
System.out.println(map.get("향단이"));
}
}
Map
SortedMap
Hashtable
HashMap
5.2 Hashtable
일반적으로 동기화가 필요없다면 HashMap을 필요하 다면 Hashtable을 사용하면 된다.
동기화 보장 외에는 차이가 거의 없으며 심지어 사용 하는 메서드도 같다.
5.2 Hashtable
import java.util.Hashtable;
public class HashtableMain {
public static void main(String[] args) {
Hashtable<String, Object> h = new Hashtable<String, Object>();
//Hashtable에키와데이터의삽입
h.put("Name", new String("홍길동"));
h.put("Age", new Integer(27));
h.put("Tel", new String("02-1111-2222"));
h.put("Handphone", new String("017-777-9999"));
h.put("Etc", new String("I'm a boy"));
//키값을이용해서객체추출
String name = (String)h.get("Name");
Integer age = (Integer)h.get("Age");
}
}
Map
SortedMap
Hashtable
HashMap
6 Sorted 계열 클래스
6.1 TreeSet과 TreeMap
HashSet을 이용한 TreeSet 생성
예제
import java.util.*;
public class TreeSetMain{
public static void main(Stringargs[]) {
Set<String> set = new HashSet<String>();
set.add(newString("김삿갓"));
set.add(newString("홍길동"));
set.add(newString("춘향이"));
set.add(newString("이도령"));
set.add(newString("향단이"));
System.out.println("HashSet: " + set);
TreeSet<String> ts= new TreeSet<String>();
ts.addAll(set);
System.out.println("TreeSet: " + ts);
}
}
6.1 TreeSet과 TreeMap
결과
[이도령, 춘향이, 향단이, 김삿갓, 홍길동]
[김삿갓, 이도령, 춘향이, 향단이, 홍길동]
설명
HashSet을 이용하여 TreeSet을 생성해 보았다.
입력했던 순서가 아닌 가나다 순서로 출력됨을 알 수 있다.
HashSet
TreeSet
sorted 기능을
이용하기 위해서
Set
6.1 TreeSet과 TreeMap
HashMap을 이용해서 TreeMap 생성
예제
import java.util.*;
public class TreeMapMain{
public static void main(Stringargs[]) {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("홍길동", new Integer(1));
map.put("김삿갓", new Integer(2));
map.put("이도령", new Integer(3));
map.put("춘향이", new Integer(4));
map.put("향단이", new Integer(5));
System.out.println("HashMap: " + map);
Map<String, Integer>sortedMap= new TreeMap<String, Integer>();
sortedMap.putAll(map);
System.out.println("TreeMap: " + sortedMap);
}
}
6.1 TreeSet과 TreeMap
결과
{춘향이=4, 이도령=3, 향단이=5, 김삿갓=2, 홍길동=1}
{김삿갓=2, 이도령=3, 춘향이=4, 향단이=5, 홍길동=1}
설명
HashMap을 이용하여 TreeMap을 생성해 보았다.
출력이 입력했던 순서가 아닌 key값의 가나다 순서로 출력됨을 알 수 있다.
HashMap
TreeMap
sorted 기능을
이용하기 위해서
Map
6.2 TreeSet의 Comparator 구현
TreeSet/TreeMap에 데이터를 삽입하면 기본적으로 오름차순으로 정렬이 된다
그것도 문자열이나 기본 데이터 타입 같은 단순한 것에만 해당된다.
만약 사용자가 직접 만든 클래스의 형이라면 사용자가 직 접 비교법을 넣어 주어야 한다.
TreeSet/TreeMap의 경우에는 Comparator인터페이스를 구현하면 된다.
구현방법
class MyComparator<T> implements Comparator<T>{
public int compare(To1, T o2){
//…비교방법구현
}
}
6.2 TreeSet의 Comparator 구현
예제
import java.util.*;
class Score{
private int korea=0;
private int math=0;
public Score(intkorea, int math){
this.korea= korea;
this.math= math;
}
public int getSum(){
return this.korea+ this.math;
}
public String toString(){
return "국어:" + korea+ " 수학:" + math;
}
}
6.2 TreeSet의 Comparator 구현
예제 - 계속
class MyComparator<T> implements Comparator<T>{
//정렬작업을한다.
public int compare(To1, T o2){
Score s1 = (Score)o1;
Score s2 = (Score)o2;
int r = s1.getSum() -s2.getSum();
if(r>0){
return 1; //오름차순정렬
}else if(r==0){
return 0;
}else {
return -1; //내림차운정렬
}
}
}
6.2 TreeSet의 Comparator 구현
예제 – TreeSet을 이용한 테스트
public class ComparatorTreeSetTest{
public static void main(String[] args){
TreeSet<Score> tset= new TreeSet<Score>(new MyComparator<Score>());
//삽입과동시에정렬된다.
tset.add(newScore(21, 22));
tset.add(newScore(61, 62));
tset.add(newScore(81, 82));
tset.add(newScore(11, 12));
tset.add(newScore(31, 32));
System.out.println(tset);
}
}
결과
[국어:11 수학:12, 국어:21 수학:22, 국어:31 수학:32, 국어:61 수 학:62, 국어:81 수학:82]
6.3 TreeMap의 Comparator 구현
예제 – TreeMap을 이용한 테스트
public class ComparatorTreeMapTest{
public static void main(String[] args){
TreeMap<Score, String> tmap= new TreeSet<Score, String>(new MyComparator<Score>());
//삽입과동시에정렬된다.
tmap.add(newScore(21, 22), “홍길동1”);
tmap.add(newScore(61, 62), “홍길동2”);
tmap.add(newScore(81, 82), “홍길동3”);
tmap.add(newScore(11, 12), “홍길동4”);
tmap.add(newScore(31, 32), “홍길동5”);
System.out.println(tmap);
}
}
결과
{국어:11 수학:12=홍길동4, 국어:21 수학:22=홍길동1, 국어:31 수학:32=홍길 동5, 국어:61 수학:62=홍길동2, 국어:81 수학:82=홍길동3}
7 Enumeration과 Iterator
7.1 컬렉션 검색
컬렉션 내의 데이터에 손쉽게 접근하기 위한 가장 일반적 인 방법은 바로 Enumeration과 Iterator를 사용하는 것 이다.
JDK5에 들어오면서 Enumeration과 Iterator대신에 새 로운 제어문인 Advanced for문을 제공해 준다.
Iterator의경우JDK1.2부터Enumeration의대체용으 로 제공되었다.
Enumeration의 경우 내부에서 사용하는 메서드의 이름이 길고 Fail-Fast를 지원하지 않았기 때문이다.
7.1 컬렉션 검색
컬렉션 검색을 위한 제어문(자바 5.0)
Advanced for(일명 foreach)
자바 5.0에 새롭게 추가된 컬렉션을 위한 반복 제어문
데이터의 마지막에 상관하지 않고 검색하기 위한 제어문
Advanced for의 예
import java.util.*;
public class EasyForEachMain{
public static void main(String[] args){
String[] ar= new String[]{"안녕1", "안녕2", "안녕3"};
for (String tmp: ar){
System.out.println(tmp);
}
}
}
7.2 Vector에서 Enumeration얻기
예제
import java.util.*;
class EnumerationVectorTest{
public static void main(String[] args){
Vector<String> v = new Vector<String>();
v.addElement(newString("망아지"));
v.addElement(newString("송아지"));
v.addElement(newString("강아지"));
v.addElement(newString("병아리"));
Enumeration<String> en = v.elements();
while(en.hasMoreElements()){
String temp = en.nextElement();
System.out.println(temp);
}
}
}
7.2 Vector에서 Enumeration얻기
결과
망아지
송아지
강아지
병아리
설명
Vector를 Enumeration 객체로 변환시켜 이를 출력
다음 원소를 찾을 때 사용하는 메서드 : nextElement()
원소가 더 있는지 확인하는 메서드 : hasMoreElements()
이두메서드가가장많이쓰인다.
7.3 Hashtable에서 Enumeration얻기
예제
import java.util.*;
class EnumerationHashtableTest{
public static void main(String[] args){
Hashtable<String, String> h = new Hashtable<String, String>();
h.put("1", new String("홍길동"));
h.put("2", new String("안녕하세요"));
h.put("3", new String("02-1111-2222"));
h.put("4", new String("017-777-9999"));
Enumeration<String> en = h.elements();
while(en.hasMoreElements()){
String temp = en.nextElement();
System.out.println(temp);
}
}
}
7.3 Hashtable에서 Enumeration얻기
결과
017-777-9999
02-1111-2222
안녕하세요
홍길동
설명
hashtable에 객체의 삽입
Hashtable<String, String> h = new Hashtable<String, String>();
h.put("1", new String("홍길동"));
…
Enumeration 얻기
Enumeration en = h.elements();
나머지는 Vector의 경우와 동일하다.
7.4 Vector와 Iterator
Iterator는 Enumeration과 동일한 기능을 한다.
Vector를 Iterator로 변환시키는 것은
Vector를 Enumeration으로 변환시키는 것과 동일하다.
Vector Enumeration의 경우
elements()메서드를 사용한 반면,
Vector Iterator의 경우
iterator()메서드를 사용하면 된다.
hasMoreElements()는 hasNext()로
nextElement()는 next()로 대체 되었다.
7.4 Vector와 Iterator
예제
import java.util.*;
class IteratorVectorTest{
public static void main(String[] args){
Vector<String> v = new Vector<String>();
v.addElement(newString("망아지"));
v.addElement(newString("송아지"));
v.addElement(newString("강아지"));
v.addElement(newString("병아리"));
Iterator<String> iter= v.iterator();
while(iter.hasNext()){
String temp = iter.next();
System.out.println(temp);
}
}
}
7.4 Hashtable과 Iterator
예제
import java.util.*;
class IteratorHashtableTest{
public static void main(String[] args){
Hashtable<String,String> h = new Hashtable<String,String>();
h.put("1", new String("홍길동"));
h.put("2", new String("안녕하세요"));
h.put("3", new String("02-1111-2222"));
h.put("4", new String("017-777-9999"));
Iterator<String> iter2 = h.values().iterator();
while(iter2.hasNext()){
String temp = iter2.next();
System.out.println(temp);
}
}
}
7.5 Enumeration과 Iterator의 차이
Fail-Fast 방식
Iterator를 이용해서 순차적으로 접근하고 있는 도중 다른 곳에 서 해당 컬렉션 객체에 데이터를 추가하거나 삭제하는 등의 작 업이 일어난다면 ConcurrentModificationException이발생하 게하는방식
자바 1.2부터 지원
Enumeration은 컬렉션의 집합을 통째로 복사해서(SnapShot) 사용하기 때문에 Fail-Fast를 지원하지 않는다.
그러나 Iterator는 Fail-Fast방식을 지원한다.
7.6 for each 문(자바 5.0)의 예
import java.util.*;
public class ForEachMain{
public static void main(String[] args){
ArrayList<String> ar = new ArrayList<String>();
ar.add("안녕1");
ar.add("안녕2");
ar.add("안녕3");
//1. 일반적인For문
for(Iterator<String> i = ar.iterator(); i.hasNext();) {
String tmp = i.next();
System.out.println(tmp);
}
//2. For Each문Java SE 5.0의코드
for (String tmp : ar){
System.out.println(tmp);
}
}
}