본문 바로가기
language/java

Java List / Set / Map 차이 완벽 이해하기

by 죄니안죄니 2026. 5. 27.
반응형

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, 메모리 구조, 시간복잡도 함정, 실무 성능 차이까지 포함해서 깊게 정리해보겠습니다.

반응형

댓글