컬렉션 프레임워크?
- 컬렉션 (객체의 저장) + 프레임워크(사용방법을 정해둔 라이브러리)
- 자바가 널리 알려져 있는 자료구조를 사용해 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 인터페이스와 구현클래스를 java.util패키지에서 제공하는 것들
- 컬렉션 프레임워크의 주요 인터페이스로 List, Set, Map이 있다
List
- 배열과 비슷하게 객체를 인덱스로 관리한다.
- 배열과의 차이점은 저장용량이 자동으로 증가하며, 객체를 저장할 때 자동 인덱스가 부여됨
- 리스트 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조
- 동일한 객체를 중복 저장할 시 동일한 번지를 참조
- null또한 저장이 가능하나, 객체를 참조하지 않는 인덱스
List컬렉션에서 공통적으로 사용가능한 List 인터페이스의 메소드 >> ArrayList, Vector, LinkedList
기능 | 메소드 | 설명 |
객체 추가 | boolean add(E e) | 주어진 객체를 맨 끝에 추가 |
void add(int index, E element) | 주어진 인덱스에 객체를 추가 | |
E set(int index, E element) | 주어진 인덱스에 저장된 객체를 주어진 객체로 변환 | |
객체 검색 | boolean contains(Object o) | 주어진 객체가 저장되어 있는지 확인 |
E get(int index) | 주어진 인덱스에 저장된 객체 리턴 | |
boolean isEmpty() | 컬렉션이 비어있는지 조사 | |
int size() | 저장되어 있는 전체 객체 수 리턴 | |
객체 삭제 | void clear() | 저장된 모든 객체 삭제 |
E remove(int index) | 주어진 인덱스에 저장된 객체 삭제 | |
boolean remove(Object o) | 주어진 객체 삭제 |
인덱스로 객체를 관리하게 때문에 인덱스를 매개값으로 갖는 메소드가 많다
E >> 저장되는 객체의 타입을 List 컬렉션 생성 시 결정하라는 의미
ArrayList
import java.util.List;
public class ArrayListEx {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("JDBC");
list.add("Servlet/JSP");
list.add(2, "Database");
list.add("iBATIS");
int size = list.size();
System.out.println("총 객체 수: " + size);
System.err.println();
String skill = list.get(2);
System.out.println("2: "+ skill);
System.out.println();
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
System.out.println(i + ": " + str);
}
System.out.println();
list.remove(2);
list.remove(2);
list.remove("iBATIS");
for (int i = 0; i < list.size(); i++) {
String str = list.get(i);
System.out.println(i + ": " + str);
}
}
}
0번 인덱스부터 차례로 저장되고 삭제시 1씩 당겨지기때문에 빈번한 객체삭제와 삽입이 일어나는 곳에서는 바람직하지 않다. 대신 순차적으로 추가하고 삭제하거나, 검색시에는 빠르다.
Vector
package a220813;
import java.util.List;
import java.util.Vector;
public class VectorEx {
public static void main(String[] args) {
List<Board> list = new Vector<Board>();
list.add(new Board("제목1", "내용1", "글쓴이1"));
list.add(new Board("제목2", "내용2", "글쓴이2"));
list.add(new Board("제목3", "내용3", "글쓴이3"));
list.add(new Board("제목4", "내용4", "글쓴이4"));
list.add(new Board("제목5", "내용5", "글쓴이5"));
list.remove(2);
list.remove(3);
for (int i = 0; i < list.size(); i++) {
Board board = list.get(i);
System.out.printf("%s %s %s %n", board.subject, board.content, board.writer);
}
}
}
class Board {
String subject;
String content;
String writer;
public Board(String subject, String content, String writer) {
this.subject = subject;
this.content = content;
this.writer = writer;
}
}
어레이리스트와 동일한 내부구조를 가지고 있으나 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 Vector의 메소드를 실행할 수 없고 하나의 스레드가 메소드를 실행을 완료해야만 다른 스레드가 실행할 수 있다.
때문에 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있다
LinkedList
package a220813;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class LinkedListEx {
public static void main(String[] args) {
List<String> list1 = new ArrayList<String>();
List<String> list2 = new LinkedList<String>();
long startTime;
long endTime;
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
list1.add(0, String.valueOf(i));
}
endTime = System.nanoTime();
System.out.println("ArrayList 걸린시간: " + (endTime - startTime) + " ns");
startTime = System.nanoTime();
for (int i = 0; i < 10000; i++) {
list2.add(0, String.valueOf(i));
}
endTime = System.nanoTime();
System.out.println("LinkedList 걸린시간: " + (endTime - startTime) + " ns");
}
}
특정 인덱스 객체 제거시 앞 뒤 링크만 변경되고, 나머지 링크는 변경이 없다. (당겨지지X) 때문에 중간에 추가/삭제시 ArrayList에 비해 훨씬 빠르다
Set
List컬렉션은 객체의 저장순서를 유지하지만 Set은 유지되지 않는다. 객체중복이 불가하며 하나의 null만 저장이 가능하다
기능 | 메소드 | 설명 |
객체 추가 | boolean add(E e) | 주어진 객체를 저장. (boolean으로 리턴) |
객체 검색 | boolean contains(Object o) | 주어진 객체가 저장되어 있는지 조사 |
boolean isEmpty() | 컬렉션이 비어있는지 조사 | |
Iterator<E> iterator() | 저장된 객체를 한 번씩 가져오는 반복자를 리턴 | |
int size() | 저장되어 있는 전체 객체수를 리턴 | |
객체 삭제 | void clear() | 저장된 모든 객체를 삭제 |
boolean remove(Object o) | 주어진 객체를 삭제 |
Set 컬렉션은 인덱스롤 객체를 검색해서 가져오는 메소드가 없는 대신 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자를 제공한다.
반복자는 Iterator 인터페이스를 구현한 객체를 말하며 iterator()메소드를 호출하면 얻을 수 있다.
리턴타입 | 메소드 | 설명 |
boolean | hasNext() | 가져올 객체가 있으면 true 아니면 false |
E | next() | 컬렉션에서 하나의 객체를 가져옴 |
void | remove() | Set 컬렉션에서 객체를 제거 |
Hashset
package a220813;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetEx {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("Java");
set.add("JDBC");
set.add("Servlet/JSP");
set.add("Java");
set.add("iBATIS");
int size = set.size();
System.out.println("총 객체수: " + size);
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println("\t" + element);
}
set.remove("JDBC");
set.remove("iBATIS");
System.out.println("총 객체수: " + set.size());
iterator = set.iterator();
for(String element : set) {
System.err.println("\t" + element);
}
set.clear();
if (set.isEmpty()) {
System.out.println("비어 있음");
}
}
}
객체들을 순서없이 저장하고 동일객체는 중복저장하지 않음
hashCode()메소드를 호출해서 해시코드를 얻어낸 후 이미 저장되어 있는 객체들의 해시코드와 비교해서 동일한 해시코드가 있다면 equls()메소드로 두 객체를 비교해 중복저장을 막는
참고 :
- 혼자 공부하는 자바(신용권), 한빛미디어
'개발 > JAVA' 카테고리의 다른 글
[Java] 입출력 스트림 (0) | 2022.08.16 |
---|---|
[Java] 컬렉션 프레임워크 - Map (0) | 2022.08.14 |
[Java] 스레드 제어 (0) | 2022.07.27 |
[Java] 멀티 스레드2 (0) | 2022.07.26 |
[Java] 멀티 스레드 1 (0) | 2022.07.25 |