자바.. 처음 할 때 부터 계속 강조받았던 내용이다.. 근데 막상 생각해보면 별 거 아닌데 이상하게 알고리즘 풀 땐 해매서 한번 재정리를 하고자 한다.
collection Framework의 장점은 여러개다.
1. 데이터 구조에 대한 알고리즘의 고성능 구현을 제공하여 프로그램의 품질 향상
2. 인터페이스와 다형성을 이용한 객체지향적 설계를 통한 표준화로 쉽고, 재사용성이 높다.
3. 소프트웨어 재사용을 족진한다. 왜냐? 새로운 자료구조의 경우 콜렉션을 조합하여 새로운 알고리즘을 만들면 되니까
즉, int형이나 double형 같은 자바의 primitive 타입은 적재를 못한다는 말이다. 따라서 primitive 타입을 wrapper 타입으로 변환하여 Integer 객체나 Double 객체로 박싱(Boxing)하여 저장하여야 한다.
또한 객체를 담는 다는 것은 곧 주소값을 담는다는 것이니, null도 저장이 가능하다.
List 와 Set 인터페이스를 구현한 컬렉션 클래스들은 공통부분이 많기 때문에, 공통된 부분을 모은 Collection 인터페이스로 상속 되어있다.
Map 인터페이스 컬렉션들은 두개의 데이터를 묶어 한쌍으로 다루기 때문에 Collection 인터페이스와 따로 분리되어 있다.
일단 표로 정리를 미리 한다면 이렇다.
| 자료 구조 | 설명 | 예시 코드 | 사용 사례 |
|---|---|---|---|
| Array | 고정 크기, 동일 타입의 요소를 순차적으로 저장. | int[] arr = new int[5]; | 숫자 데이터 집합 저장 |
| ArrayList | 크기 조정 가능한 배열. 순서 유지, 중복 허용. | ArrayList<String> list = new ArrayList<>(); | 동적 요소 추가/제거 필요 시 |
| LinkedList | 요소의 추가 및 제거가 자주 일어나는 경우 효율적인 리스트. | LinkedList<String> links = new LinkedList<>(); | 데이터 입력 및 삭제가 빈번한 경우 |
| HashSet | 중복을 허용하지 않는 데이터 집합. 순서 유지하지 않음. | HashSet<Integer> set = new HashSet<>(); | 중복 없는 요소 처리 필요 시 |
| TreeSet | 정렬된 순서로 요소를 저장. 중복 불허. | TreeSet<Integer> tree = new TreeSet<>(); | 정렬된 데이터 필요 시 |
| Queue | FIFO(First In First Out) 방식의 요소 관리. | Queue<String> queue = new LinkedList<>(); | 작업 스케줄링 또는 데이터 버퍼링 |
| Stack | LIFO(Last In First Out) 방식의 요소 관리. | Stack<Integer> stack = new Stack<>(); | 역순 데이터 처리, 깊이 우선 탐색(DFS)에 사용 |
| HashMap | 키와 값의 쌍으로 데이터를 저장. 키의 중복 불허. | HashMap<String, Integer> map = new HashMap<>(); | 키-값 데이터 관리 |
| TreeMap | 키에 따라 정렬하여 데이터를 저장. 키의 중복 불허. | TreeMap<String, Integer> sortedMap = new TreeMap<>(); | 정렬 필요한 키-값 데이터 관리 |
| LinkedHashMap | 삽입 순서 또는 접근 순서 유지하며 데이터 저장. 키의 중복 불허. | LinkedHashMap<Integer, String> linkedMap = new LinkedHashMap<>(); | 데이터 삽입 순서 중요 시 |
add(E e): 컬렉션에 요소를 추가. 성공하면 true 반환.
remove(Object o): 컬렉션에서 요소를 제거. 성공하면 true 반환.
size(): 컬렉션의 요소 수 반환.
isEmpty(): 컬렉션이 비어 있는지 확인. 비어 있으면 true 반환.
contains(Object o): 특정 요소가 컬렉션에 있는지 확인. 있으면 true 반환.
iterator(): 컬렉션의 요소를 순회할 수 있는 Iterator 반환.
clear(): 컬렉션의 모든 요소를 제거.
가만 보면 실버에서 골드로 넘어가는 순간에 자료구조를 모르면 수문장한테 막히더라..
배열은 동일한 타입의 데이터를 연속된 메모리 공간에 저장하는 자료구조다. 배열은 선언 시에 그 크기가 정해지며, 인덱스를 통해 빠르게 데이터에 접근할 수 있는 장점이 있다.
java
Copy code
int[] array = new int[10]; // 정수형 배열 선언, 크기 10
array[0] = 1; // 첫 번째 원소에 1 할당
Java의 컬렉션 프레임워크는 데이터를 저장, 관리, 조작할 수 있는 다양한 클래스를 제공한다. 크게 List, Set, Queue 인터페이스로 구분할 수 있다.
순서가 있는 데이터의 집합으로, 데이터의 중복을 허용한다. 주요 구현체로는 ArrayList, LinkedList 등이 있다.
ArrayList: 동적 배열을 구현한 클래스로, 인덱스를 통해 빠른 접근이 가능하다.
LinkedList: 이중 연결 리스트를 구현한 클래스로, 데이터의 추가와 삭제가 빠르다.
java
Copy code
List<String> arrayList = new ArrayList<>();
arrayList.add("Java");
arrayList.add("Python");
List<String> linkedList = new LinkedList<>();
linkedList.add("Node");
linkedList.add("Ruby");
중복을 허용하지 않는 데이터의 집합으로, 순서를 유지하지 않다. 주요 구현체로는 HashSet, LinkedHashSet, TreeSet 등이 있다.
HashSet: 해시 테이블을 사용하여 구현된 클래스로, 매우 빠른 접근 속도를 제공한다.
LinkedHashSet: 해시 테이블과 연결 리스트를 사용하여, 데이터의 삽입 순서를 유지한다.
TreeSet: 레드-블랙 트리 기반의 NavigableSet 구현으로, 정렬된 순서로 데이터를 저장한다.
java
Copy code
Set<Integer> hashSet = new HashSet<>();
hashSet.add(1);
hashSet.add(2);
Set<Integer> treeSet = new TreeSet<>();
treeSet.add(3);
treeSet.add(4);
데이터의 추가와 삭제가 양 끝에서 일어나는 순차적인 데이터 구조다. LinkedList, PriorityQueue 등이 있다.
LinkedList: Queue 인터페이스를 구현하며, FIFO(First-In-First-Out) 방식으로 데이터를 관리한다.
PriorityQueue: 우선순위 큐를 구현하며, 우선순위에 따라 데이터의 순서가 결정된다.
java
Copy code
Queue<String> queue = new LinkedList<>();
queue.add("first");
queue.add("second");
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
priorityQueue.add(10);
priorityQueue.add(5);
키와 값의 쌍으로 데이터를 저장하는 구조로, 키의 중복을 허용하지 않는다. HashMap, TreeMap, LinkedHashMap 등이 있다.
HashMap: 해시 테이블을 사용하여 데이터를 관리합니다. 순서는 유지되지 않다.
TreeMap: 레드-블랙 트리를 기반으로 하며, 키에 따라 정렬된 순서로 키-값 쌍을 저장한다.
LinkedHashMap: 삽입 순서 또는 접근 순서를 유지하며 데이터를 저장한다.
java
Copy code
Map<String, Integer> hashMap = new HashMap<>();
hashMap.put("key1", 100);
hashMap.put("key2", 200);
Map<String, Integer> treeMap = new TreeMap<>();
treeMap.put("apple", 50);
treeMap.put("banana", 30);
각 자료구조는 사용 목적과 필요한 연산에 따라 선택하여 사용할 수 있다. 처리해야 할 데이터의 특성을 잘 파악하고 적합한 자료구조를 선택하는 것이 중요하다.
참고 : https://inpa.tistory.com/entry/JCF-🧱-Collections-Framework-종류-총정리 [Inpa Dev 👨💻:티스토리]