컬렉션 프레임워크
-
자바에서 제공하는 자료구조 구현 클래스를 말한다
-
자료구조를 미리 구현해놓은 JDK 라이브러리
-
개발 시간을 절약하며 최적의 알고리즘을 사용할 수 있다
-
여러 구현 클래스와 인터페이스의 활용에 대한 이해가 필요하다
-
Collection, Map 인터페이스로 나눠짐
-
Collection 부분은 하나의 요소를 관리
-
Map 부분은 key-value 쌍을 관리
-
순회하고 싶은 경우 iterator 사용
컬렉션 프레임워크의 핵심 인터페이스
List
- 순서 있다
- 중복 가능
- 구현 클래스 : ArrayList, LinkedList, Stack, Vector
Set
- 순서 없다
- 중복 불가능
- 구현 클래스 : HashSet, TreeSet
Map
- key와 쌍으로 Value로 이루어져 있다
- 순서 없다
- key는 중복 불가능
- 구현 클래스 : HashMap, TreeMap, HashTable, Properties
컬렉션 인터페이스의 메서드
List
List 인터페이스를 구현한 클래스
- 순차적으로 자료를 관리하고 싶을 때 사용하는 인터페이스
- Vector = ArrayList
- LinkedList
List 인터페이스의 메서드
ArrayList
- 저장 순서가 유지되고 중복을 허용한다
- 데이터의 저장공간으로 배열
[ ]
을 사용한다
- ArrayList 에는 객체만 저장 가능한데, 컴파일러가 오토 박싱을 해주기 때문에 기본형으로 저장해도 참조형으로 자동 변환된다
ArrayList의 메서드
- 생성
ArrayList()
ArrayList(Collection c)
ArrayList(int initialCapacity)
- 추가
boolean add(Object o)
void add(int index, Object o)
boolean addAll(Collection c)
boolean addAll(int index, Collection c)
- 삭제
boolean remove(Object o)
Object remove(int index)
boolean removeAll(Collection c)
void clear()
list1.remove(1);
list1.ramove(new Integer(1));
- 검색
int indexOf(Object o)
int lastIndexOf(Object o) - 반대로 찾음
boolean contains(Object o)
Object get(int index)
Object set(int index, Object o) - 변경
- 그 외
List subList(int from, int to)
Object[] toArray()
Object[] to Array(Object[] a)
boolean isEmpty()
void trimToSize() - 빈공간 제거
int size()
ArrayList로 멤버쉽 관리하기 실습
- Member 클래스를 만들고, 아이디와 이름을 멤버 변수로 선언
- Member 클래스로 생성된 인스턴스들을 관리하는 클래스를 컬렉션 프레임워크 클래스들을 활용하여 구현한다.
- 생성자 만들기
- size를 미리 지정할 수도, 안 할 수도 있다
안 하면 10이 디폴트
private ArrayList<Member> arrayList;
public MemberArrayList(){
arrayList = new ArrayList<>();
}
public MemberArrayList(int size){
arrayList = new ArrayList<>(size);
}
- 멤버 추가
- 멤버 삭제
- remove 메서드
- 입력 받은 멤버 Id를 찾는 for문, 돌다가 찾으면 삭제 후 반환, 못 찾으면 false
public boolean removeMember(int memberId){
for (int i=0; i< arrayList.size();i++){
Member member = arrayList.get(i);
int tempId = member.getMemberId();
if (tempId==memberId){
arrayList.remove(i);
return true;
}
}
System.out.println(memberId + "가 존재하지 않습니다.");
return false;
}
- 모든 멤버 출력
public void showAllMember(){
for (Member member : arrayList){
System.out.println(member);
}
System.out.println();
}
LinkedList
배열은
- 구조가 간단하고 데이터를 읽는데 걸리는 시간이 짧다
- 데이터의 주소를 계산하는 시간이 짧다
- 크기를 변경할 수 없다
변경하려면 새로운 배열을 만든 후 복사해야함
- 비순차적인 데이터의 추가, 삭제에 시간이 많이 걸린다
순차적인 데이터의 추가, 삭제는 빠르다(끝부터)
배열의 단점을 보완한 LinkedList
- 배열과 달리 LinkedList는 불연속적으로 존재하는 데이터를 연결
- 요소 하나하나를 Node라고 한다
class Node{
Node next;
Object obj;
- 단점: 접근성이 나쁘다 - 한 번에 뒤에 요소에 접근할 수 없고 차례로 하나씩 지나서 가야한다
LinkedList의 단점을 보완한 이중 연결 리스트
- 앞 노드의 주소와 다음 요소의 주소를 저장
- 단점 : 여전히 멀리 있는 데이터에 접근하기는 어렵다
이중 연결 리스트의 단점을 보완한 이중 원형 연결리스트
- 마지막 요소의 다음 요소를 제일 첫번째 요소로 연결
- 멀리 있는 요소에 접근할 경우 첫번째의 이전(마지막 요소)으로 접근하여 빠르게 갈 수 있다
성능 비교
- 순차적으로 데이터를 추가/삭제 - ArrayList가 빠름
- 비순차적으로 데이터를 추가/삭제 - LinkedList가 빠름
- 접근 시간 - ArrayList가 빠름
- 인덱스가 n인 데이터의 주소 = 배열의 주소 + n * 데이터 타입의 크기
Set 인터페이스를 구현한 클래스
- HashSet, TreeSet
- Set 인터페이스의 메서드는 컬렉션 인터페이스와 동일
class Node{
Node next;
Node previous;
Object obj;
집합과 관련된 메서드
Collection 의 인터페이스
Collection 요소를 순회하는 Iterator
- 컬렉션 프레임워크에 저장된 요소를 하나씩 차례로 순회하는 것
- 순서가 없는 인터페이스의 경우에 사용함
- 다양한 컬렉션에서 저장된 요소를 읽어오는 방법을 표준화한 것
Iterator의 메서드
- boolean hasNext(): 이후에 요소가 더 있는지 체크하는 메서드, 있으면 true를 반환한다
- E Next(): 다음에 있는 요소를 반환
- 확인하고 -> 읽어오기 방식
Enumeration
- Iterator의 옛날 방식, 거의 같다
- hasMoreElements()
- nextElement()
ListIterator
- Iterator의 접근성을 향상시킨 것, 단방향 접근에서 양방향 접근으로.
- next만 가져올 수 있는 Iterator에서 이전 값, previous() 를 가져올 수 있는 것
- list인터페이스를 구현한 컬렉션에서만 사용 가능하다
Iterator 사용하기
- Iterator를 하나 생성
Iterator<Member> ir = arrayList.iterator(); // arrayList의 iterator를 ir로 생성
- remove 메서드에 적용
- ir은 hasNext() 메서드로 다음에 값이 있는지 확인,
- next() 메서드로 다음 값으로 이동
while (ir.hasNext()){ //계속 다음으로 가면서
Member member = ir.next();
int tempId = member.getMemberId();
if (tempId==memberId){ // 입력한 id가 있는지 확인, 있으면
arrayList.remove(member); //삭제한다
return true;
}
}
System.out.println(memberId + "가 존재하지 않습니다.");
return false;
- Iterator는 일화용이기 때문에 다 쓰고 다시 사용하기 위해서는 다시 얻어와야 한다(새로운 Iterator 객체 생성)
Map에서의 Iterator
- Map은 Iterator가 없다(Collection의 자손이 아니다)
- keySet(), entrySet(), values()를 호출하면 각각은 Iterator를 사용할 수 있다(Collection의 자손)
Iterator it = map.entrySet().iterator();