컴퓨터 & 코딩/Java

[혼공학습단 10기][혼공자] 컬렉션 프레임워크

구로그 2023. 7. 20. 14:59
728x90
✏️  컬렉션 프레임워크
자료 구조를 사용해서 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록하는 인터페이스와 구현클래스 (java.util 패키지)
- 컬렉션: 객체의 저장
- 프레임워크: 사용 방법을 정해놓은 라이브러리

 

 

1️⃣ List 컬렉션

객체를 인덱스로 관리.

💡 배열과의 차이점
- 저장 용량이 자동으로 증가한다
- 객체를 저장할 때 자동 인덱스가 부여된다
- 추가, 삭제, 검색등을 위한 다양한 메소드들이 제공됨. 

- 객체 자체를 저장하는 게 아니라 객체의 번지를 참조한다.

- 동일한 객체의 중복 저장이 가능하며 (동일한 번지 참조) null도 저장 가능하다.  

- 구현 클래스: ArrayList, Vector, LinkedList

 

 

✏️ 메소드

List<String> list = ...; 
list.add("rabbit");  // 맨 끝에 객체 추가
list.add(1, "dog");  // 지정된 인덱스에 객체 삽입
String str = list.get(1);  // 인덱스로 객체 검색
list.remove(0);  // 인덱스로 객체 삭제
list.remove("dog");  // 객체 삭제
list.set(3, "cat");  // 객체 교체 
list.contains("cat");  // 객체 저장 여부 
list.get(3);  // 주어진 인덱스에 저장된 객체 리턴
list.isEmpty();  // 컬렉션이 비어있는지 조사
list.clear();  // 모든 객체 삭제

 

- 리스트 컬렉션에 저장된 모든 객체를 대상으로 하나씩 가져와 처리하는 방법

List<String> list = ...;

// 인덱스 이용 (size()메소드는 현재 저장되어 있는 객체 수를 리턴) 
for(int i=0; i < list.size(); i++) {
    String str = list.get(i);
}


// 향상된 for문 이용
for(String str : list) { }

 

 

 

✏️ 구현 클래스

 

1) ArrayList 

List<E> list = new ArrayList<E>();

//예시
List<String> list = new ArrayList<String>();
List<String> list = new ArrayList<>();  // 왼쪽 List에 지정된 타입을 따라감

- 초기 용량은 객체 10개이며 저장되는 객체 수가 늘어나면 용량 자동 증가한다

- 객체 추가하면 0번 인덱스부터 차례대로 저장됨.

- 특정 인덱스 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 인덱스가 모두 1씩 당겨짐. 특정 인덱스에 객체를 삽입하면 해당 인덱스부터 마지막까지 모두 1씩 밀려난다. 

 

 

2) Vertor

ArrayList와 동일한 내부 구조 + 동기화된 메소드로 구성 + thread safe 

List<E> list = new Vector<E>();
List<E> list = new Vector<>();

 

💡 thread safe
멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있음
+ 멀티 스레드 환경에서 여러 스레드가 동시에 하나의 객체를 사용해도 안전하게 동작하는 것을 의미한다. 즉, 해당 객체가 올바르게 동작하고 데이터의 무결성을 보장하며, 스레드 간의 충돌이나 경쟁 조건이 발생하지 않는다. 

 

 

3) LinkedList

ArrayList와 사용 방법은 똑같으나 내부 구조가 완전히 다르다. 

ArrayList는 내부 배열에 객체를 저장해서 관리하지만 LinkedList는 인접 참조를 링크해서 체인처럼 관리한다. 

따라서 특정 인덱스의 객체를 제거 혹은 삽입 하면 하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않는다. 

또한 처음 생성될 때에는 내부가 비어있다.

List<E> list = new LinkedList<E>();
List<E> list = new LinkedList<>();

 

 

💡 ArrayList와 LinkedList
저장된 객체 수가 많고 특정 인덱스에 객체를 추가하거나 제거하는 일이 빈번하다면 LinkedList를 사용하는 게 좋다. 

- 끝에서부터(순차적으로) 추가 또는 삭제하는 경우 혹은 인덱스를 이용해서 객체를 찾는 건 ArrayList가 빠르다
- 중간에 추가, 삭제하는 경우는 앞뒤 링크 정보만 변경하면 되는 LinkedList가 더 빠르다.

 

 

 

 

 

2️⃣ Set 컬렉션

- List 컬렉션과 달리 Set 컬렉션은 저장 순서가 유지 되지 않는다

- 객체를 중복해서 저장할 수 없고 하나의 null만 저장할 수 있다. 

- 구현 클래스: HashSet, TreeSet

 

 

✏️ 메소드

