컬렉션 프레임워크(Collection Framework)
컬렉션 프레임워크는 자료구조와 알고리즘을 구조화해서 여러 데이터를 편리하게 관리할 수 있게 만들어 놓은 것의 기능들의 집합체같은 것이다.
JDK 1.5부터는 Queue interface도 추가되었다. 이들을 쉽게 다루기 위한 Collections 클래스도 존재한다.
대표 인터페이스로는 List, Set, Map 인터페이스가 있다.
https://nukoori.tistory.com/10
위 포스팅과 어느정도 겹치는 부분이 있지만 여러번 다른 페이지를 여는 귀찮음을 고려하여 다소 중복되는 내용도 다시 사용할 것이다.
List 인터페이스
순서가 있는 데이터들의 집합으로 데이터 중복을 허용한다.
ArrayList
배열과 비슷하게 여러 데이터를 담을 수 있는 자료형이다. 동기화 처리가 없다.
ArrayList l1 = new ArrayList();
ArrayList l2 = new ArrayList(4); // 4=initialCapacity, 초기용량(이것보다 많이 들어가는건 상관없음)
ArrayList<String> l3 = new ArrayList<>(); // <>는 앞의 String과 동일하게 암묵적으로 인정된다.
같이 만들 수 있다.
주로 사용하는 메소드
예시로 사용하는 변수 => ArrayList l1 = new ArrayList()
메소드 이름 | 사용 예시 | 설명 |
add | l1.add(2); l1.add("test"); l1.add(0, 56); [56, 2, "test"]가 나온다. |
리스트 마지막에 해당 데이터 추가 add(추가할 데이터값), add(추가할 위치(인덱스), 값) 같이 사용가능 |
get | l1.get(0); 2가 나온다. |
get(인덱스번호)로 해당 인덱스의 값을 가져온다. 리스트 자체에 영향은 없다. 리스트 바깥의 인덱스번호 입력시 에러. |
size | l1.size() | 리스트 크기를 반환 |
remove | l1.remove(1); l1.remove(Integer.valueOf(2); l1.remove("test"); |
remove(인덱스번호)로 해당 인덱스의 값을 지우거나, Integer.valueOf()로 리스트 내의 지우고자 하는 숫자값을 지울수도 있다.(문자열은 그냥 쓰면 지워짐) |
clear | l1.clear() []이 나온다. |
빈 리스트로 만듦 |
sort | l1.sort(Comparator.naturalOrder()); // 오름차순 l1.sort(Comparator.reverseOrder()); // 내림차순 |
순서를 정렬하는 함수 |
contains | l1.contains(2); l1.contains("study"); |
리스트가 해당 값을 갖고있는지 boolean값으로 반환 |
indexOf | l1.indexOf("test"); | 해당 값의 인덱스번호를 반환 |
LinkedList
ArrayList쪽에서 보여준 메소드들을 모두 사용가능하며 추가적으로 사용가능한 메소드들이 있다. 노드를 이용하여 ArrayList의 단점인 추가, 삭제 기능을 보완했다.
LinkedList l1 = new LinkedList();
LinkedList l1 = new LinkedList(collection); // 다른 컬렉션을 LinkedList로 만들기
위 메소드 + 추가로 사용가능한 메소드
메소드 이름 | 사용 예시 | 설명 |
addFirst | l1.addFirst(3); | 리스트 앞쪽에 값을 추가 |
addLast | l1.addLast(10); | 리스트 뒤쪽에 값을 추가 |
removeFirst | l1.removeFirst(); | 리스트 앞쪽에 값을 제거 |
removeLast | l1.removeLast(); | 리스트 앞쪽에 값을 제거 |
Vector
ArrayList와 비슷하지만 동기화 처리문제로 잘 사용하지는 않는다.
Vector v1 = new Vector();
Stack
Vector 클래스를 상속받아 만든 것으로 스택 메모리 구조의 클래스를 제공한다. (LIFO)
Vector v1 = new Vector();
Set 인터페이스
순서가 없는 데이터들의 집합이다. 데이터의 중복을 허용하지 않는다.
add는 순서가 없기에 그냥 데이터값만으로 쓰고, remove는 순서가 없기에 인덱스가 아닌 데이터값으로 지운다.
HashSet
배열과 비슷하게 여러 데이터를 담을 수 있는 자료형이다. Hashcode로 객체를 비교한다.
HashSet s1 = new HashSet();
HashSet l2 = new HashSet(4); // 4=initialCapacity, 초기용량(이것보다 많이 들어가는건 상관없음)
HashSet<Integer> l3 = new HashSet<>(Arrays.asList(1,3,5,6,7)); // 배열을 set에 넣는 것, 제네릭스 Integer 타입으로 제한
주로 사용하는 메소드
예시로 사용하는 변수 => HashSet s1 = new HashSet()
메소드 이름 | 사용 예시 | 설명 |
add | s1.add(2); s1.add("test"); s1.add(2); [2, "test"]가 나온다. |
Set에 해당 데이터 추가 add(추가할 데이터값)으로 사용, 중복된 데이터가 들어올 경우, 알아서 중복처리해서 원래 데이터만 남음 |
remove | s1.remove(1); | remove(데이터값)로 해당 데이터를 지움. 해당 데이터가 없는경우 아무일도 일어나지 않음 |
size | s1.size() | Set 크기를 반환 |
contains | s1.contains(2); s1.contains("study"); |
Set이 해당 값을 갖고있는지 boolean값으로 반환 |
clear | s1.clear(); []이 나온다. |
빈 Set으로 만듦 |
TreeSet
이진트리 기반의 Set이다. 자동 정렬된다. 범위탐색과 정렬에 유리하지만 요소 추가, 삭제시 성능이 떨어진다.
HashSet쪽에서 보여준 메소드들을 모두 사용가능하며 추가적으로 사용가능한 메소드들이 있다.
TreeSet t1 = new TreeSet();
다른 데이터 타입은 들어갈 수 없다. 들어가는 데이터들의 타입은 다 같다.
위 메소드 + 추가로 사용가능한 메소드
메소드 이름 | 사용 예시 | 설명 |
first | s1.first(); | Set 맨 앞쪽의 값을 가져옴 |
last | s1.last(); | Set 맨 뒤쪽의 값을 가져옴 |
lower | s1.lower(10); | 해당 값보다 작고, 가장 가까운 값을 가져옴 |
higher | s1.higher(10); | 해당 값보다 크고, 가장 가까운 값을 가져옴. |
TreeSet은 binary search 등 탐색부분에 특화된 구조이다. 자세한건 자료구조 부분에서 다룰 예정.
LinkedHashSet
HashSet에서 순서보장기능을 향상한 것이다.
Map 인터페이스
키와 값의 쌍으로 이루어진 데이터들의 집합이다. 순서를 유지하지 않는다.
Key는 중복을 허용하지 않지만, Value는 가능하다.
HashMap
킷값을 통해 접근하므로 맵 내부의 쌍들의 순서는 중요치 않다. 검색이 빠르다.
HashMap h1 = new HashMap();
HashMap h2 = new HashMap(4);; // 4=initialCapacity, 초기용량(이것보다 많이 들어가는건 상관없음)
HashMap<String, Integer> h3 = new HashMap<>();; // <>는 앞의 String, Integer과 동일하게 암묵적으로 인정된다.
같이 만들 수 있다.
주로 사용하는 메소드
예시로 사용하는 변수 => HashMap h1 = new HashMap()
메소드 이름 | 사용 예시 | 설명 |
put | h1.put("apple", 3000); h1.put(123, "banana"); |
앞이 key, 뒤가 value의 한쌍으로 들어간다. |
get | h1.get("kiwi"); h1.get("apple"); |
해당 key에 매칭되는 value를 반환한다. 없을경우 null을 반환한다. |
size | h1.size(); | map의 크기 반환(한 쌍이 하나) |
remove | h1.remove("kiwi"); h1.remove("apple"); |
해당 key에 매칭되는 쌍을 삭제한다. 없을경우 null을 반환한다.(map은 변화없음) |
containsKey | h1.containsKey("kiwi"); h1.containsKey("apple"); |
map에 해당 key가 있는지를 boolean으로 반환 |
https://nukoori.tistory.com/35
TreeMap
이진트리 기반의 Map이다.
Key를 기준으로 정렬되고, Entry를 저장하여 사용한다. 범위 검색 시 성능이 좋다.
HashMap쪽에서 보여준 메소드들을 모두 사용가능하며 추가적으로 사용가능한 메소드들이 있다.
TreeMap t1 = new TreeMap();
위 HashMap과 다르게 처음 들어간 킷값의 데이터 타입을 유지해야한다. 즉, 처음에 t1.add(1,"343");이라고 했으면 이후에도 정수인 킷값만 들어갈 수 있다는 뜻이다. 에러가 뜬다.
위 메소드 + 추가로 사용가능한 메소드
메소드 이름 | 사용 예시 | 설명 |
firstEntry | t1.firstEntry(); | Map 맨 앞쪽의 key-value 쌍을 가져옴 |
firstKey | t1.firstKey(); | Map 맨 앞쪽의 킷값을 가져옴 |
lastEntry | t1.lastEntry(); | Map 맨 뒤쪽의 key-value 쌍을 가져옴 |
lastKey | t1.lastKey(); | Map 맨 뒤쪽의 킷값을 가져옴 |
lowerEntry | t1.lowerEntry(10); | 해당 값보다 킷값이 작고, 해당 값과 킷값이 가장 가까운 key-value 쌍을 가져옴 |
higherEntry | t1.higherEntry(10); | 해당 값보다 킷값이 크고, 해당 값과 킷값이 가장 가까운 key-value 쌍을 가져옴 |
컬렉션들은 Collections.sort(객체명);으로 정렬이 가능하다.
HashTable
HashMap과 비슷하지만 동기화 처리문제로 지금은 잘 사용하지 않는다.
LinkedHashMap
HashMap에서 순서 보장 기능이 향상된 버전이라고 생각하면 된다.