자바(Java)는 컬렉션 객체에 저장된 요소들을 순회하며 가져올 수 있도록 Iterator와 ListIterator 클래스를 제공합니다. 이 두 인터페이스가 제공하는 핵심 메서드 중 하나가 바로 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()를 호출하는 패턴을 사용하는 것이 표준적이며 안전한 방법입니다.