2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

[자바]iterator 개념부터 적용까지 알아보자

2022. 11. 27. 12:36ㆍJAVA 기초

iterator

자바에서 iterator란 컬렉션 프레임워크에서 값을 가져오는 용도로 사용됩니다.

그렇기에 값들을 출력할때는 iteraotr를 써서 값을 출력해야 합니다.

Iteraotr를 사용한다면 데이터의 자료들을 조금 더 쉽게 가져 올 수 있습니다.

 

 

iterator의 메서드

 

iterator의 메서드는 대표적으로 이렇게 있습니다.

가장 많이 쓰는 값은

  • hasNext()
  • next()
  • remove()

입니다.

hasNext()의 경우 값이 있다면 true 없다면 false를 반환하기 때문에

반복문에 많이 넣습니다. 값이 없을때까지 무한 반복문을 실행시킵니다.

 

next()의 경우는 값을 읽어올 때 사용합니다. 즉 값을 출력할때 사용한다는 뜻입니다.

 

remove()의 경우 값을 제거할 때 사용합니다.

 

hasnext(),next()사용 예제 보기

 

 public static void main(String[] args) {
    ArrayList list = new ArrayList();
    list.add(1);
    list.add(2); list.add(3); list.add(4);
    
    Iterator iterator = list.iterator();
    while (iterator.hasNext())
        System.out.println(iterator.next()); // 값 1 2 3 출력
}

 

 

 

 

iterator의 사용 조건

iterator는 List와 Set의 자료구조에 포함되어있는 메서드입니다.

그렇기 때문에 MAP같은 자료구조는 iterator를 사용 할 수 없습니다.

  • SET
  • LIST

 

사용방법

사용방법은 간단합니다.

어떤 자료구조를 생성하고 그 자료구조 값안에 iterator에 대입 시키면 됩니다.

사진으로 본다면

저는 TreeSet 객체를 생성 했습니다.

그 참조 변수값을 iterator에 넣었고 이러면 iterator로 사용이 가능 합니다.

 

public class EX11_12 {

    public static void main(String[] args) {
        Set set = new TreeSet();
      set.add(1);
      set.add(2);
      set.add(3);
      set.add(4);
      Iterator iterator = set.iterator();

        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

예시코드로 한번 봅시다.

저는 Treeset을 만들었고 그 값에 1,2,3,4의 정수를 집어 넣었습니다.

그 후에 set의 메서드를 iterator의 넣었고

iterator의 메서드를 이용해서 값들을 출력 했습니다.

잘 나오는 것을 확인 할 수 있습니다.

 

iterator를 쓰는 이유?

그러면 문득 생각이 들 수 있습니다.

그냥 반복문으로 돌리면 되는 부분을 왜 iterator를 사용해서 값들을 출력하는지

이해가 안될 수 있습니다.

그 이유는 앞서 설명드렸다 싶이 데이터를 손쉽게 제어하기 위해서입니다.

iterator를 사용한다면 

hasnext()

next()등의 iterator의 고유한 메서드를 사용 할 수 있기 때문에

자료를 쉽게 출력하는 것이 가능합니다.

 

객체 값을 집어 넣을땐?

저희는 객체 값을 넣는 경우도 많이 발생합니다.

하지만 iterator를 사용할때 이 방법을 모를 경우 객체 주소 값이 반환이 됩니다.

또한 iterator는 toString으로 오버라이딩 해도 객체 주소값이 반환이 됩니다.

 

package 자바의정석;

import java.util.*;

public class EX11_12 {

    public static void main(String[] args) {
        Set set = new TreeSet();
     set.add(new Test(5,"hi"));
        set.add(new Test(10,"no"));
      Iterator iterator = set.iterator();
      System.out.println(iterator);
    }
}

    class Test implements Comparable {
        int number;
        String name;

        Test(int number, String name) {
            this.name = name;
            this.number = number;
        }

        @Override
        public int compareTo(Object o) {
            return -1;
        }

        public String toString() {
            return "number은 :" + number + ":" + "name은 :" + name;
        }
    }

 

저는 Test 클래스에 생성자를 만든 후 toString으로 값들을 오버라이딩 했습니다.

원래라면 값들이 잘 출력이 되어야 하는데..

이렇게 객체 주소 값들이 반환이 됩니다.

그 이유는 무엇일까요?

쉽게 생각해서 iterator는 데이터를 만질 때 자기 고유한 메서드로 제어를 해야 합니다

그렇기 떄문에 toString의 오버라이딩+hasnext()로 값들을 출력해야 합니다.

 

 

이렇게 while문을 사용함과 동시에 iterator의 next를 이용해서 값들을 출력해야만 정상적인 값들이 나오게 됩니다.

 

 

오버라이딩 한 대로 잘 나오는 것을 확인 할 수 있습니다.