Set<String> set = ...;
set.add("rabbit");  // 객체 추가
set.add("dog");
set.remove("rabbit");  // 객체 삭제
Iterator<String> iterator = set.iterator();  // 저장된 객체를 한 번씩 가져오는 반복자 리턴
String str = iterator.next();  // 컬렉션에서 하나의 객체를 가져옴 
if(str.equals("dog")) {
    iterator.remove();  // 객체 제거 
}

 

 

 

✏️ 구현 클래스

 

1) HashSet 

Set 인터페이스의 구현 클래스. 

Set<E> set = new HashSet<E>();

// 예시
Set<String> set = new HashSet<String>();
Set<String> set = new HashSet<>();

 

 

- 동일한 객체를 판단하는 절차: 객체 저장 전 hashCode() 메소드를 호출하여 해시코드를 얻고 만약 동일한 해시코드가 있다면 equals() 메소드로 두 객체를 비교하여 true가 나올 경우 동일한 객체로 판단한다. 

- 사용자 정의 클래스를 만들고 hashCode()와 equals() 메소드를 재정의하여 사용할 수 있다. 

 

2) 그 밖에 구현클래스: TreeSet 

 

 

 

 

 

3️⃣ Map 컬렉션 

- 키와 값(둘 다 객체)으로 구성된 Map.Entry 객체를 저장하는 구조를 갖고 있다.

- 키는 중복 저장될 수 없지만 값은 중복 저장될 수 있다. 

- 구현 클래스: HashMap, Hashtable, TreeMap, Properties 

 

 

✏️ 메소드

Map<string, Integer> map = ...;
map.put("rabbit", 4);  // 객체 추가
int score = map.get("rabbit");  // 객체 찾기
map.remove("rabbit");  // 객체 삭제
Set<K> keySet = map.keySet();  // 모든 키를 Set 객체에 담아 리턴

 

저장된 전체 객체를 대상으로 하나씩 얻고 싶을 경우 

// keySet() 메소드와 get() 메소드 사용
Map<K, V> map = ...; 
Set<K> keySet = map.keySet();
Iterator<K> keyIterator = keySet.iterator();
while(keyIterator.hasNext()) {
    K key = keyIterator.next();
    V value = map.get(key);
}

// entrySet()와 getKey(), getValue() 메소드 사용
Set<Map.Entry<K, V>> entrySet = map.entrySet();
Iterator<Map.Entry<K, V>> entryIterator = entrySet.iterator();
while(entryIterator.hasNext()) {
    Map.Entry<K, V> entry = entryIterator.next();
    K key = entry.getKey();
    V value = entry.getValue();
}

 

 

 

 

✏️ 구현 클래스

 

1) HashMap 

HashMap의 키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의해서 동등 객체가 될 조건을 정해야 한다.

Map<K, V> map = new HashMap<K, V>();


// 예시
Map<String, Integer> map = new hashMap<String, Integer>();
Map<String, Integer> map = new hashMap<>();

 

 

2) Hashtable

HashMap과 동일한 내부 구조 + 동기화된 메소드로만 구성 + thread safe

Map<K, V> map = new Hashtable<K, V>();

// 예시
Map<String, Integer> map = new Hashtable<String, Integer>();
Map<String, Integer> map = new Hashtable<>();

 

 

3) 그 밖에 구현클래스: TreeMap, Properties 

 

 

 

 


✓ LIFO와 FIFO 컬렉션

⬇︎ LIFO, FIFO, 스택, 큐 개념 정리 보러가기

 

[혼공학습단 10기][혼공컴운] 1주차 미션

✏️ 진도: Chapter 01 ~ 03 (컴퓨터 구조 / 데이터 / 명령어) 1. 컴퓨터 구조 2. 명령어와 주소 지정 방식 📖 기본 미션: p. 51의 확인 문제 3번, p.65의 확인 문제 3번 풀고 인증하기 📚 선택 미션: p. 100의

hianzhi.tistory.com

 

✏️ Stack 

Stack<E> stack = new Stack<E>();
Stack<E> stack = new Stack<>();

 

push(E item) 주어진 객체를 스택에 넣음

 

- peek() 스택의 맨 위 객체를 가져옴 (제거 X)

- pop() 맨 위 객체 가져오면서 스택에서 제거 

 

 

 

 

✏️ Queue 

Queue 인터페이스를 구현한 대표적인 클래스는 LinkedList

LinkedList 객체를 Queue 인터페이스 타입으로 변환하기 ⬇︎

Queue<E> queue = new LinkedList<E>();
Queue<E> queue = new LinkedList<>();

 

 

- offer(E e) 주어진 객체를 큐게 넣음

- peek() 객체를 하나 가져옴 (제거 X) 

- poll() 객체를 하나 가져오면서 큐에서 제거  

반응형