기타/자바의 신

(자바) 컬렉션 관련 정리 (자바의신 day9)

불광동 물주먹 2025. 7. 6. 21:40

✅ 1. ArrayList vs Vector


 

항목 ArrayList Vector
쓰레드 세이프 ❌ (동기화 안됨) ✅ (모든 메서드 동기화됨)
성능 빠름 느림 (동기화 비용)
용도 단일 쓰레드 환경 멀티 쓰레드 환경 (하지만 요즘은 Collections.synchronizedList() 추천)
 

✅ 2. ArrayList의 구현 인터페이스

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, Serializable

🔹 의미별 정리


인터페이스 설명
List 순서 있는 컬렉션, 인덱스 접근 지원
RandomAccess 빠른 임의 접근 가능함을 표시 (마커 인터페이스)
Cloneable clone() 메서드 사용 가능 (마커 인터페이스)
Serializable 직렬화 가능 (마커 인터페이스)
 

📌 마커 인터페이스란?
: 내부에 메서드가 없고, "이 객체는 ~~ 기능을 가진다"는 표시 용도로 JVM이 내부적으로 체크합니다.
예: Cloneable 없으면 clone() 호출 시 CloneNotSupportedException 발생함.


✅ 3. ArrayList 생성자 3개

// 1. 기본 생성자 (초기 용량 10)
ArrayList<String> list1 = new ArrayList<>();

// 2. 초기 용량 지정
ArrayList<String> list2 = new ArrayList<>(20);

// 3. 다른 컬렉션 복사
ArrayList<String> list3 = new ArrayList<>(anotherCollection);

✅ 4. Set과 로드팩터

HashSet과 HashMap 내부는 HashMap 기반

  • load factor: 해시 충돌을 줄이기 위한 해시 테이블 재해싱 기준
  • 기본값은 0.75 → 75% 찼을 때 resize 발생
  • 예: new HashSet<>(16, 0.75f)

✅ 5. Map은 컬렉션 뷰 사용

Map<String, String> map = new HashMap<>();

// 1. Key Set View
Set<String> keys = map.keySet();

// 2. Values View
Collection<String> values = map.values();

// 3. Entry Set View (Key + Value 묶음)
Set<Map.Entry<String, String>> entries = map.entrySet();

💡 entrySet() → Map.Entry<K,V> 객체들의 Set (전체 탐색, 반복문용)


✅ 6. Map vs Hashtable


 

항목 HashMap Hashtable
동기화 ❌ (비동기) ✅ (동기화됨)
성능 빠름 느림
null 허용 key/value에 null 허용 ❌ 둘 다 불허
출시 시기 Java 1.2 이후 Java 1.0 초기부터
사용 권장 ❌ (Legacy)
 

📌 Enumeration vs Iterator

  • Hashtable의 elements()는 Enumeration 객체 반환 → 오래된 방식
  • HashMap은 Iterator 사용

✅ 7. HashMap에서 hashCode()와 equals() 재정의 이유

  • HashMap은 내부적으로 키를 저장할 때, hashCode()로 해시 계산 + equals()로 충돌 여부 확인합니다.
map.put(key, value); // 내부 동작
1. key.hashCode() → index 계산
2. 같은 index가 있을 경우 key.equals()로 동등성 비교

✅ 따라서,

  • 사용자 정의 객체를 키로 쓸 땐 hashCode() + equals() 둘 다 재정의해야 충돌 없이 정상 작동합니다.
  • 안 그러면 서로 다른 객체임에도 동일한 키로 오인하거나, 조회 실패함.

✅ 8. Properties 클래스 = Hashtable 확장

public class Properties extends Hashtable<Object, Object>

특징:

  • key와 value가 모두 String 기반이어야 함
  • 설정 파일 읽기/쓰기에 자주 사용
  • load(InputStream) / store(OutputStream) 사용 가능
  • getProperty(String key) / setProperty(String key, String value)

✅ 정리표

 

항목 설명
ArrayList 빠름, 비동기, 순차 자료에 적합
Vector 동기화 처리된 ArrayList, 레거시
Set 중복 제거, 해시 기반 HashSet이 대표
Map.entrySet() key-value 묶음을 다루는 컬렉션 뷰
Hashtable 동기화, null 불가, 구버전 스타일
HashMap 빠름, null 가능, hashCode/equals 재정의 필요
Properties 설정 저장용 클래스, Hashtable 기반
load factor 75% 차면 resize, 충돌 방지 목적