이 글에서는 연결 리스트(Linked List)에서 특정 요소에 접근하는 방법을 단계별로 알아봅니다.
java.util.LinkedList 클래스는 이중 연결 리스트(doubly-linked list) 구조로 구현되어 있어, 삽입·삭제뿐 아니라 인덱스 기반 조회 등 리스트에서 기대할 수 있는 다양한 연산을 제공합니다. 흥미로운 점은 인덱스로 요소에 접근할 때, 지정된 인덱스에 더 가까운 쪽(리스트의 시작 또는 끝)부터 탐색을 시작한다는 것입니다. 덕분에 리스트 앞부분이나 뒷부분에 가까운 요소일수록 더 빠르게 조회할 수 있습니다.
그럼 실제 예시를 통해 동작 방식을 확인해 보겠습니다.
입력값
입력 리스트: [Python, Java, Scala, Java, JavaScript]
기대 출력값
인덱스 3의 요소: Java
알고리즘
1단계 - 시작 2단계 - input_list라는 이름의 연결 리스트를 선언한다. 3단계 - 리스트에 저장할 값들을 정의한다. 4단계 - 내장 함수 get()에 인덱스 값을 전달하여 연결 리스트의 특정 요소에 접근한다. 5단계 - 결과를 출력한다. 6단계 - 종료한다.
예제 1: main 함수에서 모든 로직 처리하기
첫 번째 예제에서는 모든 연산을 main 함수 하나에 담아 절차적으로 처리합니다. 간단한 학습용 코드나 스크립트성 프로그램에 적합한 방식입니다.
import java.util.LinkedList;
public class Demo {
public static void main(String[] args) {
LinkedList<String> input_list = new LinkedList<>();
input_list.add("Python");
input_list.add("Java");
input_list.add("Scala");
input_list.add("Java");
input_list.add("JavaScript");
System.out.println("정의된 리스트: " + input_list);
String result_string = input_list.get(3);
System.out.print("인덱스 3의 요소: " + result_string);
}
}
실행 결과
정의된 리스트: [Python, Java, Scala, Java, JavaScript] 인덱스 3의 요소: Java
예제 2: 객체 지향 방식으로 메서드 분리하기
두 번째 예제에서는 요소 조회 로직을 별도의 메서드로 캡슐화하여 객체 지향 프로그래밍(OOP) 스타일로 작성했습니다. 이처럼 기능을 함수로 분리하면 코드의 재사용성과 가독성이 크게 향상되며, 유지보수도 훨씬 수월해집니다.
import java.util.LinkedList;
public class Demo {
static void get_element(LinkedList<String> input_list, int index){
String result_string = input_list.get(index);
System.out.print("인덱스 " + index + "의 요소: " + result_string);
}
public static void main(String[] args) {
LinkedList<String> input_list = new LinkedList<>();
input_list.add("Python");
input_list.add("Java");
input_list.add("Scala");
input_list.add("Java");
input_list.add("JavaScript");
System.out.println("정의된 리스트: " + input_list);
int index = 3;
get_element(input_list, index);
}
}
실행 결과
정의된 리스트: [Python, Java, Scala, Java, JavaScript] 인덱스 3의 요소: Java
참고: LinkedList의 get() 성능 특징
LinkedList의 get(index) 메서드는 해당 인덱스까지 노드를 순차적으로 탐색해야 하므로 시간 복잡도가 O(n)입니다. 반면 ArrayList는 내부 배열을 사용하기 때문에 O(1)로 즉시 접근할 수 있습니다. 따라서 잦은 인덱스 기반 조회가 필요하다면 ArrayList를, 데이터의 삽입·삭제가 빈번하다면 LinkedList를 선택하는 것이 효율적입니다.
또한 자바의 인덱스는 0부터 시작한다는 점에 유의하세요. 위 예제에서 인덱스 3은 다섯 번째가 아닌 네 번째 요소인 "Java"를 가리킵니다.