자바/정리

(Java) Iterator

acid7937 2023. 1. 16. 04:02

지금까지 컬랙션의 대표적인 기능들인 List, Set, Map에 대하여 알아보았다.

이들은 각자 사용되는 메서드들도 다르고 자료를 저장하는 형태도 다르다.

 

List에는 get이라는 메서드를 사용하여 값들을 출력할수가 있는데 Set에서는 지원하지 않기에 사용이 불가능하다.

 

Iterator를 사용해 주면 코드의 변경없이 List에서 Set으로 변경이 가능하다. 간단한 예제를 한번 살펴보자.

 

public class Main {
    public static void main(String[] args) {
        List<String> groupA = new ArrayList();

        groupA.add("orange");
        groupA.add("banana");
        groupA.add("apple");
        groupA.add("melon");
        groupA.add("peach");
        groupA.add("watermelon");

        for(int i = 0; i<groupA.size(); i++) {
            System.out.println(groupA.get(i));
        }
        }}

전에 만든걸 가지고 왔다  물론 출력은 아래처럼 나올것이다.

orange
banana
apple
melon
peach
watermelon

 

하지만 List를 Set으로 바꾸면 get 때문에 컴파일 에러가 날것이다. 굳이 코드를 올리진 않겠다. 에러뜬다.

 

그래서 iterator를 써주면 이러한 문제를 해결할수가 있다.

public class Main {
    public static void main(String[] args) {
        List<String> groupA = new ArrayList();

        groupA.add("orange");
        groupA.add("banana");
        groupA.add("apple");
        groupA.add("melon");
        groupA.add("peach");
        groupA.add("watermelon");

//        for(int i = 0; i<groupA.size(); i++) {
//            System.out.println(groupA.get(i));
//        }
        Iterator<String> it = groupA.iterator();
        while (it.hasNext()) {
            Object obj = it.next();
            System.out.println(obj);
        }
        }}

 

똑같이 출력된다.

 

Set으로 수정없이 바꿀수도 있다.

public class Main {
    public static void main(String[] args) {
        Set<String> groupA = new HashSet();

        groupA.add("orange");
        groupA.add("banana");
        groupA.add("apple");
        groupA.add("melon");
        groupA.add("peach");
        groupA.add("watermelon");

        Iterator<String> it = groupA.iterator();
        while (it.hasNext()) {
            Object obj = it.next();
            System.out.println(obj);
        }
        }}

물론 출력은 같다.

 

 

개발자는 귀찮은걸 싫어한다. 그냥 Collection으로 다형성 적용을 해도 된다. 그럼 뒤에만 바꾸면 되겠지?

Collection<String> groupA = new HashSet();

결과는 같다.

 

추가로 iterator는 한번만 사용이 가능하며 일회성이라고 말할수 있다.

while (it.hasNext()) {
    Object obj = it.next();
    System.out.println(obj);
}

while (it.hasNext()) {
    Object obj = it.next();
    System.out.println(obj);
}

이렇게 하면 상식적으로 두번 출력되어야 하는데 그렇지가 않다 왜냐하면 일회성 이기 때문.

 

Iterator<String> it = groupA.iterator();
while (it.hasNext()) {
    Object obj = it.next();
    System.out.println(obj);
}

Iterator<String> it2 = groupA.iterator();
while (it2.hasNext()) {
    Object obj = it2.next();
    System.out.println(obj);
}

이런식으로 iterator를 한번더 선언해 줘야 쓸수가 있다.

 

 

 

이처럼 iterator를 사용해주면 유지보수가 쉬워질수 있다.

 

 

그러나 사실 나는 enhanced for문을 사용하는걸 더욱 선호한다.

 

public class Main {
    public static void main(String[] args) {
        Collection<String> groupA = new HashSet();

        groupA.add("orange");
        groupA.add("banana");
        groupA.add("apple");
        groupA.add("melon");
        groupA.add("peach");
        groupA.add("watermelon");
        
        for(String str : groupA) {
            System.out.println(str);
        }
    }
}

하... 속이다 시원하다. 

 

 

 

 

검색하여 알아낸 iterator를 쓰는 이유는

1.캡슐화에 도움이 된다.(hasNext가 인덱스를 숨긴다고 해서란다.)

2.수정이 적어져서 유지보수에 좋다.(지금까지 위에 내용들임)

 

 

 

Map이라고 뭐 다를건 없다.

public class Main {
    public static void main(String[] args) {

        TreeMap<String,String> loginInfo = new TreeMap();


        loginInfo.put("memberA","as1234");
        loginInfo.put("memberB","gha551");
        loginInfo.put("memberC","51gg12+");

        for(String str : loginInfo.keySet()) {
            String value = loginInfo.get(str);
            System.out.println(str+ " "+ value);
        }
    }
}

출력은 다음과 같다.

정말 편리하게 출력을 하고 있다.

 

 

 

Iterator를 한번 써볼까?

public class Main {
    public static void main(String[] args) {

        HashMap<String,String> loginInfo = new HashMap();


        loginInfo.put("memberA","as1234");
        loginInfo.put("memberB","gha551");
        loginInfo.put("memberC","51gg12+");

        Set set = loginInfo.entrySet();
        Iterator it = set.iterator();
        while (it.hasNext()){
            Map.Entry e = (Map.Entry) it.next();
            System.out.println(e.getKey() + " " + e.getValue());
        }
    }
}

출력은 같다.

 

하지만 Map은 Iterator도 지원을 안해서 코드가 다소 길어진다.