본문 바로가기
Language/Java

[JAVA] Iterator와 Enumeration의 결정적 차이 : 레거시와 현대적 설계의 이해

by Papa Martino V 2026. 1. 18.
728x90

Iterator와 Enumeration
Iterator와 Enumeration

 

 

자바 언어가 발전해 온 역사를 돌이켜보면, 컬렉션의 요소를 순회하는 방식 또한 큰 변화를 겪어왔습니다. 그 중심에는 EnumerationIterator라는 두 인터페이스가 존재합니다. 단순히 "둘 다 순회를 돕는 도구"라고 알고 있기에는 두 인터페이스 사이의 설계 철학과 기능적 차이가 매우 큽니다. 오늘은 자바 개발자라면 반드시 알아야 할 두 인터페이스의 심층적인 차이점과 왜 현대 자바에서는 Iterator를 권장하는지에 대해 분석해 보겠습니다.

1. Enumeration: 자바의 초기 유산 (Legacy)

Enumeration은 자바 1.0 시절부터 존재했던 가장 고전적인 인터페이스입니다. VectorHashtable 같은 초기 컬렉션 클래스에서 데이터를 순회하기 위해 설계되었습니다. 기능은 매우 단순하여, 다음 요소가 있는지 확인하는 hasMoreElements()와 다음 요소를 가져오는 nextElement() 단 두 가지 메서드만 제공합니다.

2. Iterator: 진화된 컬렉션 순회자

자바 1.2에서 컬렉션 프레임워크(Collection Framework)가 도입되면서 등장한 것이 Iterator입니다. Enumeration의 한계를 극복하고 표준화된 순회 방식을 제공하기 위해 설계되었습니다. Iterator는 단순히 읽기 기능만 제공하는 것이 아니라, 순회 중 안전하게 요소를 삭제할 수 있는 기능이 추가되었습니다.

3. 결정적인 차이점 분석

두 인터페이스의 기술적인 차이를 네 가지 핵심 관점에서 비교해 보겠습니다.

3.1 삭제 기능의 유무 (Fail-Fast 방식)

Iteratorremove() 메서드를 지원합니다. 이는 순회 도중에 특정 조건에 맞는 데이터를 원본 컬렉션에서 안전하게 제거할 수 있게 해줍니다. 반면 Enumeration은 오직 읽기만 가능합니다.

3.2 안정성과 Fail-Fast 전략

IteratorFail-Fast 방식을 따릅니다. 즉, 순회 도중에 다른 스레드가 컬렉션의 구조를 변경(추가/삭제)하면 즉시 ConcurrentModificationException을 발생시켜 데이터 오염을 방지합니다. 하지만 Enumeration은 이러한 메커니즘이 부족하여 상대적으로 데이터의 무결성을 보장하기 어렵습니다.

3.3 메서드 네이밍의 간결함

Enumeration의 메서드명(hasMoreElements, nextElement)은 다소 길고 복잡합니다. 반면 IteratorhasNext, 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-loopStream 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
728x90