컬렉션이란?

자바에서 자료 구조를 구현한 클래스들을 칭하는 용어.( 리스트, 스택, 큐, 집합, 해쉬 테이블)


|컬렉션의 종류

자바는 컬렉션 인터페이스와 컬렉션 클래스로 나누어서 제공.


인터페이스

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

+ Recent posts