Java List / Set / Map 차이 완벽 이해하기
Java 컬렉션(Collection)을 공부할 때 가장 먼저 만나게 되는 핵심이 바로:
List / Set / Map 차이
입니다.
실무에서도 정말 많이 사용됩니다.
예:
- 회원 목록
- 상품 조회
- 캐시 저장
- 중복 제거
- 빠른 검색
전부 컬렉션과 연결됩니다.
초보 시절에는 보통:
List = 순서 있음
Set = 중복 없음
Map = key-value
정도로 외우고 끝나는 경우 많습니다.
하지만 실무에서는:
- 내부 자료구조
- 시간복잡도
- 메모리 사용
- 정렬 방식
- Thread-safe 여부
까지 이해해야 제대로 사용할 수 있습니다.
이번 글에서는:
- Collection Framework 구조
- List / Set / Map 차이
- 내부 동작 원리
- 시간복잡도
- 실무 사용 기준
까지 깊게 정리해보겠습니다.
1. Java Collection Framework란?
Java Collections Framework 는:
데이터를 저장하고 관리하기 위한 표준 자료구조 라이브러리
입니다.
2. 왜 Collection이 필요할까?
예를 들어:
String a1;
String a2;
String a3;
이런 식으로 데이터 관리하면 매우 비효율적.
그래서:
동적 자료구조
필요.
3. Collection 핵심 구조
대표 구조:
Collection
├─ List
├─ Set
└─ Queue
Map (별도 계열)
4. List란?
List interface 는:
순서가 있고 중복 허용하는 컬렉션
입니다.
5. List 특징
| 특징 | 설명 |
| 순서 유지 | O |
| 중복 허용 | O |
| index 접근 가능 | O |
6. List 예시
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Spring");
list.add("Java");
결과:
[Java, Spring, Java]
중복 허용.
7. List 주요 구현체
대표 구현체:
| 구현체 | 특징 |
| ArrayList | 배열 기반 |
| LinkedList | 연결 리스트 기반 |
| Vector | Thread-safe (구형) |
8. ArrayList란?
ArrayList 는:
내부적으로 배열(Array) 기반 List
입니다.
9. ArrayList 장점
| 장점 | 설명 |
| 조회 매우 빠름 | O(1) |
| 메모리 효율 좋음 | O |
| 실무 가장 많이 사용 | O |
10. ArrayList 단점
문제:
중간 삽입/삭제 느림
왜냐하면:
배열 요소 이동 필요
하기 때문.
11. LinkedList란?
LinkedList 는:
노드 연결 기반 List
입니다.
12. LinkedList 구조
[Node] -> [Node] -> [Node]
형태.
13. LinkedList 장점
| 장점 | 설명 |
| 중간 삽입/삭제 유리 | O |
| 요소 이동 불필요 | O |
14. LinkedList 단점
문제:
조회 느림
왜냐하면:
순차 탐색 필요
하기 때문.
15. 실무에서는 뭐 많이 쓸까?
대부분:
ArrayList
압도적으로 많이 사용.
16. Set이란?
Set interface 은:
중복을 허용하지 않는 컬렉션
입니다.
17. Set 특징
| 특징 | 설명 |
| 중복 허용 X | O |
| 순서 보장 보통 X | O |
| 빠른 검색 가능 | O |
18. Set 예시
Set<String> set = new HashSet<>();
set.add("Java");
set.add("Java");
결과:
[Java]
중복 제거.
19. Set 주요 구현체
대표 구현체:
| 구현체 | 특징 |
| HashSet | Hash 기반 |
| LinkedHashSet | 입력 순서 유지 |
| TreeSet | 정렬 지원 |
20. HashSet 핵심
HashSet 은 내부적으로:
HashMap 사용
합니다.
즉:
Hash 기반 중복 제거
구조.
21. 왜 Set은 중복이 안 될까?
핵심:
hashCode()
equals()
사용하기 때문.
22. TreeSet이란?
TreeSet 은:
정렬되는 Set
입니다.
내부적으로:
Red-Black Tree
사용.
23. TreeSet 특징
| 특징 | 설명 |
| 자동 정렬 | O |
| 검색 빠름 | O(logN) |
| HashSet보다 느림 | HashSet은 HashMap -> Hash + 배열 구조라 인덱스로 바로 찾음 O(1)인 반면 TreeSet은 TreeMap -> Red-Black Tree 구조라 계속 트리 탐색 O(logN) log_2(100000) 약 20 TreeSet은 내부적으로 Red-Black Tree 를 사용하고, 트리 높이가 항상 O(log N)으로 유지되기 때문에 검색·삽입·삭제가 모두 O(log N)이다. |
24. Map이란?
Map interface 은:
key-value 구조 컬렉션
입니다.
매우 중요.
실무에서 엄청 많이 사용.
25. Map 특징
| 특징 | 설명 |
| key-value 저장 | O |
| key 중복 불가 | O |
| value 중복 가능 | O |
26. Map 예시
Map<String, Integer> map =
new HashMap<>();
map.put("Apple", 1000);
구조:
Apple -> 1000
27. Map 주요 구현체
대표 구현체:
| 구현체 | 특징 |
| HashMap | 가장 많이 사용 |
| LinkedHashMap | 입력 순서 유지 |
| TreeMap | 정렬 지원 |
| ConcurrentHashMap | 동시성 지원 |
28. HashMap이 중요한 이유
HashMap 은:
Java 실무 핵심 자료구조
입니다.
거의 필수 수준.
29. HashMap 내부 구조
내부적으로:
배열 + LinkedList + Tree
조합 구조.
30. HashMap 동작 흐름
key.hashCode()
↓
bucket 위치 계산
↓
저장
31. 왜 빠를까?
핵심:
Hash 기반 O(1) 접근
가능.
32. Hash 충돌(Hash Collision)
문제:
서로 다른 key인데
같은 bucket 위치
가능.
33. 해결 방법
예전:
LinkedList 체이닝
현대 Java:
일정 이상이면 Tree 변환
(JDK8 이후)
34. Collection 시간복잡도
매우 중요.
| 자료구조 | 조회 | 삽입 |
| ArrayList | O(1) | 중간삽입 O(N) |
| LinkedList | O(N) | O(1) |
| HashSet | O(1) | O(1) |
| HashMap | O(1) | O(1) |
| TreeSet | O(logN) | O(logN) |
| TreeMap | O(logN) | O(logN) |
35. 언제 무엇을 써야 할까?
| 자료구조 | 상황 | 비고 |
| ArrayList | 조회 많을 때 | |
| LinkedList | 중간 삽입/삭제 많을 때 | 하지만 실무에선 잘 안 씀 |
| HashSet | 중복 제거 필요 시 | |
| HashMap | 빠른 Key 조회 시 | |
| TreeSet | 정렬 필요 시 | |
| TreeMap | 정렬 필요 시 |
36. 실무에서 가장 많이 쓰는 조합
압도적으로 많음:
List -> ArrayList
Map -> HashMap
Set -> HashSet
37. 왜 LinkedList 거의 안 쓸까?
이론상 삽입 빠르지만 실제로는:
- CPU Cache 효율 낮음
- 객체 포인터 탐색 비용 큼
즉:
ArrayList가 대부분 더 빠름
38. Collection과 메모리
Collection은 내부적으로:
객체 reference 저장
합니다.
즉:
객체 자체 저장 아님
39. 그래서 Side Effect 발생 가능
예:
list.add(user);
후 객체 수정 시:
Collection 내부 객체도 변경됨
같은 참조 공유 때문.
40. ConcurrentHashMap
ConcurrentHashMap 은:
멀티스레드 안전 Map
ConcurrentHashMap은 JDK 8 기준으로 CAS와 Bucket 단위 synchronized를 조합하여 여러 스레드가 동시에 접근해도 데이터 무결성을 보장한다.
41. 왜 HashMap은 위험할까?
멀티스레드 환경에서:
동시 수정 문제
가능.
HashMap의 put(), resize(), node 연결 작업은 여러 단계로 이루어져 있으며 원자적이지 않다.
따라서 여러 스레드가 동시에 수정하면 Race Condition이 발생하여 데이터 유실, 잘못된 연결, size 불일치가 발생할 수 있다.
특히 JDK7에서는 resize 과정에서 무한 루프가 발생하는 문제도 있었다.
그래서 멀티스레드 환경에서는 ConcurrentHashMap을 사용해야 한다.
42. Collection 실무 팁
매우 중요.
초기 크기 지정
new HashMap<>(1000)
재해시 감소 가능.
equals/hashCode 중요
Set/Map에서 핵심.
null 허용 여부 확인
구현체별 차이 존재.
43. 실무에서 자주 하는 실수
1) List 검색 반복
for (...) {
list.contains()
}
비효율 가능.
2) HashMap key mutable 사용
매우 위험.
hash 깨질 수 있음.
3) equals/hashCode 미구현
Set/Map 동작 이상 가능.
44. 핵심 흐름 요약
List
= 순서 + 중복 허용
Set
= 중복 제거
Map
= key-value 저장
45. 가장 중요한 핵심 한 줄
Collection 선택은
“데이터 접근 패턴”에 따라 달라진다
입니다.
46. 정리
List / Set / Map은 단순 문법 컬렉션이 아닙니다.
실제로는:
- Hash 구조
- Tree 구조
- 시간복잡도
- 메모리 구조
- 동시성
전체와 연결되는 Java 핵심 자료구조입니다.
특히 실무에서는:
- ArrayList vs LinkedList
- HashMap 내부 구조
- Set 중복 제거 원리
- 시간복잡도
를 정확히 이해하는 것이 매우 중요합니다.
다음 글에서는:
ArrayList vs LinkedList
를 CPU Cache, 메모리 구조, 시간복잡도 함정, 실무 성능 차이까지 포함해서 깊게 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java HashMap 내부 구조 완벽 이해하기 (0) | 2026.05.27 |
|---|---|
| Java ArrayList vs LinkedList 완벽 비교 (0) | 2026.05.27 |
| Java JVM 옵션 기초(-Xms, -Xmx 등) 완벽 이해하기 (0) | 2026.05.26 |
| Java Escape Analysis 완벽 이해하기 (0) | 2026.05.26 |
| Java 인터프리터(Interpreter) vs JIT Compiler 완벽 이해하기 (0) | 2026.05.26 |
댓글