Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바 컬렉션에서 next()와 hasNext()의 차이점은 무엇일까?

자바(Java)는 컬렉션 객체에 저장된 요소들을 순회하며 가져올 수 있도록 IteratorListIterator 클래스를 제공합니다. 이 두 인터페이스가 제공하는 핵심 메서드 중 하나가 바로 hasNext()next()인데, 많은 초보 개발자들이 이 둘의 역할을 혼동하곤 합니다. 지금부터 각 메서드의 차이점을 예제와 함께 자세히 살펴보겠습니다.

hasNext() 메서드란?

hasNext()는 커서가 가리키는 위치 다음에 요소가 더 존재하는지 여부를 확인하는 메서드입니다. 다음 요소가 존재하면 true를, 더 이상 요소가 없으면 false를 반환합니다. 즉, 실제로 요소를 가져오지 않고 단순히 존재 여부만 검사한다는 점이 특징입니다.

사용 예제

import java.util.ArrayList;
import java.util.Iterator;

public class hasNextExample {
    public static void main(String[] args) {
        // ArrayList 객체 생성
        ArrayList<String> list = new ArrayList<String>();
        list.add("JavaFX");
        list.add("Java");

        Iterator<String> it = list.iterator();

        System.out.println(it.hasNext()); // 다음 요소 존재 → true
        it.next();                        // 첫 번째 요소 소비

        System.out.println(it.hasNext()); // 다음 요소 존재 → true
        it.next();                        // 두 번째 요소 소비

        System.out.println(it.hasNext()); // 더 이상 요소 없음 → false
    }
}

실행 결과

true
true
false

위 예제에서 볼 수 있듯이, next()를 호출할 때마다 커서가 한 칸씩 앞으로 이동하며, 모든 요소를 소비한 후에는 hasNext()false를 반환하는 것을 확인할 수 있습니다.

next() 메서드란?

next()는 Iterator와 ListIterator가 실제로 다음 요소를 반환하는 메서드입니다. 호출될 때마다 커서를 다음 위치로 이동시키고, 그 위치의 요소를 리턴합니다. 만약 더 이상 요소가 없는 상태에서 next()를 호출하면 NoSuchElementException이 발생하므로, 반드시 hasNext()와 함께 사용하는 것이 안전합니다.

사용 예제

import java.util.ArrayList;
import java.util.Iterator;

public class nextExample {
    public static void main(String[] args) {
        // ArrayList 객체 생성
        ArrayList<String> list = new ArrayList<String>();
        list.add("JavaFX");
        list.add("Java");
        list.add("WebGL");
        list.add("OpenCV");
        list.add("OpenNLP");
        list.add("JOGL");
        list.add("Hadoop");
        list.add("HBase");
        list.add("Flume");
        list.add("Mahout");
        list.add("Impala");

        System.out.println("ArrayList 내용 (첫 번째부터 마지막까지):");

        Iterator<String> it = list.iterator();
        while (it.hasNext()) {   // 다음 요소가 있는 동안 반복
            System.out.println(it.next()); // 요소를 하나씩 꺼내 출력
        }
    }
}

실행 결과

ArrayList 내용 (첫 번째부터 마지막까지):
JavaFX
Java
WebGL
OpenCV
OpenNLP
JOGL
Hadoop
HBase
Flume
Mahout
Impala

핵심 차이점 정리

구분hasNext()next()
역할다음 요소의 존재 여부 확인다음 요소를 실제로 반환
반환값boolean (true / false)컬렉션의 요소 객체
커서 이동이동하지 않음다음 위치로 이동함
주의 사항요소가 없으면 false 반환요소가 없으면 NoSuchElementException 발생

결론적으로, hasNext()는 "다음 요소가 있니?"라고 묻는 메서드이고, next()는 "그럼 다음 요소를 줘!"라고 요청하는 메서드입니다. 따라서 일반적인 컬렉션 순회 시에는 while(it.hasNext()) 조건문과 함께 it.next()를 호출하는 패턴을 사용하는 것이 표준적이며 안전한 방법입니다.