[혼공학습단 10기☕️] 자바 week5
미션
기본미션 : 직접 정리한 키워드 공유하기
키워드 1 : thread safe
- 스레드에 안전하다.
- 멀티 스레드가 동시에 메소드를 실행할 수 없고, 하나의 메소드가 메소드를 실행을 완료해야만 다른 스레드가 메소드 실행 가능
- 멀티 스레드 환경에서 안전한 객체 추가, 삭제가 가능.
- ex) Vector, Hashtable 등
키워드 2 : FIFO
- First In First Out
- 먼저 넣은 객체가 먼저 빠져나가는 자료구조
- ex) Queue
키워드 3 : LIFO
- Last In First Out
- 나중에 넣은 객체가 먼저 빠져나가는 자료구조
- ex) Stack
선택미션 : p. 573 [직접 해보는 손코딩] 코딩 과정 및 실행 결과 캡처하기
Chapter 13 컬렉션 프레임워크
1. 컬렉션 프레임워크
📍컬렉션 프레임워크
- 자료구조를 사용해서 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 인터페이스와 구현클래스를 java.util 패키지에서 제공함.
- 컬렉션 : 객체의저장
- 프레임워크 : 사용 방법을 정해놓은 라이브러리
📌 List 컬렉션
- 배열처럼 객체를 인덱스로 관리함.
- 저장 용량이 자동으로 증가하며, 객체를 저장할 때 자동 인덱스가 부여됨.
- 객체의 번지를 참조함. (동일한 객체를 중복 저장할 경우 동일한 번지 참조, null을 저장할 경우 객체 참조를 하지 않음.)
- list 컬렉션에는 ArrayList, Vector, LinkedList 등이 있음.
- 객체 추가 메소드
- boolean add(E e) : 주어진 객체를 맨 끝에 추가
- void add(int index, E e) : 주어진 인덱스에 객체를 추가
- E set(int index, E e) : 주어진 인덱스에 저장된 객체를 주어진 객체로 변경
- 객체 검색 메소드
- boolean contains(Object o) : 주어진 객체가 저장되어 있는지 조사
- E get(int index) : 주어진 인덱스에 저장된 객체를 리턴
- boolean isEmpty() : 컬렉션이 비어 있는지 조사
- 객체 삭제 메소드
- void clear() : 저장된 모든 객체를 삭제
- E remove(int index) : 주어진 인덱스에 저장된 객체를 삭제
- boolean remove(Object o) : 주어진 객체를 삭제
- list 컬렉션에서 저장된 모든 객체를 하나씩 가져오기
List<Stirng> list = ....;
// 방법 1 : 인덱스 이용
for (int i=0; i<list.size(); i++)
{
String str = list.get(i);
//
}
// 방법 2 : 향상된 for문
for (String str : list)
{
//
}
① ArrayList
- 생성
List<String> list = new ArrayList<String>();
List<String> list = new ArrayList<>();
// ArrayList의 E 타입 파라미터를 생략하면 왼쪽 list에 지정된 타입을 따라 감
- 특징
- 기본생성자로 ArrayList 객체를 생성하면 10개의 객체를 저장할 수 있는 초기 용량을 가짐
- 객체 수가 늘어남에 따라 자동으로 용량이 증가
- 객체를 추가하면 0번인덱스부터 차례대로 저장
- 특정 인덱스의 객체를 제거하거나 삽입하면 이에 따라 다음 인덱스들이 변함.
② Vector
- 생성
List<E> list = new Vector<E>();
List<E> list = new Vector<>();
- 특징
- ArrayList와 동일한 내부 구조를 가짐.
- 스레드에 안전하다 ; Vector는 동기화된 메소드로 구성되어 있기 때문에 멀티스레드가 동시에 Vector의 메소드 실행X
③ LinkedList
- 생성
List<E> list = new LinkedList<E>();
List<E> list = new LinkedList<>();
- ArrayList와 사용방법은 같지만 내부 구조는 다름
- 인접 참조를 링크해서 관리
- 중간에 추가, 삭제하는 경우에는 ArrayList보다 속도가 빠르다.
📌 Set 컬렉션
- 저장 순서가 유지되지 않고 객체의 중복 저장 불가
- set 컬렉션에는 HashSet, LinkedHashSet, TreeSet 등이 있다.
- 객체 추가 메소드
- boolean add(E e) : 주어진 객체를 저장, 객체를 성공적으로 저장하면 true, 아니면 false 리턴
- 객체 검색 메소드
- boolean contains(Object o) : 주어진 객체가 저장되어 있는지 조사
- boolean isEmpty() : 컬렉션이 비어 있는지 조사
- Iterator<E> iterator() : 저장된객체를 한번씩 가져오는 반복자 리턴
- 객체 삭제 메소드
- void clear() : 저장된 모든 객체를 삭제
- boolean remove(Object o) : 주어진 객체를 삭제
- Iterator
- Set 컬렉션은 인덱스로 객체를 검색해서 가져오는 메소드가 없음.
- 전체 객체를 대상으로 한 번씩 반복해서 가져오는 반복자를 제공
- 반복자는 Iterator 인터페이스를 구현한 객체를 말하는데, iterator() 메소드를 호출해서 얻음.
- Iterator 인터페이스에 선언된 메소드는 hasNext(), next(), remove()가 있음.
- hasNext() : 가져올 객체가 있으면 true, 없으면 false 리턴
- next() : 컬렉션에서 하나의 객체를 가져옴
- remove() : Set 컬렉션에서 객체를 제거
- 저장된 전체 객체를 대상으로 하나씩 얻기
Set<String> set = ....;
// 방법 1 : Iterator 사용
Iterator<String> iterator = set.iterator();
while (iterator.hasNext())
{
string str = iterator.next();
//
}
// 방법 2 : 향상된 for문 사용
for (string str : set)
{
//
}
① HashSet
- 생성
Set<E> set = new HashSet<E>();
- 특징
- 객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않음.
- HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를호출해서 해시코드를 얻고, 이미 저장된 객체의 해시코드와 비교함.
- 만약 동일한 해시코드가 있다면, equals() 메소드로 두 객체를 비교하고 true일 경우에는 중복으로 판단함.
📌 Map 컬렉션
- Map 컬렉션은 키와 값으로 구성된 Map.Entry 객체를 저장하는 구조
- Entry는 Map 인터페이스 내부에 선언된 중첩 인터페이스
- 키는 중복 저장될 수 없지만 값은 중복 저장될 수 있음
- Map 컬렉션에는 HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 있다.
- 객체 저장 메소드
- V put(K key, V value) : 주어진 키로 값을 저장. 새로운 키일 경우 null 리턴, 동일한 키가 있을 경우 값을 대체하고 이전 값 리턴
- 객체 검색 메소드
- 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를 삭제하고 값을 리턴
- 저장된 전체 객체를 대상으로 하나씩 얻기
Map<K, V> map = ...;
// 방법 1
Set<K> keySet = map.keySet();
Iterator<K> keyIterator = keySet.iterator();
while (keyIterator.hashNext())
{
K key = keyIterator.next();
V value = map.get(key)
}
// 방법 2
Set<Map, Entry<K, V>> entrySet = map.entrySet();
Iterator<Map, Entry<K, V>> entryIterator = entrySet.iterator();
while (entryIterator.hashNext())
{
Map.Entry<K, V> entry = entryIterator.next();
K key = entry.getKey();
V value = entry.getValue();
}
① HashMap
- Map 인터페이스를 구현한 대표적인 Map 컬렉션
- HashMap의 키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정해야 함.
Map<K, V> map = new HashMap<K, V>();
② Hashtable
- HashMap과 동일한 내부 구조
- 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 Hashtable의 메소드 실행 불가
Map<K, V> map = new Hashtable<K, V>();
2. LIFO와 FIFO 컬렉션
📌Stack
- LIFO 자료구조
- 주요 메소드
- push(E item) : 주어진 객체를 스택에 넣음
- peek() : 스택의 맨 위 객체를 가져옴 (객체를 스택에서 제거하지 않음)
- pop() : 스택의 맨 위 객체를 가져옴 (객체를 스택에서 제거)
Stack<E> stack = new Stack<E>();
Stack<E> stack = new Stack<>();
📌Queue
- FIFO 자료구조
- 주요 메소드
- offer(E e) : 주어진 객체를 넣음
- peek() : 객체 하나를 가져옴. (객체를 큐에서 제거하지 않음)
- poll() : 객체 하나를 가져옴 (객체를 큐에서 제거)
- Queue 인터페이스를 구현한 대표적인 클래스는 LinkedList.
Queue<E> queue = new LinkedList<E>();
Queue<E> queue = new LinkedList<>();
C++ STL을 사용해보고, 파이썬으로 자료구조를 공부한 적이 있어서 이번 주 학습 내용 자체가 생소하지는 않았습니다! 벌써 5주차라는 것이 안 믿기네요.. 마지막까지 힘내겠습니다. 다들 파이팅💪