(1) 설명

(2) List - List컬렉션, ArrayList, Vector, LinkedList 사용법

(3) Set - Set 컬렉션 사용법

(4) Map - Map 컬렉션, HashMap, Hashtable 사용법

(5) 검색기능을 강화시킨 컬렉션 - TreeSet, TreeMap 사용법

(6) 기본 컬렉션 - Stack, Queue 사용법

(7) 동기화된 컬렉션, 병렬 처리를 위한 컬렉션

(8) 스레드 풀

 

 

 

1.

List는 객체를 일렬로 늘어놓은 구조를 가지고 있습니다.


객체를 인덱스로 관리하기 때문에 객체를 저장하면 자동 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공합니다.

List 컬렉션은 객체 자체를 저장하는 것이 아니라 다음 그림과 같이 객체의 번지를 참조합니다.

 

동일한 객체를 중복 저장할 수 있는데, 이 경우 동일한 번지가 참조됩니다.

 

null도 저장이 가능한데, 이 경우 해당 인덱스는 객체를 참조하지 않습니다.



 


 

 

 

2. List

List 컬렉션에는 ArrayList, Vector, LinkedList 등이 있는데, 다음은 List 컬렉션에서 공통적으로 사용 가능한 List 인터페이스의 메소드들입니다. 

앞의 표에서 메소드의 파라미터 타입과 리턴 타입에 E라는 타입 파라미터가 있는데,

이것은 List 인터페이스가 제네릭 타입이기 때문입니다.

 

 

객체 추가는 add() 메소드를 사용하고, 객체를 찾아올 때는 get() 메소드를 사용합니다.

그리고 객체 삭제는 remove() 메소드를 사용합니다.

다음은 List 컬렉션에 저장되는 구체적인 타입을 String으로 정해놓고 추가, 삽입, 찾기 그리고 삭제를 하는 방법을 보여줍니다.

 

만약 전체 객체를 대상으로 하나씩 반복해서 저장된 객체를 얻고 싶다면 다음과 같이 for문을 사용할 수 있습니다.

 

인덱스 번호가 필요 없다면 향상된 for 문을 이용하는 것이 더욱 편리합니다.



 

 


 

 

 

3. ArrayList

ArrayList는 List 인터페이스의 구현 클래스로, ArrayList에 객체를 추가하면 객체가 인덱스로 관리됩니다.

 

일반 배열과 ArrayList는 인덱스로 객체를 관리한다는 점에서는 유사하지만, 큰 차이점을 가지고 있습니다.

 

배열은 생성할 때 크기가 고정되고 사용 중에 크기를 변경할 수 없지만,

ArrayList는 저장 용량(capacity)을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어난다는 점입니다.

예)

 

- 참고 -

  ArrayList를 생성하고 런타임 시 필요에 의해 객체들을 추가하는 것이 일반적이지만, 고정된 객체들로 구성된 List를 생성할 때도 있습니다.

 

  이러한 경우에는 Arrays.asList(T.. a) 메소드를 사용하는 것이 간편합니다.

T 타입 파라미터에 맞게 asList() 의 파라미터를 순차적으로 입력하거나, T[] 배열을 파라미터로 주면 됩니다. 다음은 고정된 String 객체를 요소로 갖는 ArrayList 객체를 생성합니다.



- ArrayList 간단 설명 -

1. add(인덱스, 값);

2. add(값);

3. 값 알아내는 방법 -> array.get(인덱스);

4. remove(인덱스);

5. 모두 삭제 -> array.clear();

 

 

 


 

 

4. Vector

Vector는 ArrayList와 동일한 내부 구조를 가지고 있습니다.

주의!

ArrayList와 다른 점은 Vector는 동기화된(synchronized) 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 이 메소드들을 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있습니다.

다음은 Vector를 이용해서 Board 객체를 추가, 삭제, 검색하는 예제입니다.

위 코드 설명 -> 

결과가 왜 1,2,4가 나왔냐면

list.remove(2) 하면 인덱스3번째가 없어지고

그 상태에서 한 번더

list.remove(3) 하면 인덱스4번째가 없어지니깐

결과가 1,2,4가 나온거 입니다

 

 

- 벡터(Vector) 간단 설명 -

1. add(인덱스,값)

2. remove(인덱스)

3. 백터 안의 들어 있는 값 개수 -> v.size();

4. 벡터 전체 용량(개수) -> v.capacity();

5. 벡터 안에 들어 있는 값 구하기 ->

Integer obj = v.get(0);  // 벡터가 Integer형인 경우

String obj = v.get(0);   // 벡터가 String 형인 경우

6. 벡터 안에 맨 마지막 값 -> v.lastElement();

7. 벡터  안에 모두 삭제 -> v.removeAllElements();

 

 

 

 

 


 

 

 

5. LinkedList

 LinkedList는 List 구현 클래스이므로 ArrayList와 사용 방법은 똑같지만 내부 구조는 완전 다릅니다.

 ArrayList는 내부 배열에 객체를 저장해서 인덱스로 관리하지만, LinkedList인접 참조를 링크해서 체인처럼 관리합니다.

 LinkedLIst에서 특정 인덱스의 객체를 제거하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않습니다.

특정 인덱스에 객체를 삽입할 때에도 마찬가지입니다.

ArrayList는 중간 인덱스의 객체를 제거하면 뒤의 객체는 인덱스가 1씩 앞으로 당겨진다고 했습니다.

그렇기 때문에 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 LinkedList가 좋은 성능을 발휘합니다.  

(계속 바뀌며는!!! LinkedList 사용해라)

 

LinkedList를 생성하기 위해서는 저장할 객체 타입을 타입 파라미터(E)에 표기하고 기본 생성자를 호출하면 됩니다.

LinkedList가 처음 생성될 때에는 어떠한 링크도 만들어지지 않기 때문에 내부는 비어 있다고 보면 됩니다.


다음 예제는 ArrayList와 LinkedList에 10000개의 객체를 삽입하는데 걸린 시간을 측정한 것입니다.

 

 

 

 

 

 

 

 

끝에서부터(순차적으로) 추가/삭제하는 경우는 ArrayList가 빠르지만,
중간에 추가 또는 삭제할 경우는 앞뒤 링크 정보만 병경하면 되는 LinkedList가 더 빠릅니다.