728x90
반응형
SMALL

컬렉션 프레임워크

 

인터페이스 분류 특징 구현 클래스
Collection List - 순서를 유지하고 저장
- 중복 저장 가능
ArrayList, Vector,
LinkedList
Set - 순서를 유지하고 저장
- 중복 저장 불가능
HashSet, TreeSet
Map - 키와 값으로 구성된 엔트리 저장
- 키는 중복 저장 안됨
HashMap, Hashtable,
TreeMap, Properties

 

List 컬렉션

List컬렉션은 인덱스로 관리한다.

기능 메소드 설명
객체
추가
boolean add(E e) 주어진 객체를 맨 끝에 추가
void add(int index, E element) 주어진 인덱스에 객체를 추가
set(int index, E element) 주어진 인덱스의 객체를 새로운 객체로 바꿈
객체
검색
boolean contains(Object o) 주어진 객체가 저장되어 있는지 여부
E get(int index) 주어진 인덱스에 저장된 객체 리턴
isEmpty() 컬렉션이 비어있는지 검사
int size() 저장되어 있는 전체 객체 수 리턴
객체
삭제
void clear() 저장된 모든 객체 삭제
E remove(int index) 주어진 인덱스에 저장된 객체 삭제
boolean remove(Object o) 주어진 객체를 삭제

 

ArrayList

- List컬렉션 중 가장 많이 사용

- ArrayList에 add로 객체 추가 시 배열에 객체가 저장되며, 일반 배열과 달리 길이 제한이 없다.

- 객체 자체가 아닌 객체의 번지를 저장한다. 동일한 객체 저장도 가능하며, 동일한 번지가 저장된다.

//생성방법
ArrayList<E> list = new ArrayList<E>(); //지정된 E타입 객체만 저장 가능
ArrayList<E> list = new ArrayList<>(); //지정된 E타입 객체만 저장 가능
ArrayList list = new ArrayList(); //모든 타입 객체 저장 가능

* 특정 index 객체를 제거하면 바로 뒤부터 끝까지 모두 앞으로 한 칸씩 당겨진다.

* 특정 index에 객체를 추가하면 해당 인덱스부터 끝까지 뒤로 한 칸씩 밀려진다.

 

Vector

ArrayList와 동일한 내부 구조를 가졌지만 Vector는 동기화된 메소드로 구성되어 있어 멀티 스레드가 동시에 Vector() 메소드를 실행할 수 없다.

=> 멀티 스레드 환경에서 안전하게 객체 추가/삭제가 가능하다.

//생성 방법
List<E> list = new Vector<E>(); //E타입 객체만 저장
List<E> list = new Vector<>(); //E타입 객체만 저장
List<> list = new Vector<>(); //모든 타입 객체 저장

=>코드에 여러 스레드가 있어 thread1.start(); thread2.start();해도 한 번에 하나의 스레드만 실행시킨다.

 

LinkedList

LinkedList는 ArrayList와 사용 방법은 동일하지만 내부 구조는 완전히 다르다. ArrayList는 배열에 객체를 저장하지만, LinkedList는 인접 객체를 체인처럼 연결해서 관리한다.

- 특정 위치에서 객체를 삽입/삭제하면 바로 앞 뒤 링크만 변경되므로 빈번한 삽입/삭제에서는 ArrayList보다 좋다.

 

//생성 방법
List<E> list = new LinkedList<E>(); //E타입 객체만 저장
List<E> list = new LinkedList<>(); //E타입 객체만 저장
List<> list = new LinkedList<>(); //모든 객체 저장

 

Set 컬렉션

List와 달리 Set은 저장 순서가 유지되지 않는다. 또한 객체를 중복해서 저장할 수 없고, 하나의 null만 저장할 수 있다.

기능 메소드 설명
객체
추가
boolean add(E e) 주어진 객체를 성공적으로 저장하면 true를 리턴하고 중복 객체면 false를 리턴
객체
검색
boolean contains(Object o) 주어진 객체가 저장되어 있는지 여부
isEmpty() 컬렉션이 비어 있는지 조사
Iterator<E> iterator() 저장된 객체를 한 번씩 가져오는 반복자 리턴
int size() 저장된 객체 수 리턴
객체
삭제
void clear() 저장된 모든 객체를 삭제
boolean remove(Object o) 주어진 객체를 삭제

 

HashSet

- Set컬렉션 중 가장 많이 사용되는 것

//생성 방법
Set<E> set = new HashSet<E>(); //E타입 객체만 저장
Set<E> set = new HashSet<>(); //E타입 객체만 저장
Set<> set = new HashSet<>(); //모든 타입 객체 저장

=>HashSet은 hashCode()의 리턴값이 같고 equals()메소드가 true를 리턴하면 동등한 객체로 보고 중복 저장하지 않는다.

 

* Set은 index가 없어 객체를 검색해서 가져오는 방법이 없다. 그래서 2가지 방법을 이용한다.

//Set에서 객체를 가져오는 방법

//1.for문 이용
Set<E> set = new HashSet<>();
for (E e:set){
	...
}

//2.Iterator이용
Set<E> set = new HashSet<>();
Iterator<E> iterator = set.iterator();

 

