카테고리 없음

Enumeration, Iterator 넌 내꺼야

kingmusung 2024. 3. 12. 18:15

개요.

request.getParameterNames().asIterator().

forEachRemaining(paramsname-> System.out.println("paramsname"+paramsname));

위 코드에서 파라미터로 들어온 변수들이 Enumeration 형식으로 받아지고 그 형식을

asiterator()를 사용하여 iterator 형식으로 데이터를 변환을 하는 과정을 보던중

Enumeration과 Iterator가 무엇인지 궁금해짐.

 


Enumeration과 Iterator가 무엇일까.

공통점

Enumeration, Iterator 둘다 컬렉션의 요소를 반복하는데 사용됩니다.

Enumeration

 자바 구 버전 부터 있던 인터페이스고, 주요 컬렉션(AllayList등)에 포함이 안되어 있다.

 요소를 오직 반복하는데만 사용이 되고, 추가, 삽입, 삭제 연산이 안된다.

 hasNext(), hasMoreNext(), asIterator() 세가지 매서드 밖에 지원이 안된다.

("command + y" 로 인터페이스 확인)

 유연하지 않아서 거의 사용하지 않는다고 한다.

 

Iterator

주요 컬렉션에 포함이 되어 있다.

 Enumeration과 달리 요소를 반복하면서 추가, 삽입, 삭제 연산이 지원이 된다. 이 와 같은 장점으로 인해 Iterator를 사용하는걸 권장한다.

 


사용법(연습)

사용연습은

1. Collection -> Enumeration -> Iterator

2. Vector -> Enumeration -> Iterator

3. Collection -> Iterator

4. Vector -> Iterator

네가지 케이스에 대해서 연습을 해보았다.

 

Collection -> Enumeration -> Iterator

System.out.println("Collection으로 생성된 변수를 -> Enumeration, Iterator 타입으로 변환 후 출력");
System.out.println("Iterator 생성시 Collection -> Enumeration -> Iterator 순서로 변환");
List<Integer> collectiontest = new ArrayList<>();
collectiontest.addFirst(11);
collectiontest.addFirst(12);
collectiontest.addFirst(13);
Enumeration<Integer> colenumeration = Collections.enumeration(collectiontest);
Iterator<Integer> coliterator = colenumeration.asIterator();

while(colenumeration.hasMoreElements()){
    int value = colenumeration.nextElement();
    System.out.println("Collection Enumeration 의 요소 : "+value);
}
while (coliterator.hasNext()){
    int value = coliterator.next();
    System.out.println("Collection Iterator의 요소 : "+ value);
}

 

Collection.enumeration(컬렉션 변수 이름) 을 사용하여 Enumeration 타입으로 변환.

Eumeration인터페이스에 있는 asIterator()메서드를 이용하여 Iterator 타입으로 변환.

 

Vector -> Enumeration -> Iterator

System.out.println("Vector로 생성된 변수를 -> Enumeration -> Iterator 타입으로 변환 후 출력");
Vector<Integer> vectortest = new Vector<>();
vectortest.add(13);
vectortest.add(14);
vectortest.add(15);
Enumeration<Integer> venumeration = vectortest.elements();
Iterator<Integer> viterator = venumeration.asIterator();

while(venumeration.hasMoreElements()){
    int value = venumeration.nextElement();
    System.out.println("Vector Enumeration 의 요소 : "+value );
}
while (viterator.hasNext()){
    int value = viterator.next();
    System.out.println("Vector Iterator의 요소 : "+ value);
}

 

Collection.enumeration() 이 아닌 Vector는 elements()를 사용하면 Enumeration 타입으로 변환이 된다.

 

asIterator를 사용 해서 Iterator 타입으로 변환하는건 Collection과 동일하다.

 

Collection -> Iterator

System.out.println("Iterator 생성시 Collection -> Iterator 순서로 변환");
System.out.println("Enumeration 생략 후 바로 Iterator 생성");

List<Integer> testlist = new ArrayList<>();
testlist.add(1);testlist.add(2);testlist.add(3);
Iterator<Integer> testiterator = testlist.iterator();

while(testiterator.hasNext()){
    int value = testiterator.next();
    System.out.println("Collection -> Iterator 바로 변환 후 출력 : "+ value);
}

 

Vector -> Iterator

 Vector<Integer> testvector= new Vector<>();
        testvector.add(1);testvector.add(2);testvector.add(3);
//        Iterator<Integer> testiterator2 = testvector.elements().asIterator(); 이렇게 해도 됌
        Iterator<Integer> testiterator2 = testvector.iterator();

        while (testiterator2.hasNext()){
            int value = testiterator2.next();
            System.out.println("Vector -> Iterator 바로 변환 후 출력 : "+ value);
        }

 

바로 iterator로 변환하는 방법은 collection에 있는 iterator() 메서드를 사용하면 Iterator 형식으로 손쉽게 변환을해준다.


Enumeration 과 Iterator의 인터페이스

command+y 를 통해 인터페이스를 확인

Enumeration

hasMoreElements(): 열거형에 더 많은 요소가 있는지 여부를 반환합니다. 

nextElement(): 열거형에서 다음 요소를 반환합니다.

 

Iterator

hasNext(): 반복할 요소가 더 있는지 확인합니다. 

next(): 다음 요소를 반환합니다. void remove(): 현재 요소를 컬렉션에서 제거합니다. (optional)

forEachRemaining(): 남아있는 요소를 전부 반환을 해줌, while문을 구현을 안해도 됩니다.

 

주의사항

asIterator()은 Collection에 있는 메서드이다.


command + y로 인터페이스를 확인을 하는 방법을 최근에 알았는데 알고나니 검색하는 시간도 줄고 구조적으로 완벽하게 이해는 하지 못해도 대략 어떻게 동작하는지 알 수 있어서 좋은거 같다.