HOWTO · Java
Java의 ArrayList에서 마지막 요소 가져오기
Java ArrayList에서 마지막 요소를 가져오는 방법과 빈 목록을 처리하는 방법, 끝에서 반복적으로 접근할 때 적합한 대안을 알아봅니다.
이 페이지의 내용
Java ArrayList의 마지막 요소를 가져오려면 list.get(list.size() - 1) 위치의 요소를 읽습니다. Java 인덱스는 0부터 시작하므로 마지막 유효 인덱스는 목록 크기보다 1 작습니다. Python 목록과 달리 Java 목록은 마지막 요소를 나타내는 -1 같은 음수 인덱스를 지원하지 않습니다.
size()와 get()로 마지막 요소 가져오기
size()를 호출해 목록에 요소가 몇 개 있는지 확인한 다음, 마지막 인덱스를 계산하기 위해 1을 빼고 그 인덱스를 get()에 전달합니다. 예를 들어 요소가 네 개인 목록의 유효 인덱스는 0부터 3까지이므로 마지막 요소의 인덱스는 4 - 1입니다.
다음 예제를 실행해 보세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import java.util.ArrayList;
public class LastElement {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
numbers.add(40);
int last = numbers.get(numbers.size() - 1);
System.out.println(last);
}
}
40
값이 ArrayList이고 마지막 요소가 필요할 때는 이 직접 조회 방법을 사용하는 것이 일반적입니다. 스트림을 사용하거나 부분 목록을 복사하거나 다른 컬렉션으로 변환할 필요가 없습니다.
비어 있는 ArrayList 처리하기
빈 목록의 크기는 0이므로 size() - 1은 -1입니다. 이 인덱스를 get()에 전달하면 IndexOutOfBoundsException가 발생합니다. 요소에 접근하기 전에 목록을 확인하고, 호출자의 요구에 맞는 결과를 선택하세요.
요소가 없을 때 null을 반환하는 메서드라면 그 계약을 분명히 하세요. 다음 도우미 메서드는 null 목록을 빈 목록으로 취급하지 않고 거부합니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
import java.util.ArrayList;
public class LastElement {
static <T> T lastOrNull(ArrayList<T> list) {
if (list == null) {
throw new IllegalArgumentException("list must not be null");
}
return list.isEmpty() ? null : list.get(list.size() - 1);
}
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
String last = lastOrNull(names);
System.out.println(last == null ? "No elements" : last);
}
}
No elements
null을 반환하는 방법은 간단하지만, 호출자는 ‘요소가 없음’과 목록에 실제로 들어 있는 null 값을 구분해야 합니다. 이 구분이 중요하다면 Optional<T>를 반환하거나, get()를 호출하기 전에 빈 목록을 처리하도록 하세요. 빈 입력의 의미를 정하는 대신 IndexOutOfBoundsException를 잡아 처리하지 마세요. 예제 출력의 No elements 레이블은 코드 블록을 그대로 보존하므로 영어로 표시됩니다.
끝에서 반복적으로 접근할 때 컬렉션 선택하기
한 번 조회하려고 ArrayList를 ArrayDeque 또는 LinkedList로 변환하면 메모리 할당과 요소 복사만 추가되고 원래 목록에는 도움이 되지 않습니다. ArrayList를 그대로 두고 마지막 인덱스를 사용하세요.
프로그램에서 양쪽 끝에 요소를 반복해서 추가하고 제거한다면, 처음부터 그 접근 패턴에 맞는 데크를 선택하세요. ArrayDeque는 addLast()와 getLast() 같은 끝 연산을 제공하고, LinkedList도 getLast()를 제공하지만 저장 방식과 메모리 특성은 다릅니다. 이런 타입은 한 번 읽기 위한 지름길이 아니라 컬렉션을 설계할 때 고려할 대안입니다. ArrayDeque는 null 요소를 허용하지 않으므로 데이터 모델에 null 값이 포함될 수 있다면 이를 고려하세요.
Guava의 Iterables.getLast() 사용하기
프로젝트가 이미 Guava에 의존한다면 Iterables.getLast(iterable)는 Iterable에 사용할 수 있는 선택적 대안입니다. Iterables.getLast()에 대한 Guava 공식 API 문서는 두 오버로드를 설명합니다. 인수가 하나인 메서드는 iterable이 비어 있을 때 NoSuchElementException을 발생시키며, Iterables.getLast(iterable, defaultValue)는 요소가 없으면 지정한 기본값을 반환합니다.
이 방법을 사용하려면 프로젝트 클래스패스에 Guava가 있어야 합니다. Guava는 Java 표준 라이브러리에 포함되어 있지 않습니다. 다른 이유로 Guava가 필요하지 않은 ArrayList라면 size()와 get()를 사용해 코드에 의존성을 추가하지 않을 수 있습니다.
요약
비어 있지 않은 ArrayList에서 마지막 요소를 가져오려면 list.get(list.size() - 1)을 사용하세요. 먼저 목록이 비어 있는지 확인하고 요소가 없을 때의 처리 방침을 분명히 하세요. 빈 목록에서는 인덱스가 -1이 되어 get()가 IndexOutOfBoundsException를 발생시키기 때문입니다. 한 번 접근하려고 목록을 변환하지 말고, 전체 사용 패턴상 양쪽 끝에서 반복적으로 연산해야 할 때 ArrayDeque나 다른 컬렉션을 고려하세요. 이미 적절한 의존성이 있다면 Guava의 Iterables.getLast()도 사용할 수 있습니다.