일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 커널모드
- 백준_2559
- 백준2559
- 배열
- 유저 쓰레드
- list
- 알고리즘
- 스케줄링
- 코딩테스트
- 코테
- cpu
- 쓰레드
- 트리
- HashMap
- Java
- MAP
- tree
- Red-Black
- non-blocking
- 유저모드
- black-red
- set
- avl
- os 쓰레드
- 하드웨어 쓰레드
- 자바
- linkedmap
- OS
- 프로그래머스
- Lock
변수의 기록
(Java) Set의 구조와 활용 - ADT 관점으로 이해 본문
1. Set이란 무엇인가? (ADT 관점)
Set은 데이터를 저장하는 추상 자료형(ADT) 중 하나입니다.
특징적으로 다음과 같은 성질을 가집니다:
- 중복을 허용하지 않는다
- 요소의 순서를 보장하지 않는다
- 데이터의 존재 유무를 빠르게 확인할 수 있다
이러한 동작을 제공하는 구조만 정의된 것이 Set이라는 ADT이고,
Java에서는 Set<E> 인터페이스와 이를 구현하는 다양한 클래스(HashSet, LinkedHashSet, TreeSet)를 통해 이 ADT를 실현합니다.
2. Set의 사용 목적 및 언제 사용하는가
✅ Set이 유리한 상황
- 중복 제거가 필요한 경우
→ 예: 사용자 입력값 정제, 태그 중복 제거 등 - 순서가 중요하지 않은 데이터 집합
→ 예: 허용된 IP 주소 목록, 이미 방문한 노드 기록 등 - 특정 데이터가 존재하는지 여부 확인이 자주 필요한 경우
→ contains() 연산이 빠름 (HashSet 기준 O(1))
📌 실전 예시:
“전세자금 대출 공고 중, 지역이 경기도이고, 용인이 아닌 항목만 필터링하고 싶을 때”
→ Set에 제외 지역("용인")을 넣어두고, 각 데이터와 비교해 필터링 가능
3. Set의 주요 구현체
Java에서는 Set 인터페이스를 구현한 대표적인 세 가지 클래스가 있습니다.
클래스 | 내부 구조 | 특징 |
HashSet | 해시 테이블 | 가장 빠름, 순서 없음 |
LinkedHashSet | 해시 테이블 + 연결 리스트 | 삽입 순서 유지 |
TreeSet | 이진 탐색 트리 (Red-Black Tree) | 정렬된 순서 유지, O(log n) |
4. HashSet 내부 구조
가장 많이 사용되는 구현체인 HashSet은 내부적으로 HashMap을 사용하여 구성됩니다.
- HashSet.add(element)
→ 실제로는 HashMap.put(element, DUMMY_VALUE)로 동작 → 값은 중요하지 않기 때문에 더미 객체를 사용 (Java 내부에서 PRESENT라는 static 객체 사용)
Set<String> set = new HashSet<>();
set.add("apple");
// 내부적으로는 다음과 유사한 동작 수행
Map<String, Object> map = new HashMap<>();
map.put("apple", PRESENT);
- key만 저장하고, value는 의미 없음 → Set은 키 중심 구조
5. Set vs List - 어떤 걸 선택해야 할까?
✅ List가 더 적합한 경우
- 데이터가 중복될 수 있다
- 삽입 순서가 중요하거나, 인덱스로 접근해야 한다
- 정렬이 필요하다
- 단순한 반복(iteration)이 목적이다
→ 특히 ArrayList는 구조가 단순하여 반복 처리에 최적화됨
데이터가 순차적이고, 대부분의 사용 목적이 저장과 순차 접근이라면
Set이 아닌 List가 기본값이다.
✅ Set이 더 적합한 경우
- 중복을 제거하거나 방지하고 싶을 때
- 빠른 검색(존재 여부 확인)이 필요할 때
- 순서나 인덱스 접근은 필요 없고, 고유한 값의 집합이 중요할 때
Q. 이미 중복이 없고 순서도 중요 없다면, List를 써도 되나?
- 기술적으로는 가능하지만,
- Set은 “중복이 발생할 여지를 원천 차단한다”는 관점에서 더 명확한 의도 표현이 가능
- 하지만 반복이 핵심이고 메모리/속도 최적화가 중요하다면 ArrayList가 더 나은 선택이 될 수 있음
단, LinkedList는 성능 특성이 다르므로 주의
6. Set의 성능 특성 (HashSet 기준)
연산 | 평균 시간복잡도 |
add() | O(1) |
remove() | O(1) |
contains() | O(1) |
※ 충돌이 많거나 capacity가 적절히 조절되지 않으면 O(n)까지 떨어질 수 있음
→ 내부적으로는 HashMap의 성능 특성과 동일
7. 정리
특성 | Set | List |
중복 허용 여부 | ❌ 허용하지 않음 | ✅ 허용함 |
순서 보장 여부 | ❌ 없음 (HashSet) | ✅ 있음 (ArrayList) |
인덱스로 접근 가능 여부 | ❌ 불가 | ✅ 가능 |
검색 속도 | 빠름 (Hash 기반) | 느림 (선형 탐색) |
용도 | 고유 값 집합 | 순차 데이터 저장 |

파이썬 , 자바 set 비교
마무리
Set은 데이터의 유일성 보장과 빠른 조회가 중요한 경우 가장 적절한 선택입니다.
특히 HashSet은 내부적으로 HashMap을 활용하기 때문에
그 구조와 동작을 이해하면 Set의 동작 원리도 자연스럽게 파악할 수 있습니다.
실무에서는 대부분의 경우 List를 기본으로 사용하지만,
데이터의 중복을 원천 차단하고, 빠른 조회가 필요할 때는 반드시 Set을 고려해야 합니다.
'자바 > 자바' 카테고리의 다른 글
(JAVA) 불변 객체 (0) | 2025.04.25 |
---|---|
(java) 값이 중복되는 객체를 제거 hash set , HashMap 사용 (1) | 2025.04.24 |
(Java) Map 구조 정리 - ADT 관점에서의 이해 (****별 다섯개****) (0) | 2025.04.23 |
(java) 기본 배열(Array), 동적 배열(Dynamic Array), 연관 배열(Associative Array)의 개념과 내부 동작 원리를 설명 (0) | 2025.04.22 |
Java Map 컬렉션 정리 – HashMap, LinkedHashMap, TreeMap (0) | 2025.04.21 |