[JAVA] ch.16 컬렉션 프레임워크, List, Set, Map, 제네릭, Iterator
배열 특징
- 크기를 지정해야한다.
- 크기 변경이 불가능 하다.
- index를 이용해 데이터를 저장해야 한다.
자료구조
- 여러 데이터를 담을 수 있는 구조
- 프로그램 실행 시 메모리에 자료를 유지하고 관리하기 위해 사용한다.
컬렉션 프레임워크
- 컬렉션 : 리스트, 큐, 트리 등의 자료구조를 뜻한다
- 프레임워크 : 인터페이스와 클래스를 묶어놓은 개념
- 기존에 존재했던 자료구조에 인터페이스로 설계된 기능을 클래스를 통해 제공해 자료 구조 객체를 구조화한 것
제네릭
- 클래스가 다루어야할 객체 타입을 객체 선언 시 내부가 아닌 외부에서 지정하여 관리할 수 있는 기술
- 제네릭에 쓰는 데이터 타입은 Wrapper 클래스로 쓴다.
- 제네릭 선언 : <>
public class 클래스명<T>{}
public interface 인터페이스명<T>{}
- 타입 변수
- <T> : Type
- <E> : Element
- <K> : Key
- <N> : Number
- <V> : Value
List 컬렉션
- 배열과 유사한 구조로 중복을 허용하고, 저장 순서가 유지된다.
- 배열과 차이점은 크기의 제한이 없고 삽입, 삭제, 변경이 자유롭다.
- 다양한 데이터 타입을 저장할 수 있다.
- List 인터페이스를 생성해 기능을 정의하고 하위 클래스에서 구현하도록 한다.
- 클래스 : ArrayList, LinkedList 등
선언 방법
1. List<데이터타입> list = new ArrayList<>();
List<데이터타입> list = new LinkedList<>();
2. ArrayList<데이터타입> list = new ArrayList<>();
- ArrayList는 List 인터페이스를 구현한 클래스로 1번처럼 선언한 경우 인스턴스를 ArrayList와 LinkedList로 받을 수 있다.
- 2번처럼 선언한 경우 ArrayList의 인스턴스로 만들었기 때문에 ArrayList만 받는다.
List<Integer> list1 = new ArrayList<Integer>();
list4 = new LinkedList<Integer>();
ArrayList<Integer> list2 = new ArrayList<Integer>();
//list5 = new LinkedList<Integer>(); 오류
주요 메서드
//추가
list.add(1);
//중간 삽입(그자리에 넣고 뒤로 밀림)
list.add(3,10);
//치환
list.set(0, 5);
//반환
list.get(0, 5);
/* 삭제
* - 값만 삭제되는 것이 아니라 값이 있던 공간도 삭제됨
* - 뒤에 데이터들이 하나씩 밀린다 / 배열은 공간은 안지워지고 값만 지워짐)
* - 중복된 데이터의 경우 처음 인덱스에 저장된 값만 삭제된다.
*/
list.remove(4);
list.remove("삭제");
List<String> rList = new ArrayList<String>(Arrays.asList("C"));
list.removeAll(rlist); //C모두 삭제
//전체삭제
list.clear();
//크기
list.size
ArrayList
- 배열을 이용해 구현 => 단순 삽입 삭제에 용이하다.
선언 (기본 자료형의 경우 데이터 타입에 Wrapper클래스를 이용한다.)
1. List<데이터타입> list = new ArrayList<>();
2. ArrayList<데이터타입> list = new ArrayList<>();
데이터 추가 방식
- 데이터 중간 삽입 시 기존 데이터가 하나씩 뒤로 밀리고 그 자리에 추가된다.
- 빈 공간에는 삽입이 불가능하다. (존재하는 위치이거나 마지막 다음에 삽입)
LinkedList
- 데이터와 다음 데이터의 주소를 가지는 노드 객체가 연결되어 데이터를 저장하는 자료구조
- node 객체를 생성해 인접 데이터를 링크해서 체인처럼 관리한다
- 선언 (부모 타입으로 선언하거나 자신 타입으로 선언함)
List<데이터타입> list = new LinkedList<>();
LinkedList<데이터타입> list = new LinkedList<>();
//선언과 동시에 초기화
LinkedList<Integer> list2 = new LinkedList<Integer>(Arrays.asList(1,2));
데이터 추가 방식
- 기존에 연결된 링크를 끊고 추가되는 데이터의 주소를 연결한다.
ArrayList VS LinkedList
- 요소의 추가, 삭제, 검색 등의 작업에 따라 성능 특성이 다름
- 요소의 추가와 삭제가 자주 발생한다 => LinkedList
- 요소의 접근이 자주 필요한 경우(검색) => ArrayList
Set 컬렉션
- 중복을 허용하지 않고 순서가 없다.
- 클래스 : HashSet, TreeSet, LinkedHashSet(순서 있음)
- 주요 메서드
//추가
set.add(1);
//삭제
set.remove(1);
//전체 삭제 : 객체의 형태는 남겨두고 내용만 삭제 (출력 : [])
set.clear();
//크기
set.size();
//존재 여부
set.contains(1);
List와 다르게 중간 삽입, 치환, 중간 삭제가 없는데 순서를 모르기 때문이다.
HashSet
- 중복을 허용하지 않기 때문에 hashCode와 equals를 오버라이드해 객체를 비교해야 한다.
- 선언 방법
Set <데이터타입> set = new HashSet<>();
Map컬렉션
- key(키), value(값)으로 구분해 데이터를 저장하는 방식
- 순서가 없다
- key의 중복을 허용하지 않는다. value는 중복이 가능하다.
- 만약 key가 중복되면 마지막 value값으로 치환된다.
- Entry( key-value )는 Map인터페이스의 내부 클래스다.
- 검색을 요구하는 데이터를 처리하기에 적합하다.
- HashMap은 순서 보장x, LinkedHashMap은 순서가 보장된다.
주요 메서드
//값 저장
map.put(key,v)
//key에 해당하는 value값 반환/ key값 반환/ Value값 반환
map.get(key); map.getKey(); map.getValue();
//key존재 여부 검색
map.containsKey(key)
//value존재 여부 검색
map.containsKey(key)
//모든 key반환
map.keySet()
//모든 Map.Entry객체 Set으로 반환
map.entrySet()
HashMap
- hashSet과 동일하게 hashCode와 equals를 오버라이드해 중복 여부를 판단한다.
- null 허용
- 단일 스레드 환경에서 사용하기 좋은 자료구조
- 선언 방법
Map<Key, Value> map = new HashMap<>();
HashMap<Key, Value> map = new HashMap<>();
Hashtable
- null 허용하지 않는다.
- 멀티 스레드 환경에서 사용하기 좋은 자료구조
Map<Key, Value> map = new Hashtable<>();
Hashtable<Key, Value> map = new Hashtable<>();
LinkedHashMap
- 순서가 있다.
- http 통신에 사용된다.
반복자 Iterator
- List컬렉션에서 제공하는 인터페이스
- List컬렉션의 요소를 순회하여 하나씩 추출하는데 사용한다.
- boolean hashNext() : 다음에 순회할 데이터 유무 확인, 가져올 객체가 있으면 true, 없으면 false를 반환
- E next() : 다음 위치의 데이터로 이동하여 반환
//리스트 출력
List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4));
Iterator<Integer> intIter = list.iterator();
while(intIter.hasNext()) {
System.out.println(intIter.next());
}
//set출력
Set<Integer> set = new HashSet<>(list);
Iterator<Integer> setIter = set.iterator();
while(setIter.hasNext()) {
System.out.println(setIter.next());
}