LinkedList는 포인터를 통해 순차적으로 연결된 노드(node) 그룹으로 구성된 자료구조입니다. LinkedList는 동적 배열(dynamic array)처럼 동작할 수 있으며, 각 요소마다 Node라고 불리는 별도의 메모리 블록에 공간을 할당합니다. 각 노드는 두 개의 필드를 가집니다. 하나는 리스트가 담고 있는 요소를 저장하는 "data" 필드이고, 다른 하나는 한 노드를 다음 노드와 연결하는 포인터 역할을 하는 "next" 필드입니다.
자바에서 LinkedList의 요소를 반복(iterate)하는 방법은 크게 세 가지가 있습니다. 각각의 방법과 예제 코드를 살펴보겠습니다.
1. Iterator 사용하기
Iterator 인터페이스를 이용하면 LinkedList의 요소를 안전하게 순회할 수 있습니다. hasNext() 메서드로 다음 요소의 존재 여부를 확인하고, next() 메서드로 해당 요소를 가져오는 방식으로 동작합니다.
예제
import java.util.*;
public class LinkedListIteratorTest {
public static void main(String[] args) {
List<String> list = new LinkedList<>();
list.add("Kohli");
list.add("Morgan");
list.add("Williamson");
list.add("Smith");
list.add("Kohli");
Iterator it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
실행 결과
Kohli Morgan Williamson Smith Kohli
2. ListIterator 사용하기
ListIterator 인터페이스를 통해서도 LinkedList의 요소를 순회할 수 있습니다. ListIterator는 Iterator를 확장한 것으로, 양방향(앞뒤) 탐색은 물론 요소의 추가·수정 등 더 많은 기능을 제공한다는 장점이 있습니다.
예제
import java.util.*;
public class LinkedListWithListIteratorTest {
public static void main(String[] args) {
List<String> list = new LinkedList<>();
list.add("Kohli");
list.add("Morgan");
list.add("Williamson");
list.add("Smith");
list.add("Kohli");
ListIterator<String> li = list.listIterator();
while(li.hasNext()) {
System.out.println(li.next());
}
}
}
실행 결과
Kohli Morgan Williamson Smith Kohli
3. For-each 루프 사용하기
for-each 루프(향상된 for문)를 사용하면 별도의 반복자 객체 없이 가장 간결한 문법으로 LinkedList의 요소를 순회할 수 있습니다. 단순히 모든 요소를 읽기만 할 경우 가장 권장되는 방식입니다.
예제
import java.util.*;
public class LinkedListForEachTest {
public static void main(String[] args) {
List<String> list = new LinkedList<>();
list.add("Kohli");
list.add("Morgan");
list.add("Williamson");
list.add("Smith");
list.add("Kohli");
for(String str : list) {
System.out.println(str);
}
}
}
실행 결과
Kohli Morgan Williamson Smith Kohli
세 가지 방법 모두 동일한 출력 결과를 보여주지만, Iterator와 ListIterator는 순회 중 요소를 제거하거나 수정할 수 있는 반면, for-each 루프는 코드가 간결하다는 장점이 있습니다. 용도에 맞게 적절한 방법을 선택해 사용하시기 바랍니다.