이 글에서는 Java에서 리스트(List) 내부의 하위 목록(sublist)을 찾는 방법을 알아봅니다. 리스트는 요소를 순차적으로 저장하고 접근할 수 있는 순서가 있는 컬렉션으로, 인덱스 기반 메서드를 통해 요소를 삽입·수정·삭제·검색할 수 있으며 중복 요소도 허용합니다. 이러한 리스트의 일부분 또는 부분 집합을 하위 목록(sublist)이라고 합니다.
Java에서는 List 인터페이스가 제공하는 subList(int fromIndex, int toIndex) 메서드를 사용하면 간단하게 하위 목록을 추출할 수 있습니다. 이 메서드는 fromIndex(포함)부터 toIndex(미포함) 바로 앞까지의 요소들로 구성된 뷰(view)를 반환합니다.
아래는 전체 동작 과정을 보여주는 예시입니다.
입력값 −
Input list: [101, 102, 103, 104, 105, 106, 107, 108, 109] Start Index: 3 End Index: 6
원하는 출력 결과 −
인덱스 3 위치부터 인덱스 6 위치 사이의 요소: [104, 105, 106]
알고리즘
Step 1 - 시작 Step 2 - 정수형 리스트 input_list를 선언한다. Step 3 - 값을 정의한다. Step 4 - subList(3, 6) 함수를 사용해 인덱스 3부터 6 사이의 하위 목록을 생성한다. Step 5 - 결과를 출력한다. Step 6 - 종료한다.
예제 1: main 함수에서 모든 작업 처리하기
아래 예제에서는 모든 연산을 하나의 main 함수 안에서 처리합니다.
import java.util.LinkedList;
import java.util.List;
public class Demo {
public static void main(String[] args) {
int index_start = 3;
int index_end = 6;
List<Integer> input_list = new LinkedList<>();
for (int i = 1; i <= 9; i++) {
input_list.add(i + 100);
}
System.out.println("정의된 리스트: " + input_list);
System.out.println("인덱스 " + index_start + " 위치부터 " + index_end + " 위치 사이의 요소: "
+ input_list.subList(index_start, index_end));
}
}
출력 결과
정의된 리스트: [101, 102, 103, 104, 105, 106, 107, 108, 109] 인덱스 3 위치부터 6 위치 사이의 요소: [104, 105, 106]
예제 2: 객체 지향 방식으로 함수 캡슐화하기
아래 예제에서는 하위 목록을 추출하는 로직을 별도의 함수로 분리하여 객체 지향 프로그래밍 스타일로 구현합니다.
import java.util.LinkedList;
import java.util.List;
public class Demo {
static void printSublist(List<Integer> input_list, int index_start, int index_end) {
System.out.println("인덱스 " + index_start + " 위치부터 " + index_end + " 위치 사이의 요소: "
+ input_list.subList(index_start, index_end));
}
public static void main(String[] args) {
int index_start = 3;
int index_end = 6;
List<Integer> input_list = new LinkedList<>();
for (int i = 1; i <= 9; i++) {
input_list.add(i + 100);
}
System.out.println("정의된 리스트: " + input_list);
printSublist(input_list, index_start, index_end);
}
}
출력 결과
정의된 리스트: [101, 102, 103, 104, 105, 106, 107, 108, 109] 인덱스 3 위치부터 6 위치 사이의 요소: [104, 105, 106]
subList() 사용 시 주의사항
- 뷰(View) 반환: subList()가 반환하는 목록은 원본 리스트의 뷰이므로, 하위 목록에서 변경한 내용은 원본 리스트에도 그대로 반영됩니다.
- 범위 규칙: fromIndex는 포함되고 toIndex는 포함되지 않습니다. 즉, subList(3, 6)은 인덱스 3, 4, 5에 해당하는 요소들을 반환합니다.
- 예외 처리: 유효하지 않은 인덱스(예: fromIndex > toIndex 또는 범위를 벗어난 값)를 전달하면 IndexOutOfBoundsException이 발생합니다.
- 구조적 수정 주의: 하위 목록을 사용하는 도중 원본 리스트의 구조가 변경되면 ConcurrentModificationException이 발생할 수 있습니다.