프로젝트 중 느낀 자바 기초의 부족함을 보완하고자 핵심 주제를 순차적으로 복습할 예정입니다.
자바 코어 → 자바 스레드 → 자바 OOP → 자바의 예외 → 자바의 컬렉션 → 최대 절전 모드 순으로 정리할 예정입니다.
자바 컬렉션 - 구현 클래스
- Vector 클래스에 대해 설명하시오.
- ArrayList와 Vector의 차이점은 무엇입니까?
- ArrayList의 동기화된 버전을 어떻게 얻을 수 있습니까?
- 컬렉션 개체의 크기와 용량의 차이는 무엇입니까?
- ArrayList와 Linked List의 차이점은 무엇입니까?
- 컬렉션 프레임워크에 존재하는 레거시 클래스와 인터페이스는 무엇입니까?
1. Vector 클래스
Vector는 레거시 동기화 동적 배열로, 초기 용량과 배증 계수를 지정할 수 있으며 모든 연산이 원자적으로 보호됩니다. 초기 자바에서 Stack이 Vector를 상속해 “LIFO 전용 Vector”로 코드 중복을 피했지만, 단일 상속이라 인터페이스 추상화가 어렵고 현대 관점에선 바람직하지 않은 설계로 평가됩니다. 현재 Vector·Stack은 Soft-deprecated 리스트에 올라 있어 “새 코드에서 사용하지 말라”는 권고가 있으며, 직렬화 호환성 때문에 제거 계획은 없습니다. 결국 동시성이 필요하면 ArrayList에 Collections.synchronizedList 래퍼를 두는 편이 더 유연합니다.
2. ArrayList와 Vector의 차이점
두 구현체는 동기화 정책과 배열 확장 배율이 다릅니다. ArrayList는 비동기 + 1.5배 확장, Vector는 전역 동기화 + 2배 확장을 사용해 단일 스레드·읽기 위주 환경에서는 ArrayList가 더 가볍고 빠릅니다. 동기화를 래퍼로 얻을 때는 Collections.synchronizedList가 각 메서드 진입 시 synchronized 블록을 걸어 Vector와 동일한 락 오버헤드가 생기지만, 구현체 교체 유연성이 큽니다. JPMS 기준으로 Vector는 java.se 모듈을 요구해 최소 모듈 구성을 원할 때는 피하는 것이 좋습니다.
3. ArrayList의 동기화 버전 확보
와 같이 래퍼를 씌워 메서드 단위 동기화를 확보합니다. 단, 복합 연산은 외부에서 직접 synchronized(sync){ … } 형태로 감싸야 합니다. 읽기 99 % 이상 환경이라면 CopyOnWriteArrayList가 좋은 대안이지만, 대량 수정이 잦으면 복사 비용과 GC 부하가 커집니다. Project Loom의 StructuredLock을 쓰면 컬렉션을 감싸지 않고도 코드 블록 단위로 락 범위를 한정하는 우아한 방법을 택할 수 있습니다.
4. 크기(size)와 용량(capacity)
크기는 실제 요소 수, 용량은 내부 배열이 담을 수 있는 최대 요소 수입니다. 용량이 가득 차면 배열 재할당·복사 비용이 발생합니다. 예상 요소 수를 new ArrayList<>(expectedSize)로 미리 지정하면 복사 횟수를 줄이고 GC 부하를 낮출 수 있습니다. 반면 LinkedList는 노드 연결 구조라 capacity 개념이 없고 확장도 전체 복사를 일으키지 않습니다.
5. ArrayList vs LinkedList
ArrayList는 랜덤 접근 O(1), 중간 삽입·삭제 O(N)이며, LinkedList는 노드 탐색을 제외한 삽입·삭제 O(1), 랜덤 접근 O(N)입니다. 포인터 오버헤드 때문에 LinkedList가 메모리를 더 사용합니다. LinkedList는 Deque를 구현해 앞뒤 양쪽 O(1) 삽입·삭제가 가능해 큐·스택·데크 모두로 활용됩니다. 최신 HotSpot JIT가 배열 인덱스 연산을 벡터화해 ArrayList의 캐시 효율이 높고, 연결 리스트는 분기 예측 실패와 캐시 미스가 빈번합니다.
6. 레거시 클래스·인터페이스
컬렉션 프레임워크의 레거시 구성요소는 클래스: Vector, Stack, Hashtable, Properties와 인터페이스/추상: Dictionary, Enumeration입니다. 현대 코드에선 각각 ArrayList·Deque·ConcurrentHashMap·Map·Iterator 등 최신 대응체 사용이 권장됩니다. 그럼에도 Properties는 설정 파일 처리 편의성과 JDBC, 스프링 등 구(舊) API 호환성 덕에 여전히 쓰이며, Hashtable의 단일 락 모델은 ConcurrentHashMap의 세그먼트 락·CAS 방식에 비해 읽기 성능이 수십 배 떨어집니다.
'Java' 카테고리의 다른 글
자바 컬렉션 (5) – 정렬 · 비교 (0) | 2025.07.02 |
---|---|
자바 컬렉션 (4) – 반복자 · 열거 (0) | 2025.07.02 |
자바 컬렉션 (2) – 핵심 인터페이스 (0) | 2025.07.02 |
자바 컬렉션 (1) – 기본 개념 (0) | 2025.07.02 |
자바 OOP (4) - 인터페이스와 추상 클래스 (0) | 2025.06.17 |