[Java] 자료구조 심화: 컬렉션 프레임워크(Collection) 완벽 해부
매번 ArrayList만 쓰고 계신가요? 중복을 허용하지 않아야 하거나, 데이터 검색 속도가 중요하다면 적절한 컬렉션 선택이 필수입니다. 오늘은 자바 개발의 핵심인 List, Set, Map의 특징을 비교하고, 실무 상황별로 어떤 자료구조가 가장 효율적인지 '런코리치' 스타일로 정리해 드립니다.
1. 자료구조 선택의 기준: 시간 복잡도 (Big-O)
실무에서 자료구조를 고를 때 가장 먼저 고려해야 할 지표입니다.
| 자료구조 | 조회 (Get) | 삽입/삭제 (Add/Remove) | 비고 |
| ArrayList | O(1) | O(n) | 데이터가 많을수록 삽입/삭제 성능 저하 |
| LinkedList | O(n) | O(1) | 검색 시 처음부터 순차 탐색 필요 |
| HashMap | O(1) | O(1) | 해시 충돌 시 최대 O(\log n) (Java 8+) |
| TreeSet/Map | O(\log n) | O(\log n) | 데이터가 항상 정렬된 상태를 유지 |
2. List 인터페이스: 연속된 데이터의 관리
✅ ArrayList - 가변 크기 배열 (Dynamic Array)
내부적으로 Object[] 배열을 사용합니다.
- 동작 원리: 배열의 크기가 꽉 차면 기존 크기의 약 1.5배 큰 새로운 배열을 만들고 데이터를 복사합니다. (이 과정을 Resizing이라 하며, 잦은 리사이징은 성능 저하를 유발합니다.)
- 최적화 팁: 데이터의 개수를 미리 예측할 수 있다면 new ArrayList(1000)와 같이 초기 용량(Initial Capacity)을 설정하세요.
✅ LinkedList - 연결 노드 (Doubly Linked List)
각 데이터가 앞뒤 노드의 주소를 가진 '노드' 객체로 구성됩니다.
- 내부 구조: [이전 주소 | 데이터 | 다음 주소]
- 특징: 스택(Stack)이나 큐(Queue) 자료구조를 구현할 때 내부적으로 자주 사용됩니다.
3. Set 인터페이스: 고유값의 집합
✅ HashSet - 해시 테이블 기반
순서가 중요하지 않은 유일한 값들의 집합입니다.
- 중복 체크의 비밀: equals()와 hashCode() 메서드를 사용합니다. 객체를 넣을 때 먼저 해시코드를 비교하고, 같으면 equals로 최종 확인합니다.
- 주의: 커스텀 객체를 Set에 넣을 때는 반드시 두 메서드를 재정의(Override)해야 합니다.
✅ TreeSet - 이진 탐색 트리 기반
데이터를 넣는 동시에 정렬합니다. 내부적으로 레드-블랙 트리(Red-Black Tree) 구조를 가집니다.
4. Map 인터페이스: 효율적인 검색 (Key-Value)
✅ HashMap - 성능의 끝판왕
실무에서 가장 많이 쓰는 자료구조입니다.
- 해시 충돌 처리: 같은 해시 값이 나오면 예전에는 LinkedList로 연결했지만, Java 8부터는 데이터가 8개 이상 쌓이면 TreeMap(Red-Black Tree)으로 구조를 변경하여 최악의 성능을 $O(n)$에서 $O(\log n)$으로 개선했습니다.
5. 실무에서 자주 발생하는 실수와 해결책
① 루프 안에서 리스트 요소 삭제
for-each 문 안에서 list.remove()를 호출하면 ConcurrentModificationException이 발생합니다.
- 해결책: Iterator를 사용하거나 Java 8의 removeIf() 메서드를 사용하세요.
Java
// 권장 방식
list.removeIf(item -> item.equals("deleteTarget"));
② 멀티스레드 환경에서의 안전성
ArrayList, HashMap은 Thread-Safe 하지 않습니다. 여러 스레드가 동시에 접근하면 데이터가 깨질 수 있습니다.
- 해결책: ConcurrentHashMap이나 Collections.synchronizedList()를 사용하세요.
6. 요약: 어떤 상황에 무엇을 쓸까?
- 조회 속도가 생명이다: ArrayList
- 데이터를 계속 추가/삭제만 한다: LinkedList
- 중복을 제거하고 정렬까지 필요하다: TreeSet
- 아이디로 사용자를 빨리 찾아야 한다: HashMap
- 입력한 순서대로 데이터를 유지하고 싶다: LinkedHashMap 또는 ArrayList
자료구조를 선택하는 것은 투자에서 자산 배분(Asset Allocation)을 하는 것과 같습니다. 현금이 필요할 때 부동산을 팔 수 없듯이, 빠른 검색이 필요한 곳에 List를 쓰면 시스템이 느려집니다. 상황에 맞는 최적의 도구를 선택하는 눈을 키우는 것, 그것이 'Rich'한 개발자로 가는 첫걸음입니다.
'TECH > 웹개발' 카테고리의 다른 글
| [Java] LTS 완벽 가이드: Java 11, 17, 21 핵심 기능과 실무 적용 코드 예시 (0) | 2026.02.25 |
|---|---|
| [Java] 자바 성능의 키, JVM 메모리 구조와 가비지 컬렉션(GC) 완벽 이해 (0) | 2026.02.23 |
| 스프링 부트 전역 예외 처리(Global Exception) - 중구난방 에러 메시지 한 번에 정리하기 (0) | 2026.02.12 |
| [Java] 자바 예외 처리(Exception) 총정리: try-catch부터 Custom Exception까지 (0) | 2026.02.11 |
| [Java] 메서드 체이닝(Method Chaining) 완벽 가이드: 원리부터 실무 활용까지 (0) | 2026.02.10 |