컬렉션
1. Iterable
자바 컬렉션의 최상위 인터페이스
반복자(Iterator)를 사용하여 요소를 순회할 수 있도록 정의주요
메서드
iterator() : 컬렉션의 요소를 반복할 수 있는 Iterator 객체를 반환예제 코드
List<String> list = Arrays.asList("A", "B", "C"); for (String item : list) { System.out.println(item); }
2. Collection
자바 컬렉션 프레임워크의 기본 인터페이스
데이터를 추가, 삭제, 탐색하는 메서드들을 정의상속받는 인터페이스
- List
- Set
- Queue
3. List
중복을 허용하며, 요소가 순서를 유지하는 컬렉션구현 클래스
- ArrayList
- LinkedList
- Vector
- Stack
3-1 ArrayList
배열 기반의 리스트
크기가 동적으로 늘어나며 검색이 빠르다특징
- 빠른 조회속도
- 삽입/삭제는 느림예제코드
import java.util.ArrayList; ArrayList<String> list = new ArrayList<>(); list.add("Apple"); list.add("Banana"); list.add("Cherry"); System.out.println(list); // 출력: [Apple, Banana, Cherry]
3-2 LinkedList
노드 기반의 리스트
삽입/삭제가 빠르다특징
- 삽입/삭제는 빠르지만, 검색은 느림
예제코드
import java.util.LinkedList; LinkedList<String> list = new LinkedList<>(); list.add("Apple"); list.add("Banana"); list.addFirst("Cherry"); // 맨 앞에 추가 System.out.println(list); // 출력: [Cherry, Apple, Banana]
3-3 Vector
동기화된 배열 기반의 리스트
Thread-safe 환경에서 사용특징
- 멀티 스레드 환경에서 안전하지만, 단일스레드에서는 ArrayList보다 느림
- 크기가 부족하면 현재 크기의 2배로 늘어난다
- 중복된 요소를 허용하며, 삽입된 순서를 유지한다.
예제코드
import java.util.Vector; Vector<Integer> vector = new Vector<>(); vector.add(10); vector.add(20); System.out.println(vector); // 출력: [10, 20]
3-4 Stack
Vector를 기반으로 한 LIFO(Last In First Out) 구조주요 메서드
- push(E e) : 요소 추가
- pop() : 마지막 요소 제거
예제코드
import java.util.Stack; Stack<Integer> stack = new Stack<>(); stack.push(1); stack.push(2); System.out.println(stack.pop()); // 출력: 2 System.out.println(stack); // 출력: [1]
4 Queue
FIFO(First In First Out) 방식의 컬렉션구현 클래스
- LinkedList
- PriorityQueue
4-1 LinkedList as Queue
import java.util.LinkedList; import java.util.Queue; Queue<String> queue = new LinkedList<>(); queue.add("Apple"); queue.add("Banana"); System.out.println(queue.poll()); // 출력: Apple
5 Deque
양방향 큐로, 앞뒤에서 삽입/삭제가 가능하다구현 클래스
- LinkedList
- ArrayDeque
예제코드
import java.util.ArrayDeque; import java.util.Deque; Deque<String> deque = new ArrayDeque<>(); deque.addFirst("Apple"); deque.addLast("Banana"); System.out.println(deque); // 출력: [Apple, Banana]
6 Set
중복을 허용하지 않는 컬렉션구현 클래스
- HashSet
- TreeSet
- LinkedHashSet
6-1 HashSet
해시 테이블을 사용해 요소 저장, 순서가 없음예제코드
import java.util.HashSet; HashSet<String> set = new HashSet<>(); set.add("Apple"); set.add("Banana"); System.out.println(set); // 출력: [Banana, Apple]
6-2 TreeSet
정렬된 형태로 저장예제코드
import java.util.TreeSet; TreeSet<String> set = new TreeSet<>(); set.add("Banana"); set.add("Apple"); System.out.println(set); // 출력: [Apple, Banana]
7 Map
키-값 쌍으로 데이터를 저장하는 컬렉션구현 클래스
- HashMap
- TreeMap
- HashTable
7-1 HashTable
1. 키-값 저장
각 키는 고유하며, 키와 값 모두 null을 허용하지 않는다
동일한 키를 사용해 값을 삽입하면 기존 값이 덮어씌워진다
2. 해싱(Hashing)
내부적으로 데이터를 저장하기 위해 해싱을 사용한다.
키의 hashCode() 메서드를 호출하여 해시값을 계산하고, 이를 기반으로 데이터를 저장할 버킷(bucket)을 결정한다
3. 동기화(Synchronization)
Hashtable은 기본적으로 동기화되어 있어, 멀티스레드 환경에서 안전하게 사용할 수 있다.
그러나 동기화로 인해 성능이 저하될 수 있으며, 이러한 이유로 동기화가 필요하지 않은 경우에는 HashMap이 더 적합하다
4. 순서 보장 없음
삽입된 데이터의 순서를 보장하지 않는다.
5. 충돌 처리
서로 다른 키가 동일한 해시코드를 가질 경우 충돌이 발생할 수 있다.
충돌은 체이닝(Chaining) 방식으로 처리되며, 동일한 버킷에 저장된 항목들은 연결 리스트로 관리된다.
6. 내부 구조
Hashtable은 내부적으로 배열과 연결 리스트를 사용하여 데이터를 저장한다
각 배열의 인덱스는 해시 함수에 의해 결정되며, 이 배열의 각 요소는 버킷(bucket)이라고 부른다
충돌이 발생하면 해당 버킷에 연결 리스트 형태로 데이터를 추가한다.
7 주요 메서드
8. 생성자
import java.util.Hashtable; public class HashtableExample { public static void main(String[] args) { // Hashtable 생성 Hashtable<String, Integer> hashtable = new Hashtable<>(); // 데이터 추가 hashtable.put("Alice", 25); hashtable.put("Bob", 30); hashtable.put("Charlie", 35); // 데이터 조회 System.out.println("Alice's age: " + hashtable.get("Alice")); // 데이터 확인 System.out.println("Contains key 'Bob': " + hashtable.containsKey("Bob")); System.out.println("Contains value 30: " + hashtable.containsValue(30)); // 데이터 삭제 hashtable.remove("Charlie"); System.out.println("Size after removal: " + hashtable.size()); } }7-2 HashMap
해시 테이블 기반의 맵
순서 없음import java.util.HashMap; HashMap<String, Integer> map = new HashMap<>(); map.put("Apple", 10); map.put("Banana", 20); System.out.println(map); // 출력: {Apple=10, Banana=20}
7-3 TreeMap
키의 오름차순으로 정렬된 맵예제코드
import java.util.TreeMap; TreeMap<String, Integer> map = new TreeMap<>(); map.put("Banana", 20); map.put("Apple", 10); System.out.println(map); // 출력: {Apple=10, Banana=20}
요약
- List : ArrayList, LinkedList, Vector, Stack
- Set : HashSet, TreeSet
- Map : HashMap, TreeMap
- Queue/Deque : LinkedList, ArrayDeque
열심히 하는군요..?? 혹시 취업 완전 백엔드로 가실건가요? 데이터 엔지니어나, 서버 관리 이런쪽..??