- 자료구조 : 데이터를 효율적으로 이용하는 방법으로 데이터에 편리하게 접근하고, 효율적으로 사용하기 위해서 데이터를 저장하거나 조직하는 방법
- 컬렉션 (컬렉션 프레임워크) : 자바에서 제공하는 자료구조를 담당하는 프레임위크. java.util 패키지에 컬렉션과 관련된 인터페이스와 클래스들이 포함되어 있다.
- 컬렉션을 사용하면 데이터의 추가,삭제,정렬 등의 처리가 간단하게 해결되어 자료구조적 알고리즘을 구현할 필요가 없다
주요 인터페이스
| 인터페이스 분류 | | 구현 클래스 | 특징 |
|---|
| Collection | List | ArrayList, Vector, LinkedList | 순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다. |
| Collection | Set | HashSet, LinkedHashSet, TreeSet | 순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용하지 않는다. |
| Map | | HashMap, HashTable, TreeMap, Properties | 키(Key), 값(Value)의 쌍으로 이루어진 데이터의 집합으로 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용한다. |
List
- 자료들을 순차적으로 늘어놓은 구조
- 저장되는 객체를 인덱스로 관리하기 때문에 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공
- 중복되는 객체를 저장 가능하고 null 값도 저장 가능
- 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다.
public void method1(){
List list = new ArrayList();
list.add("안녕하세요.");
list.add(LocalDateTime.now());
list.add(3.14);
list.add(false);
list.add('a');
System.out.println(list);
System.out.println(list.size());
}
String str = (String) list.get(0);
LocalDateTime now = (LocalDateTime) list.get(1);
Double number = (Double) list.get(2);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
for(Object obj : list){
System.out.println(obj);
}
- .add
- 2번 인덱스에 100000이라는 값을 추가, 하나씩 밀어내는 것. 기존 객체들은 하나씩 밀리게됨.
list.add(2,10000);
System.out.println(list);
- .set
- 해당 위치의 인덱스의 객체를 변경하는 것. 기존 인덱스 위치의 객체는 사라짐
list.set(2,true);
System.out.println(list);
- .addFirst, .addLast
- 처음과 끝에 객체를 추가함
- 기존 객체들은 안사라짐
list.addFirst("1st");
list.addLast("last");
System.out.println(list);
- .remove
- 해당 위치(인덱스)의 요소 삭제 or
- 주어진 객체를 삭제. 여러개 있다면 제일 앞에것만
list.remove(2);
list.remove("1st");
System.out.println(list);
list.removeFirst();
list.removeLast();
- 오토박싱이 안됨. integer를 인덱스로 인식해서. Boxing 작업 필요
list.remove(Integer.valueOf(100000));
- .isEmpty() : 리스트가 비어있는지 확인
- .clear() : 리스트에 저장된 객체들을 모두 삭제
System.out.println(list.isEmpty());
list.clear();
System.out.println(list);
System.out.println(list.isEmpty());
- 컬렉션에서 제네릭스를 사용하는 이유
- 명시된 타입의 객체만 저장하도록 제한을 두기 위해서 사용한다
- 컬렉션에 저장된 객체를 꺼내서 사용할 때 매번 형 변환을 하지 않아도 된다
List<String> fruits = new ArrayList<>();
List<Integer> numbers = new ArrayList<>();
Collections.sort(fruits);
Collections.sort(numbers);
Collections.reverse(fruits);
Collections.reverse(numbers);
Collections.sort(fruits, Collections.reverseOrder());
fruits.sort(Collections.reverseOrder());
List 인터페이스의 주요 메소드
| 리턴 타입 | 메소드 | 설명 |
|---|
| boolean | add(E e) | 주어진 객체를 맨 끝에 추가한다. |
| void | add(int index, E element) | 주어진 인덱스에 객체를 추가한다. |
| boolean | addAll(Collection<? extends E> c) | 주어진 Collection 타입 객체를 리스트에 추가한다. |
| E | set(int index, E element) | 주어진 인덱스에 저장된 객체를 주어진 객체로 바꾼다. |
| boolean | contains(Object o) | 주어진 객체가 저장되어 있는지를 확인한다. |
| E | get(int index) | 주어진 인덱스에 저장된 객체를 리턴한다. |
| Iterator | iterator() | 저장된 객체를 한 번씩 가져오는 반복자 리턴한다. |
| boolean | isEmpty() | 컬렉션이 비어 있는지 조사한다. |
| int | size() | 저장되어 있는 전체 객체수를 리턴한다. |
| void | clear() | 저장된 모든 객체를 삭제한다. |
| E | remove(int index) | 주어진 인덱스에 저장된 객체를 삭제한다. |
| boolean | remove(Object o) | 주어진 객체를 삭제한다. |
ArrayList
- List 인터페이스의 구현 클래스
- 배열과의 차이점은 저장 용량(capacity)을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어난다
- 배열을 내부에 가지고 있음
- 동기화(Synchronized)를 제공하지 않는다.
- 동기화 : 하나의 자원(데이터)에 대해 여러 개의 스레드가 접근하려 할 때 한 시점에서 하나의 스레드만 사용할 수 있도록 하는 것
Vector
- List 인터페이스의 구현 클래스
- ArrayList와의 차이점은 동기화(Synchronized)를 제공
- 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있는 것을 스레드가 안전(Thread Safe)
LinkedList
- List 인터페이스의 구현 클래스
- ArrayList와 사용 방법은 동일하지만 내부 구조는 완전히 다름
- 데이터를 담고 있는 요소들이 앞/뒤로 연결된 노드들을 링크(인접 링크)해서 관리