컬렉션 프레임워크의 주요 인터페이스인 List, Set, Map 에 대해서 정리하겠습니다.
먼저 List 인터페이스를 이용해 구현한 클래스인 ArrayList, LinkedList, Vector 를 정리하겠습니다.
List 컬렉션은 객체를 일렬로 늘어놓은 구조를 가지고 있습니다. 객체를 인덱스로 관리하기 때문에 객체를 젖아하면 자동 인덱스가 부여되고 인덱스로 객체를 검색, 삭제 할 수 있는 기능을 제공합니다.
다음은 List 컬렉션에서 공통적으로 사용 가능한 List 인터페이스의 메소드들입니다.
기능 |
메소드 | 설명 |
객체 추가 |
boolean add(E e) | 주어진 객체를 맨 끝에 추가 |
void add(int index, E element) | 주어진 인덱스에 객체를 추가 | |
set(int index, E element) | 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈 | |
객체 검색 | boolean contains(Object o) | 주어진 객체가 저장되어 있는지 여부 |
E get(int index) | 주어진 인덱스에 저장된 객체를 리턴 | |
isEmpty() | 컬렉션이 비어 있는지 조사 | |
int size() | 저장되어 있는 전체 객체 수를 리턴 | |
객체 삭제 | void clear() | 저장된 모든 객체를 삭제 |
E remove(int index) | 주어진 인덱스에 저장된 객체를 삭제 | |
boolean remove(Object o) | 주어진 객체를 삭제 |
1. ArrayList
배열은 생성할 때 크기가 고정되고 사용 중에 크기를 변경할 수 없지만, ArrayList는 저장 용량을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어납니다. ArrayList에 객체를 추가하면 인덱스 0부터 차례대로 저장됩니다. 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩당겨 집니다. 마찬가지로 특정 인덱스에 객체를 삽입하면 마지막 인덱스까지 1씩 밀려납니다. 따라서 빈번한 삽입과 삭제가 일어나는 곳에서는 ArrayList 를 사용하는 것이 바람직하지 않고, LinkedList를 사용하는 것이 좋습니다. 다음은 간단한 ArrayList 사용 예제 입니다.
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
ArrayList<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.out.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);
}
}
}
2. Vector
Vector는 ArrayList와 동일한 내부 구조를 가지고 있습니다. ArrayList와 다른점은 Vector는 동기화된(synchronized) 메소드로 구성되어 있기 때문에 멀티스레드가 동시에 이 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다는 점입니다. 그래서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제 할 수 있습니다. 다음은 간단한 Vector 를 이용해서 Board 객체를 추가, 삭제, 검색하는 예제입니다.
public class Board {
String subject;
String content;
String writer;
public Board(String subject, String contecnt, String writer) {
this.subject = subject;
this.content = content;
this.writer = writer;
}
}
import java.util.Vector;
public class VectorExample {
public static void main(String[] args) {
Vector<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.println(board.subject + "\t" + board.content + "\t" + board.writer);
}
}
}
3. LinkedList
LinkedList는 ArrayList와 사용 방법은 똑같지만 내부 구조는 완전히 다릅니다. ArrayList는 내부 배열에 객체를 저장해서 인덱스로 관리하지만, LinkedList는 임접 참조를 링크해서 체인처럼 관리합니다. LinkedList에서 특정 인덱스의 객체를 제거하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않습니다. 삽입할 때도 마찬가지입니다. 그렇기 때문에 빈번한 삽입과 삭제연산이 일어날 시에는 ArrayList보다 LinkedList가 더 좋은 성능을 발휘합니다.
마지막으로 ArrayList와 Linked 리스트의 처리속도를 비교해보겠습니다.
구분 | 순차적으로 추가/삭제 | 중간에 추가/삭제 | 검색 |
ArrayList | 빠르다 | 느리다 | 빠르다 |
LinkedList | 느리다 | 빠르다 | 느리다 |
'JAVA' 카테고리의 다른 글
모듈 기술자 (Java 11 버전 이후) (3) | 2019.12.18 |
---|---|
"HashMap"의 "Value" 기준 정렬 (0) | 2019.08.27 |
Map 컬렉션 (0) | 2019.05.22 |
Set 컬렉션 (0) | 2019.05.22 |
자주쓰는 Eclipse 단축키 모음 (0) | 2019.05.02 |