컬렉션 프레임웍(collections framework)(!!!)
- 컬렉션(collection)
- 여러 객체(데이터)를 모아 놓은 것을 의미
- 프레임웍(framework)(library+표준화됨)
- 표준화, 정형화된 체계적인 프로그래밍 방식
- 컬렉션 프레임웍(collections framework)
- 컬렉션(다수의 객체)를 다루기 위한 표준화된 프로그래밍 방식
- 컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공
- java.util패키지에 포함. JDK1.2부터 사용
- 컬렉션 클래스(collection class)
- 다수의 데이터를 저장할 수 있는 클래스
(예, Vector, ArrayList, HashSet)
- 다수의 데이터를 저장할 수 있는 클래스
컬렉션 프레임웍의 핵심 인터페이스
- 리스트 = 순서있음, 중복허용
- 셋 = 순서없음, 중복없음
- 맵 = 순서없음, 키 중복없음(키-값)
Collection 인터페이스의 메서드
- list, set의 조상이므로 하위 자손들은 모두 쓸수있는 메서드
List인터페이스 - 순서O, 중복O
List인터페이스 메서드
Set인터페이스 - 순서X, 중복X
Set 인터페이스의 메서드
- 집합과 관련된 메서드(Collection에 변화가 있으면 true, 아니면 false를 반환)
Map인터페이스 - 순서X, 중복(키X, 값O)
- entry = (키-값) 하나를 부르는 이름
Map인터페이스의 메서드
list, set, map 자세한 설명
ArrayList
ArrayList는 기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일
ArrayList동기화 처리되어있다(Vector는 안되어있음)
List인터페이스를 구현하므로, 저장순서가 유지되고 중복을 허용
데이터(=객체)의 저장공간으로 배열을 사용한다(배열기반)
vector 코드 중 참고할것
ArrayList의 메서드
1 | import java.util.*; |
- list1.remove(new Integer(1))로 해야 배열에서 1값을 삭제함!! (그냥 list1.remove(1)하면, 인덱스 1을 삭제함)
ArrayList에 저장된 객체의 삭제과정
배열의 장단점
- 장점: 배열은 구조가 간단하고 데이터를 읽는 데 걸리는 시간 짧다. O(1)
- 단점
- 단점1: 크기를 변경할수없다(크기를 변경하는 경우 새로운 배열을 생성후 복사해야함
- 단점2: 비순차적인 데이터의 추가, 삭제에 시간이 많이걸린다.
LinkedList - 위 배열 단점을 보안
- 배열과 달리 링크드 리스트는 불연속적으로 존재하는 데이터를 연결(link)
삽입, 삭제시 단순히 link만 변경하면 빠름
단점: 불연속적이므로 데이터 접근성 나쁨 O(N)
더블리 링크드 리스트 - 이중 연결리스트, 접근성 향상
- 더블리 써큘러 링크드 리스트 - 이중 원형 연결시스트
- 각 장단점 내용( 배열기반 vs연결기반)
스택 & 큐
스택 메서드
큐 메서드
기본적으로 참조변수의 클래스는 조상을 쓰는것이좋다. 추후 자손이 바껴도, 자손이 조상을 상속하였다면 변경할 필요없기떄문이다 !!!
1 | import java.util.*; |
Iterator, ListIterator, Enumeration
- 컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스
- Iterator 사용하기!!
- ListIterator는 Iterator의 접근성을 향상시킨것(단방향→양방향)
Iterator
- 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한것
- 구조상관없이 단순히 확인! 후 읽기 만 하면됨!!
(HashSet(), Arraylist() 등 컬렉션의 자손들은 모두 사용가능) - 컬렉션에 iterator()를 호출해서 Iterator를 구현한 객체를 얻어서 사용
- 마지막이면 it.hasNext() 는 false반환됨
- iterator는 1회용이라 다쓰고나오면 새로운 iterator 필요
1 | import java.util.*; |
Maprhk Iterator
- Map에는 iterator()가 없다. keySet(), entrySet(), values()를 호출해야 이터레이터 사용가능
Arrays
- 배열을 다루기 편리한 메서드(static) 제공
- 배열의 출력 - toString()
- 배열의 복사 - copyOf(), copyOfRange(), 새로운 배열 생성후 반환
- 배열 채우기 - fill(), setAll()
- 배열의 정렬과 검색 - sort(), binarySearch()
binarySearch는 항상 sort가 되어있는 것에만 쓸수있다. - 다차원 배열의 출력 - deepToString()
- 다차원 배열의 비교 - deepEquals()
- 배열을 List로 변환 - asList(Object …..a),
- 람다와 스트림 관련 - parallelXXX,spliterator(), stream()
Comparator 와 Comparable
- 객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스
- sort(대상, 기준) = 기준생략가능한것은 객체 배열에 저장된 객체가 구현한 Comparable에 의한 정렬
- 직접 Comparator implements받아서 compare 구현가능
Set - 순서X, 중복X
- HashSet
- Set인터페이스를 구현한 대표적인 컬렉션 클래스
- 순서를 유지하려면, LinkedHashSet클래스를 사용해야한다
- TreeSet
- 범위 검색과 정렬에 유리한 컬렉션 클래스
- HashSet보다 데이트 추가, 삭제에 시간이 더 걸림
HashSet - 주요 메서드
HashSet - 특징
- HashSet은 객체를 저장하기 전에 기존에 같은 객체가 있는지 확인
같은 객체가 없으면 저장하고, 있으면 저장하지 않는다 - boolean add(Object o)는 저장할 객체의 equals()와 hashCode()를 호출
equals()와 hashCode()가 오버라이딩 되어 있어야함
1 | import java.util.*; |
- 위에 코드는 틀렸다. set에 add가 일어날때 매번 equals를 호출하게되어있지만, 오버라이딩이 되어있지 않아서 다른 값으로 인식하기 때문이다
- 따라서 아래 코드를 class Person안에 넣어줘야한다.
1 |
|
TreeSet - 범위 탐색, 정렬 우위
- 이진 탐색 트리로 구현, 범위 탐색과 정렬에 유리
- 이진 트리는 모든 노드가 최대 2개의 하위 노드를 가짐
- 이진 탐색 트리는 이진 트리의 한 종류
- 부모보다 작은 값이 왼쪽 큰 값은 오른쪽에 저장
- 데이터가 많아질수록 추가, 삭제에 시간이 걸림
TreeSet - 데이터 저장과정 boolean add(Object o)
TreeSet - 메서드
Map 인터페이스
HashMap과 Hashtable - 순서X, 중복(키X,값O)
- 거의hashmap과 treemap사용
- HashMap
- Map인터페이스를 구현한 대표적인 컬렉션 클래스
- 순서를 유지하려면, LinkedHashMap클래스를 사용하면 된다
- TreeMap
- 범위 검색과 정렬에 유리한 컬렉션 클래스
- HashMap보다 데이터 추가, 삭제에 시간이 더 걸림
HashMap의 키와 값
- 해싱 기법으로 데이터를 저장, 데이터가 많아도 검색이 빠르다
- Map인터페이스 구현, 데이터를 키와 값의 쌍으로 저장
해싱(hashing)
저장할떄, 읽어올때 해시함수를 사용하여, 키값을 넣으면 저장위치(hash code)(배열의index) 알려줌 >> 해시테이블에서 해당 저장위치에 값 찾기가능
배열과 링크드리스트 장점을 모음
해시테이블에 저장된 데이터가져오는 과정
HashMap - 주요 메서드
Collections - 컬렉션을 위한 메서드(static)를 제공
- Objects, Arrays, Collections가 대표적 static메서드 제공
- 컬렉션 채우기, 복사, 정렬, 검색
fill(), copy(), sort(), binarySearch() - 컬렉션의 동기화
synchronizedXXX() - 변경불가(readOnly) 컬렉션 만들기
unmodifiableXXX() - 싱글톤 컬렉션 만들기 (객체 1개만 저장)
singletonXXX() - 한 종류의 객체만 저장하는 컬렉션 만들기
checkedXXX()