리턴타입 iterator 메소드명 설명
boolean hasNext() 가져올 객체가 있으면 true, 없으면 false
E next() 컬렉션에서 하나의 객체를 반환
void remove() next()로 가져온 객체를 Set컬렉션에서 제거한다.

 

//사용 방법
while(iterator.hasNext()){
	E e = iterator.next();
}

 

Map 컬렉션

Map 컬렉션은 키(key)와 값(value)으로 구성된 엔트리 객체를 저장한다. 여기서 키와 값은 모두 객체이다.

키 - 중복저장 불가능

값 - 중복저장 가능

기능 메소드 설명
객체 추가 V put(K key, V value) 주어진 키와 값을 추가, 저장되면 값을 리턴
객체 검색 boolean containsKey(Object key) 주어진 키가 있는지 여부
boolean containsValue(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 삭제.
삭제되면 값을 리턴

 

HashMap

키로 사용할 객체가 hashCode() 메소드의 리턴값이 같고 equals() 메소드가 true를 리턴할 경우, 동일 키로 보고 중복 저장을 허용하지 않는다.

 

//생성 방법
Map<K,V> map = new HashMap<K,V>();
Map<K,V> map = new HashMap<>();

 

Hashtable

Hashtable은 HashMap과 동일한 내부 구조를 갖고 있다. 차이점으로는 Hashtable은 동기화된 메소드로 구성되어 있어 멀티 스레드가 동시에 Hashtable의 메소드들을 실행할 수 없다.

따라서 멀티 스레드 환경에서도 안전하게 객체를 추가, 삭제할 수 있다.

Map<String, Integer> map = new Hashtable<String, Integer>();
Map<String, Integer> map = new Hahtable<>();

 

Properties

Hashtable의 자식 클래스이기 때문에 Hahtable의 특징을 그대로 갖고 있다. Properties는 키와 값을 String으로 제한한 컬렉션이다.

주로 .properties인 프로퍼터 파일을 읽을 때 사용한다.

//database.properties
driver=oracle.jdbc.OracleDirver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=tiger
admin=\uD64D\uAE38\uB3D9
Properties properties = new Properties();
properties.load(Xxx.class.getResourceAsStream("database.properties"));

 

검색 기능을 강화시킨 컬렉션

컬렉션 프레임워크는 검색 기능을 강화시킨 TreeSet, TreeMap을 제공한다.

 

TreeSet

- 이진트리를 기반으로 한 Set컬렉션

TreeSet에 객체를 저장할 때는 부모 노드의 객체와 비교해 낮은 것은 왼쪽 자식에, 높은 것은 오른쪽 자식 노드에 저장한다.

//생성 방법
TreeSet<E.=> treeSet = new TreeSet<E>;
TreeSet<E.=> treeSet = new TreeSet<>;

 

TreeMap

이진트리를 기반으로 한 Map 컬렉션. TreeSet과의 차이점은 키와 값이 저장된 Entry를 저장한다는 점이다.

TreeMap에 엔트리를 저장하면 키를 기준으로 자동 정렬되는데 부모 키값보다 낮은건 왼쪽, 큰 건 오른쪽 자식 노드에 Entry객체를 저장한다.

TreeMap<K,V> treeMap = new TreeMap<K,V>();
TreeMap<K,V> treeMap = new TreeMap<>();

 

Comparable과 Comparator

TreeSet에 저장되는 객체와 TreeMap에 저장되는 키 객체는 저장과 동시에 오름차순으로 정렬되는데,

객체가 Comparable 인터페이스를 구현하고 있어야 가능하다. Comparable인터페이스를 받아 compareTo()를 재정의해야한다.

리턴 타입 메소드 설명
int compareTo(T o) 주어진 객체와 같으면 0,
크면 양수,
작으면 음수 리턴

 

Comparable 비구현 객체를 저장하고 싶다면 TreeSet과 TreeMap을 생성할 때 비교자(Comparator)를 제공하면 된다.

TreeSet<E> treeSet = new TreeSet<E>(new ComparatorImpl));

TreeMap<K,V> treeMap = new TreeMap<K,V>(new ComparatorImpl());

 

LIFO와 FIFO 컬렉션

LIFO(Last In First Out): 후입선출 => 스택

FIFO(First in First Out): 선입선출 => 

Stack

//스택 생성 방법
Stack<E> stack = new Stack<E>();
Stack<E> stack = new Stack<>();
리턴 타입 메소드 설명
E push(E item) 주어진 객체를 스택에 넣는다.
E pop() 스택의 맨 위 객체를 빼낸다

 

Queue

//큐 생성 방법
Queue<E> queue = new LinkedList<E>();
Queue<E> queue = new LinkedList<>();
리턴 타입 메소드 설명
boolean offer(E e) 주어진 객체를 큐에 넣는다.
E poll() 큐에서 객체를 빼낸다.

 

728x90
반응형
LIST

'IT > JAVA' 카테고리의 다른 글

[JAVA] #17 스트림 요소 처리  (0) 2023.05.01
[JAVA] #16 람다식  (0) 2023.04.27
[JAVA] #14 멀티 스레드  (0) 2023.04.26
[JAVA] #13 제네릭  (0) 2023.04.24
[JAVA] #12 java.base 모듈  (0) 2023.04.20

+ Recent posts