- 컬렉션 프레임워크(Collection Framework) :자료구조를 사용해서 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 인터페이스와 구현 클래스를 java.util 패키지에서 제공하는 것
- 컬렉션 : 객체의 저장을 의미
- 프레임워크 : 사용 방법을 정해놓은 라이브러리를 의미
- 컬렉션 프레임워크의 주요 인터페이스로는 List, Set, Map이 있다.
List 컬렉션
- List 컬렉션은 배열과 비슷하게 객체를 인덱스로 관리한다.
- 배열과의 차이점은 저장 용량(capacity)이 자동으로 증가하며, 객체를 저장할 때 자동 인덱스가 부여된다는 점이다.
- 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조한다는 특징이 있다.
- 그렇기 때문에 동일한 객체를 중복 저장할 수 있는데, 이 경우 동일한 번지가 참조된다.
< List 컬력션에서 공통으로 사용 가능한 List 인터페이스의 메소드 >
기능 | 메소드 | 설명 |
객체 추가 | boolean add(E e) | 주어진 객체를 맨 끝에 추가합니다. |
void add(int index, E element) | 주어진 인덱스에 객체를 추가합니다. | |
E set(int index, E element) | 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿉니다. | |
객체 검색 | boolean contains(Object o) | 주어진 객체가 저장되어 있는지 조사합니다. |
E get(int index) | 주어진 인덱스에 저장된 객체를 리턴합니다. | |
boolean isEmpty() | 걸렉션이 비어 있는지 조사합니다. | |
int size() | 저장되어 있는 전체 객체 수를 리턴합니다. | |
객체 삭제 | void clear() | 저장된 모든 객체를 삭제합니다. |
E remove(int index) | 주어진 인덱스에 저장된 객체를 삭제합니다. | |
boolean remove(Object o) | 주어진 객체를 삭제합니다. |
※ 위의 표에서 E라는 타입 파라미터는 저장되는 개체의 타입을 List 컬렉션을 생성할 때 결정하라는 뜻
ArrayList
- List<String> list = new ArrauList< >( );
- 기본 생성자로 ArrayList 객체를 생성하면 내부에 10개의 객체를 저장할 수 있는 초기 용량을 가지게 된다.
- ArrayList에서 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다. 마찬가지로 특정 인덱스에 객체를 삽입하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 밀려난다.
- 따라서 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList를 사용하는 것 보다 LinkedList를 사용하는 것이 좋다.
- 반면, 인덱스를 이용해서 객체를 찾거나 맨 마지막에 객체를 추가하는 경우는 ArrayList가 더 좋은 성능을 발휘한다.
Vector
- List<E> list = new Vector<E>( );
- ArrayList와 다른 점은 Vector는 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 Vector의 메소드를 실행할 수 없고, 하나의 스레드가 메소드 실행을 완료해야만 다른 스레드가 메소드를 실행할 수 있다는 점이다.
- 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있다. = 스레드 안전(thread safe)
LinkedList
- ArrayList는 내부 배열에 객체를 저장해서 관리하지만, LinkedList는 인접 참조를 링크해서 체인처럼 관리한다.
- List<E> list = new LinkedList<>( );
- 특정 인덱스의 객체를 제거하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않는다.
- 끝에서부터(순차적으로) 추가 또는 삭제하는 경우는 ArrayList가 빠르지만, 중간에서 추가나 삭제하는 경우는 앞뒤 링크 정보만 변경되는 LinkedList가 더 빠르다.
Set 컬렉션
- List 컬렉션은 객체의 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않는다.
- 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있다.
- Set 컬렉션에는 HashSet, LinkedHashSet, TreeSet 등이 있다.
- 인덱스로 관리하지 않기 때문에 인덱스를 매개값으로 갖는 메소드가 없다.
< Set 인터페이스의 메소드 >
기능 | 메소드 | 설명 |
객체 추가 | boolean add(E e) | 주어진 객체를 저장합니다. 객체가 성공적으로 저장되면 true를 리턴하고 중복 객체면 false를 리턴합니다. |
객체 검색 | boolean contains(Object o) | 주어진 객체가 저장되어 있는지 조사합니다. |
boolean isEmpty() | 컬렉션이 비어있는지 조사합니다. | |
lterator<E> iterator() | 저장된 객체를 한 번씩 가져오는 반복자를 리턴합니다. | |
int size() | 저장되어 있는 전체 객체 수를 리턴합니다. | |
객체 삭제 | void clear() | 저장된 모든 객체를 삭제합니다. |
boolean remove(Object o) | 주어진 객체를 삭제합니다. |
- Set<String> set = ...;
- Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없기 때문에, 대신 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자 Iterator를 제공한다.
- Iterator<String> iterator = set.iterator( );
< Iterator 인터페이스에 선언된 메소드 >
리턴 타입 | 메소드 | 설명 |
boolean | hasNext() | 가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴한다. |
E | next() | 컬렉션에서 하나의 객체를 가져온다. |
void | remove() | Set 컬렉션에서 객체를 제거한다. |
while(iterator.hasNext()){ //저장된 객체수 만큼 루핑
String str = iterator.next(); //String 객체 하나를 가져옴
if(str.equals("지니")){
iterator.remove(); //객체를 제거
}
}
HashSet
- Set<E> set = new HashSet<E>();
- 객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않음
- 객체를 저장하기 전에 먼저 객체의 hashCode()메소드를 호출해서 해쉬코드를 얻어내고, 이미 저장되어 있는 객체들의 해시코드와 비교한다. 만약 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장을 하지 않는다.
- 문자열을 저장할 경우, 같은 문자열을 갖는 String 객체는 동등한 객체로 간주된다.
Map 컬렉션
- key(키) 와 value(값)로 구성된 Map.Entry 객체를 저장하는 구조로 Entry는 Map 인터페이스 내부에 선언된 중첩 인터페이스이다.
- 키와 값은 모두 객체이다.
- 키는 중복 저장될 수 있지만, 값은 중복 저장될 수 없다.
- 만약 기존에 저자된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대체된다.
- HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 있다.
< Map 컬렉션의 메소드 >
기능 | 메소드 | 설명 |
객체 추가 | V put(K ket, V value) | 주어진 키로 값을 저장합니다. 새로운 키일 경우 null을 리턴하고 동일한 키가 있을 경우 값을 대체하고 이전 값을 리턴합니다. |
객체 검색 | boolean containsKey(Object key) | 주어진 키가 있는지 여부를 확인합니다. |
boolean containsValue(Object value) | 주어진 값이 있는지 여부를 확인합니다. | |
Set<Map.Entry<K,V>> entrySet() | 키와 값이 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴합니다. | |
V get(Object key) | 주어진 키가 있는 값을 리턴합니다. | |
booleab isEmpty() | 컬렉션이 비어있는지 여부를 확인합니다. | |
Set<K> keySet() | 모든 키를 Set객체에 담아서 리턴합니다. | |
int size() | 저장된 키의 총 수를 리턴합니다. | |
Collection<V> value() | 저장된 모든 값을 Collection에 담아서 리턴합니다. | |
객체 삭제 | void clear() | 모든 Map.Entry(키와 값)를 삭제합니다. |
V remove(Object key) | 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴합니다. |
HashMap
- HashMap의 키로 사용할 객체는 hashCode()와 equals()메소드를 재정의해서 동등 객체가 될 조건을 정해야 한다.
- 객체가 달라도 동등 객체라면 같은 키로 간주하고 중복 저장되지 않도록 하기 위함이다.
- 키와 값의 타입은 기본타입을 사용할 수 없고 클래스 및 인터페이스 타입만 사용 가능하다.
- 키로 String 타입을 사용하고 값으로 Integer타입을 사용하는 HashMap은 다음과 같이 생성할 수 있다.
- Map<String, Integer> map = new HashMap<>();
Hashtable
- HashMap과의 차이점은 Hashtable은 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 Hashtable의 메소드를 실행할 수 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다는 것
- 멀티스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있기 때문에 Hashtale은 스레드에 안전하다.
- Map<String, Integer> map = new Hashtable<>();
'Coding > Java' 카테고리의 다른 글
[32] JAVA 입출력 스트림 (0) | 2022.12.28 |
---|---|
[31] JAVA LIFO와 FIFO 컬렉션 (0) | 2022.12.25 |
[29] JAVA 스레드 제어 (0) | 2022.12.21 |
[28] JAVA 멀티스레드 (0) | 2022.12.21 |
[27] JAVA 기초 복습 (0) | 2022.12.14 |