배열은 기본타입 뿐만 아니라 객체 참조 타입의 배열도 만들 수 있습니다.
하지만 배열은 선언 시 크기가 고정되고 저장, 삭제, 추가하는 메소드가 없어서 불편한 점이 많습니다.
이런 배열이 가지는 불편함을 해결하기 위해 자바는 컬렉션 프레임워크를 제공합니다.
자바의 자료구조
자바는 널리 알려져있는 자료구조를 사용해서 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 인터페이스와 구현 클래스를 java.util 패키지에 제공합니다.
이것들을 컬렉션 프레임워크라고 부릅니다.

컬렉션 프레임워크 주요 인터페이스로 List, Set, Map이 있습니다. 그리고 이 인터페이스들은 컬렉션 클래스를 사용하는 방법을 정의한 것입니다.
List 컬렉션
List 컬렉션은 배열과 비슷하게 객체를 인스턴스로 관리합니다.
< 특징 >
1. 저장 용량이 자동으로 증가
2. 객체를 저장할 때 자동인덱스 부여
3. 추가, 삭제, 검색을 위한 다양한 메소드 제공
< 주요 메소드 >
객체 추가
boolean add - 주어진 객체를 맨 끝에 추가 합니다.
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) - 주어진 객체를 삭제합니다.
List 컬렉션 - ArrayList
ArrayList는 List 인터페이스의 대표적인 구현 클래스입니다.
(List == 인터페이스), (ArrayList == 구현클래스)

기본 생성자로 ArrayList 객체를 생성하면 내부에 10개의 초기용량을 갖습니다.
ArrayList에서 특정 인덱스의 객체를 제거하면 바로 위 인덱스 부터 마지막 인덱스까지 모두 앞으로 1씩 당겨집니다.
마찬가지로 특정 인덱스에 객체를 삽입하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 밀려납니다.
* 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList를 사용하지 않는 것이 좋습니다.
ArrayList는 인덱스를 활용해서 객체를 찾거나, 요소를 추가할 때 맨 마지막에만 추가하는 경우에 좋은 성능을 발휘합니다.
List 컬렉션 - Vector
Vector는 ArrayList와 동일한 내부 구조를 갖습니다. 둘의 차이점은 동기화 여부입니다.

멀티 스레드가 동시에 Vector의 메소드들을 실행할 수 없고, 하나의 스레드가 메소드를 실행완료 해야만 다른 스레드가 실행할 수 있습니다.
즉, Vector는 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있습니다
List 컬렉션 - LinkedList
ArrayList와 사용방법은 동일하나 데이터를 보관하는 내부 구조가 다릅니다
ArrayList는 내부 배열에 객체를 저장해서 관리하고 LinkedList는 인접 참조를 링크해서 체인처럼 관리합니다.

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

특정 인덱스에 객체를 삽입할 때에도 마찬가지 입니다.
빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList보다 LinkedList가 더 좋은 성능을 발휘합니다.
ArrayList vs LinkedList

Set 컬렉션
Set 컬렉션에는 HashSet, LinkedSet, TreeSet 등이 있습니다.
Set은 순서가 없어서 인덱스가 없고 때문에 인덱스 관련된 메소드가 없습니다.
< 특징 >
1. List 컬렉션의 객체의 저장 순서를 유지하지만, Set 컬렉션은 저장 순서가 유지되지 않습니다.
2. 또한 객체를 중복해서 저장할 수 없습니다. null도 하나만 저장됩니다.

Set 컬렉션은 수학의 집합과 유사합니다. 집합은 순서와 상관없고 중복을 허용하지 않기 때문입니다.
< 주요 메소드 >
객체 추가
boolean add(E e) - 주어진 객체를 저장하고 객체가 성공적으로 저장되면 true를 리턴, 중봅 객체면 false를 리턴.
객체 검색
boolean contains(Object o) - 주어진 객체가 저장되어 있는지 조사합니다.
boolean isEmpty() - 컬렉션이 비어 있는지 조사합니다.
Iterator<E> iterator - 저장된 객체를 한 번씩 가져오는 반복자를 리턴합니다.
int size() - 저장되어 있는 전체 객체 수를 리턴합니다.
객체 삭제
void clear() 저장된 모든 객체를 삭제합니다.
boolean remove(Object o) 주어진 객체를 삭제합니다.
Iterator
Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없습니다.
대신 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)를 제공합니다.
반복자는 Iterator 인터페이스를 구현한 객체를 말하며, iterator() 메소드를 호출하면 얻을 수 있습니다.
< 주요 메소드 >
boolean hasNext() - 가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴합니다.
E next() - 컬렉션에서 하나의 객체를 가져옵니다.
void remove() - Set 컬렉션에서 객체를 제거합니다.
Set 컬렉션 - HashSet
기본 생성자 호출
Set<E> set = new HashSet <E>();
< HashSet의 원리 >
1. HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서 해시코드를 얻습니다.
2. 이미 저장되어 있는 객체들의 해시코드와 비교합니다.
3. 만약 동일한 해시코드가 있다면 다시 equals() 메소드로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장하지 않습니다

Map 컬렉션
Map 컬렉션은 키(Key)와 값(Value)로 구성된 "Map.Entry" 객체를 저장하는 구조를 가지고 있습니다.
Entry는 Map 인터페이스 내부에 선언된 중첩 인터페이스입니다.
여기서 키와 값은 모두 객체입니다.
키는 중복으로 저장될 수 없지만 값은 중복 저장할 수 있습니다.
만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존의 값은 없어지고 새로운 값으로 대체됩니다.

Map 컬렉션에는 HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 있습니다.
다음은 Map 컬렉션에서 공통적으로 사용가능한 Map 인터페이스의 메소드들 입니다.
키로 관리하기 때문에 키를 매개값으로 갖는 메소드가 많습니다.
< 주요 메소드 >
객체 추가
V put(K key, V value) - 주어진 키로 값을 저장합니다. 새로운 키일 경우 null을 리턴하고 동일한 키가 있을 경우 값을 대체하고 이전 값을 리턴합니다.
객체 검색
boolean containsKey(Object Key) - 주어진 키가 있는지 여부를 확인합니다.
boolean conatinsValue(Object Value) - 주어진 값이 있는지 여부를 확인합니다.
Set<Map.Entry<K,V>> entrySet() - 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴합니다.
V get(Object key) - 주어진 키가 있는 값을 리턴합니다.
boolean isEmpty() - 컬렉션이 비어있는지 여부를 확인합니다.
Set<K> keySet() - 모든 키를 Set 객체에 담아서 리턴합니다.
int size() - 저장된 키의 총 수를 리턴합니다.
Collection<V> values() - 저장된 모든 값을 Collection에 담아서 리턴합니다.
객체 삭제
void clear() - 모든 Map.Entry(키, 값)을 삭제합니다.
V remove(Object key) - 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴합니다.
'🧮Programming > Java' 카테고리의 다른 글
| [Java] 예외 처리 (0) | 2024.02.06 |
|---|---|
| [Java] 추상 클래스, 인터페이스 (1) | 2024.02.06 |
| [Java] 상속, 다형성 (0) | 2024.02.06 |
| [Java] 패키지와 접근 제한자 (0) | 2024.02.06 |
| [Java] 객체와 클래스 (0) | 2024.02.06 |