컬렉션이란?
자바에서 자료 구조를 구현한 클래스들을 칭하는 용어.( 리스트, 스택, 큐, 집합, 해쉬 테이블)
|컬렉션의 종류
자바는 컬렉션 인터페이스와 컬렉션 클래스로 나누어서 제공.
인터페이스
1. Collection : 모든 자료 구조의 부모 인터페이스로서 객체의 모임을 나타낸다.
2. Set : 집합을 나타내는 자료 구조
3. List : 순서가 있는 자료 구조로 중복된 원소를 가질 수 있다.
4. Map : 키와 값들이 연관되어 있는 사전과 같은 자료 구조
5. Queue : 극장에서의 대기줄과 같이 들어온 순서대로 나가는 자료구조
ArrayList
|List 인터페이스
리스트는 순서를 가지는 원소들의 모임으로 중복된 원소를 가질 수 있다.
ArrayList, Vector : List를 배열로 구현한 것
LinkedList : List를 연결 리스트로 구현한 것
|ArrayList
사용 이유 : 배열의 문제점은 배열을 생성할 때 배열의 크기가 고정된다는 점, 반면 ArrayList는 자동적으로 크기가 변경.
#기본생성 ex) ArrayList<String> list = new ArrayList<String>( );
#데이터 저장 ex) list.add("milk");
#인데스 위치에 저장 ex) list.add( 1, "APPLE");
#특정한 위치에 있는 원소 바꿈 ex) list.set( 2, "GRAPE");
#데이터를 삭제 ex) list.remove( 3 );
#인덱스 위치의 값 가져옴 ex) String s = list.get( 1 );
#현재 저장된 원소의 개수 ex) list.size( );
#특정한 데이터가 저장된 위치 ex) int index = list.indexOf("APPLE");
|반복자 사용하기
#hasNext( ) : 아직 방문하지 않은 원소가 있으면 true를 반환
#next( ) : 다음 원소를 반환
#remove( ) : 최근에 반환된 원소를 삭제
반복자를 사용하기 위해서는 먼저 ArrayList의 iterator( ) 메소드를 호출하여서 반복자 객체를 얻는다.
ex) Iterator e = list.iterator( );
LinkedList
사용 이유 : ArrayList의 경우 중간에서 데이터의 삽입이나 삭제가 발생하는 경우 원소를 이동시켜야 한다. 따러서 연결 리스트로 구현된LinkedList가 사용됨
메소드는 ArrayList와 동일
|배열을 리스트로 변경하기
List<String> list = Arrays.asList(new String[size]);
SET
집합은 순서가 없고 중복을 허용하지 않음.
가장 잘 알려진 방법이 해쉬 테이블
해쉬 테이블 : 각각의 원소에 대하여 해쉬 코드란 정수를 계산한다. 만약 클래스 작성자라면 반드시 hashCode( )도 구현해야됨
HashSet : 해쉬 테이블에 원소를 저장
TreeSet : 레드 - 블랙 트리에 원소를 저장
LinkedHashSet : 해쉬 테이블과 연결 리스트를 결합
<HashSet 예제>
출력결과
<집합을 이용한 중복된 단어 검출>
출력결과
|대량 연산 메소드
s1.containsAll(s2) : 만약 s2가 s1의 부분 집합이면 참
s1.addAll(s2) : s1을 s1과 s2의 합집합
s1.retainAll(s2) : s1을 s1과 s2의 교집합
s1.removeAll(s2) : s1을 s1과 s2의 차집합
집합 연산을 할 때 중요한 점은 원집합이 파괴되면 안되다는 것이다. 따라서 집합 연산을 수행하기 전에 복사본을 만들어야 한다.
<집합 연산을 이용한 예제>
출력결과
Queue
: 후단에서 원소를 추가하고 전단에서 원소를 삭제한다. Queue 인터페이스는 LinkedList 클래스와 PriorityQueue 클래스로 구현
: 디큐(deque)는 전단과 후단에서 모두 원소를 추가하거나 삭제할 수 있다. deque 인터페이스는 ArrayDeque와 LinkedList 클래스들로 구현
|Queue 인터페이스
public interface Queue<E> extends Collection<E>{
E element( ); // 처음에 있는 원소 가져옴(삭제하지않음)
boolean offer(E e);
E peek( ); // 처음에 있는 원소 가져옴(삭제하지않음)
E poll( ); // 처음에 있는 원소 가져옴(삭제)
E remove( ); //처음에 있는 원소 가져옴(삭제)
}
<큐에 저장된 정수값을 1초간격으로 출력>
->LinkedList클래스로 큐를 생성하고 0~10까지 큐에 저장한다.
->큐가 비었는지 확인하고 비어있지 않다면 뒤에서 부터 하나씩 삭제해서 출력한다.
|우선순위큐
: 원소들이 무작위로 삽입되었더라도 정렬된 상태로 원소들을 추출, 즉 remove()를 호출할 때마다 가장 작은 원소가 추출된다.(ex, 작업스케줄링)
: 히프라고 하는 자료 구조를 내부적으로 사용
<우선순위 큐 예제>
출력결과
->PriorityQueue클래스로 큐객체를 생성한후 30, 80, 20을 추가
->우선순위 큐의 원소를 출력
->큐가비어있을때까지 우선순위 큐의 원소를 삭제하면서 출력 이때 가장 작은 원소 순으로 출력
Map
: 많은 데이터 중에서 원하는 데이터를 빠르게 찾을 수 있는 자료구조. 사전관 같은 자료구조이다. 즉 사전처럼 단어가 있고(키) 단어에 대한 설명(값)이있다. Map은 중복된 키를 가질 수 없다. 각 키는 오직 하나의 값에만 매핑될 수 있다.
:HashMap, TreeMap, LinkedHashMap 3가지의 클래스가 제공. 만약 키들을 정렬된 순서로 방문할 필요가 없다면 HashMap.
ex)
Map<String, Student> freshman = new HashMap<String, Student>( ); //생성
Student kim = new Student("구준표");
freshman.put("20090001", kim); // 저장
String s = "20090001";
st = freshman.get(s); // 구준표 반환
<맵을 이용한 학생자료 예제>
출력결과
->HashMap클래스를 이용해 st라는 맵객체를 만들었다 ( 키 - 문자열, 값 - Student)
->"201113511"라는 키를 가진 정보를 삭제하고 새로 삽입하였다.
->Map에 저장된 데이터를 방문하기 위해 Map.Entry라는 인터페이스를 사용하였고 모든 값을 출력하였다.
<Map 기본적인 연산 예제>
출력결과
-> HashMap클래스를 이용해서 Map객체 m생성
-> sample배열에 있는 값을 가져와 m객체의 빈도를 가져온다 빈도가 null이면 1 아니면 1증가시킨다.
-> MAP m의 값 출력
'Programming Language > Java' 카테고리의 다른 글
6. 입출력-바이트스트림 (0) | 2016.06.08 |
---|---|
5. 스레드 (0) | 2016.06.08 |
4. 예외처리 (0) | 2016.06.08 |
3. Collections클래스 (0) | 2016.06.08 |
1. 제네릭 (0) | 2016.06.07 |