본문 바로가기
Java

자바 컬렉션 (4) – 반복자 · 열거

by gentle-tiger 2025. 7. 2.
프로젝트 중 느낀 자바 기초의 부족함을 보완하고자 핵심 주제를 순차적으로 복습할 예정입니다.
자바 코어 → 자바 스레드 → 자바 OOP → 자바의 예외 → 자바의 컬렉션 → 최대 절전 모드 순으로 정리할 예정입니다. 

 

자바 컬렉션 - 반복자 · 열거

  1. 열거형과 반복자의 차이점은 무엇입니까?
  2. 열거형의 제한 사항은 무엇입니까?
  3. 열거형과 열거형의 차이점은 무엇인가요?
  4. Iterator와 ListIterator의 차이점은 무엇입니까?

 

열거형(Enumeration)과 반복자(Iterator)의 차이점은 무엇입니까?

Enumeration은 JDK 1.0 시절부터 존재하는 레거시 인터페이스로 읽기 전용 순회만 허용하며, 제네릭을 지원하지 않아 타입 안전성이 떨어집니다. 반면 Iterator는 제네릭으로 컴파일 타임 타입 검사를 통과하며 remove()·forEachRemaining()·fail-fast 검사(구조적 변경 시 ConcurrentModificationException 발생)까지 지원하므로 안전성과 편의성이 모두 탁월합니다. 이러한 이유로 새 코드를 작성할 때는 Iterator 사용이 권장됩니다.

 

열거형(Enumeration)의 제한 사항은 무엇입니까?

Enumeration은 제네릭을 지원하지 않아 컴파일 단계 타입 검사가 불가능하고, 요소 추가·삭제가 불가해 사실상 읽기 전용입니다.
fail-fast 로직과 자체 동기화가 없어 순회 중 컬렉션이 변경돼도 예외가 발생하지 않아 스레드 안전성이 낮습니다. 또 단방향 이동만 가능해 탐색 유연성이 부족하며 람다·스트림 등 현대 API와의 결합력이 떨어집니다. 다만 구현이 단순·경량이어서 Java Card처럼 메모리 제약이 극심한 환경이나 레거시 라이브러리 유지 시에만 제한적으로 사용됩니다.

 

enum 타입과 Enumeration의 차이점은 무엇인가요?

enum은 타입 안전 상수를 표현하기 위한 언어 기능으로, 컴파일 시마다 java.lang.Enum을 상속하는 클래스를 생성하여 name(), ordinal(), values() 같은 메서드를 제공합니다. 반면 Enumeration은 컬렉션 요소 순회를 위한 인터페이스로 EnumSet은 숫자 인덱스르 비트로 매핑하고, EnumMap은 배열 인덱스를 값으로 삼아 해시 테이블을 배제합니다. 따라서 상수 개수가 고정된 영역에서는 메모리와 성능이 크게 최적화됩니다. 

 

Iterator와 ListIterator의 차이점은 무엇입니까?

ListIterator는 양방향 이동, 인덱스 조회, 요소 추가 ㅊ치 기능을 제공합니다. 반면 Iterator는 단방향 순회와 remove만 지원해 기능이 더 간결합니다. 집합은 수학적으로 순서 개념이 없기 때문에 인덱스 기반 양방향 이동이라는 의미 자체가 부적합하여 Set에는 단방향Iterator만 존재합니다.