
자바 언어가 발전해 온 역사를 돌이켜보면, 컬렉션의 요소를 순회하는 방식 또한 큰 변화를 겪어왔습니다. 그 중심에는 Enumeration과 Iterator라는 두 인터페이스가 존재합니다. 단순히 "둘 다 순회를 돕는 도구"라고 알고 있기에는 두 인터페이스 사이의 설계 철학과 기능적 차이가 매우 큽니다. 오늘은 자바 개발자라면 반드시 알아야 할 두 인터페이스의 심층적인 차이점과 왜 현대 자바에서는 Iterator를 권장하는지에 대해 분석해 보겠습니다.
1. Enumeration: 자바의 초기 유산 (Legacy)
Enumeration은 자바 1.0 시절부터 존재했던 가장 고전적인 인터페이스입니다. Vector나 Hashtable 같은 초기 컬렉션 클래스에서 데이터를 순회하기 위해 설계되었습니다. 기능은 매우 단순하여, 다음 요소가 있는지 확인하는 hasMoreElements()와 다음 요소를 가져오는 nextElement() 단 두 가지 메서드만 제공합니다.
2. Iterator: 진화된 컬렉션 순회자
자바 1.2에서 컬렉션 프레임워크(Collection Framework)가 도입되면서 등장한 것이 Iterator입니다. Enumeration의 한계를 극복하고 표준화된 순회 방식을 제공하기 위해 설계되었습니다. Iterator는 단순히 읽기 기능만 제공하는 것이 아니라, 순회 중 안전하게 요소를 삭제할 수 있는 기능이 추가되었습니다.
3. 결정적인 차이점 분석
두 인터페이스의 기술적인 차이를 네 가지 핵심 관점에서 비교해 보겠습니다.
3.1 삭제 기능의 유무 (Fail-Fast 방식)
Iterator는 remove() 메서드를 지원합니다. 이는 순회 도중에 특정 조건에 맞는 데이터를 원본 컬렉션에서 안전하게 제거할 수 있게 해줍니다. 반면 Enumeration은 오직 읽기만 가능합니다.
3.2 안정성과 Fail-Fast 전략
Iterator는 Fail-Fast 방식을 따릅니다. 즉, 순회 도중에 다른 스레드가 컬렉션의 구조를 변경(추가/삭제)하면 즉시 ConcurrentModificationException을 발생시켜 데이터 오염을 방지합니다. 하지만 Enumeration은 이러한 메커니즘이 부족하여 상대적으로 데이터의 무결성을 보장하기 어렵습니다.
3.3 메서드 네이밍의 간결함
Enumeration의 메서드명(hasMoreElements, nextElement)은 다소 길고 복잡합니다. 반면 Iterator는 hasNext, next와 같이 직관적이고 간결한 명칭을 사용하여 가독성을 높였습니다.
4. Iterator와 Enumeration 비교표
| 비교 항목 | Enumeration | Iterator |
|---|---|---|
| 등장 버전 | JDK 1.0 (Legacy) | JDK 1.2 (Collection Framework) |
| 삭제 기능 | 지원하지 않음 (Read-only) | 지원함 (remove() 메서드 존재) |
| 안정성 | Fail-safe 하지 않음 | Fail-fast 방식 채택 |
| 적용 대상 | Vector, Hashtable 등 레거시 클래스 | ArrayList, HashSet 등 현대적 컬렉션 |
| 메서드 가독성 | 길고 장황함 | 짧고 간결함 |
5. 결론: 무엇을 사용해야 하는가?
결론은 명확합니다. "특별한 이유가 없다면 무조건 Iterator를 사용하십시오." Enumeration은 현재 자바에서 하위 호환성을 위해 유지되고 있는 수준이며, 현대적인 애플리케이션 개발에서는 Iterator 혹은 이를 더 단순화한 Enhanced for-loop나 Stream API를 사용하는 것이 성능과 안정성 면에서 압도적으로 유리합니다. 다만, 오래된 외부 라이브러리나 HttpServletRequest의 속성을 가져오는 작업 등에서 여전히 Enumeration이 반환되는 경우가 있으므로, 그 차이를 정확히 인지하고 상황에 맞게 대응하는 능력이 중요합니다.
내용 출처 및 참고 문헌
- Oracle Java SE Documentation: Interface Iterator<E>
- Oracle Java SE Documentation: Interface Enumeration<E>
- Java Performance: The Definitive Guide by Scott Oaks
- Baeldung: Difference Between Enumeration and Iterator in Java
'Language > Java' 카테고리의 다른 글
| [JAVA] Vector vs ArrayList : 현대 자바 개발자가 ArrayList를 선택하는 결정적 이유 (0) | 2026.01.18 |
|---|---|
| [JAVA] Comparable vs Comparator : 객체 정렬의 두 가지 핵심 전략 완벽 가이드 (0) | 2026.01.18 |
| [JAVA] TreeSet과 TreeMap의 심층 이해 : 정렬의 원리와 이진 탐색 트리의 마법 (0) | 2026.01.18 |
| [JAVA] HashMap의 심층 작동 원리 : 성능 최적화와 내부 구조의 이해 (0) | 2026.01.18 |
| [JAVA] HashMap과 Hashtable의 차이 : 실무에서 무엇을 선택해야 할까? (0) | 2026.01.18 |