변수의 기록

(Java) Set의 구조와 활용 - ADT 관점으로 이해 본문

자바/자바

(Java) Set의 구조와 활용 - ADT 관점으로 이해

불광동 물주먹 2025. 4. 23. 00:58

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을 고려해야 합니다.