독학/[책] 자바

[혼공학습단 10기☕️] 자바 week5

최연재 2023. 8. 8. 20:26

미션

기본미션 : 직접 정리한 키워드 공유하기

키워드 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주차라는 것이 안 믿기네요.. 마지막까지 힘내겠습니다. 다들 파이팅💪