ABOUT

성능과 운영 안정성을 함께 끌어올리는 개발자입니다.

92% Positional Error Reduction
79% p95 Latency Improvement
90%+ Long Tasks Reduction

2022.02 · 한국장학재단

우수 멘티

한국장학재단 사회 리더 대학생 멘토링 IT

2022.10 · 동작구청

우수 인재상

동작구청 우수 SW 인재

2025.05 · (주) 그랩

프로그래밍 우수상

(주) 그랩 우수 프로그램 개발

2025.05 · AWSKRUG

AWS한국사용자모임 발표

AI agent 스크립트 튜닝 관련 발표

ComputerScience

Development

Engineering

Trouble Shooting

GUESTBOOK

첫 마음부터
함께 나누는 온기

방명록 작성하러 가기

SUBSCRIBE

최신소식을
편하게 만나보세요.

List

도입

List는 순서가 있는 데이터를 저장하고, 인덱스로 접근할 수 있는 자바의 대표 자료구조다

자바에서 데이터를 가장 직관적으로 저장하는 방법을 떠올리면 보통 배열(Array)이나 List가 먼저 생각납니다. 그중 List는 배열보다 훨씬 유연하면서도, 순서와 인덱스라는 개념을 유지할 수 있기 때문에 실무와 알고리즘 문제 양쪽에서 매우 자주 사용됩니다.

예를 들어 게시글 목록, 댓글 목록, 검색 결과, 사용자 입력 순서 보존, 특정 위치의 데이터 조회처럼 “순서대로 저장하고, 필요하면 위치로 접근해야 하는 상황”은 거의 전부 List와 잘 맞습니다.

정의

List는 데이터의 저장 순서를 유지하며, 같은 값을 중복해서 저장할 수 있는 선형 자료구조다

자바의 Listjava.util.List 인터페이스로 제공되며, 데이터를 순서 있게 저장하고, 각 요소를 인덱스(index)로 접근할 수 있는 구조입니다.

또한 같은 값이 여러 번 들어가도 허용되기 때문에, “중복 값이 자연스러운 데이터”를 관리할 때도 적합합니다. 예를 들어 같은 이름의 사용자가 여러 명 존재하거나, 같은 상품이 장바구니에 여러 번 담길 수 있는 상황은 List가 자연스럽습니다.

핵심 요약
  • List는 순서를 유지한다.
  • List는 중복 저장이 가능하다.
  • List는 인덱스로 특정 위치를 조회할 수 있다.
한 줄 정리
List = 순서 있는 값의 모음이라고 이해하면 가장 쉽습니다.

필요성

List는 순서가 중요한 데이터를 다룰 때 가장 직관적이고 실용적인 선택지다

현실의 많은 데이터는 단순 집합이 아니라 순서를 가집니다. 예를 들어 최근 댓글 목록, 시간순 로그, 정렬된 검색 결과, 사용자의 클릭 흐름은 “어떤 값이 들어 있느냐” 못지않게 “어떤 순서로 들어 있느냐”가 중요합니다.

이때 List는 데이터를 순서대로 유지하고, 필요하면 0번째, 1번째, 마지막 요소처럼 위치 기반으로 꺼낼 수 있기 때문에 매우 자연스럽고 강력한 선택이 됩니다.

List가 중요한 이유
  • 순서 유지가 자연스럽다.
  • 인덱스 조회가 가능하다.
  • 중복 데이터를 그대로 보관할 수 있다.
  • 배열보다 유연하게 크기를 늘리고 줄일 수 있다.
  • 실무와 코딩테스트에서 모두 자주 쓰인다.

배열과 차이

배열은 크기가 고정되고 List는 크기가 유연하다는 점이 가장 큰 차이다
항목 배열 List
크기 고정 가변
순서 유지 유지
인덱스 접근 가능 가능
삽입/삭제 유연성 낮음 높음

배열은 빠르고 단순하지만 크기가 고정됩니다. 반면 List는 내부적으로 크기 관리가 이루어지기 때문에 데이터 개수가 동적으로 바뀌는 상황에서 훨씬 편리합니다.

기본 사용법

add, get, set, remove, size만 익혀도 List의 기본 활용은 거의 가능하다
import java.util.ArrayList;
import java.util.List;

List<String> list = new ArrayList<>();

list.add("apple");
list.add("banana");
list.add("apple");

System.out.println(list.get(0));   // apple
System.out.println(list.size());   // 3

list.set(1, "orange");
list.remove(0);

System.out.println(list);
자주 쓰는 메서드
  • add(value) : 맨 뒤에 추가
  • add(index, value) : 특정 위치에 삽입
  • get(index) : 특정 위치 조회
  • set(index, value) : 특정 위치 값 변경
  • remove(index) : 특정 위치 삭제
  • remove(value) : 특정 값 삭제
  • size() : 원소 개수 반환
  • contains(value) : 값 포함 여부 확인

주요 구현체

List는 대표적으로 ArrayList와 LinkedList를 많이 쓰며, 두 구조는 내부 방식이 다르다
구현체 특징 추천 상황
ArrayList 배열 기반, 조회 빠름 일반적인 대부분의 경우
LinkedList 연결 구조 기반 큐/덱 성격이 강할 때
1. ArrayList

내부적으로 배열을 사용해 데이터를 저장합니다. 인덱스로 접근하는 속도가 매우 빠르기 때문에 가장 널리 사용됩니다. 보통 “특별한 이유가 없으면 ArrayList부터 시작”한다고 생각해도 큰 무리는 없습니다.

2. LinkedList

각 원소가 다음 원소와 연결되는 구조입니다. 이론적으로는 중간 삽입/삭제에 장점이 있지만, 자바 실무에서는 단순 List 용도보다 Queue / Deque 용도로 더 자주 씁니다.

시간 복잡도

List는 구현체에 따라 강한 연산과 약한 연산이 다르기 때문에 용도에 맞게 선택해야 한다
연산 ArrayList LinkedList
맨 뒤 추가 보통 O(1) O(1)
인덱스 조회 O(1) O(n)
중간 삽입/삭제 O(n) 탐색 포함 시 보통 O(n)

이론만 보면 LinkedList가 삽입/삭제에 강해 보이지만, 실제로는 “해당 위치까지 가는 비용”이 있기 때문에 일반적인 상황에서는 ArrayList가 더 자주 유리합니다.

순회와 활용

List는 for문, 향상된 for문, stream 등 다양한 방식으로 쉽게 다룰 수 있다
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

for (String item : list) {
    System.out.println(item);
}

순서가 있는 구조이기 때문에, 정렬, 부분 구간 처리, 인덱스 기반 비교, 슬라이딩 윈도우 같은 알고리즘 패턴과도 매우 잘 어울립니다.

실전 사용 예시

List는 화면 출력용 목록, 정렬 결과, 입력 순서 유지 데이터에 특히 잘 맞는다
  • 게시글 목록
  • 댓글 목록
  • 검색 결과 목록
  • 정렬된 점수 리스트
  • 입력 순서를 그대로 유지해야 하는 데이터
  • 슬라이딩 윈도우, 투 포인터 기반 알고리즘 데이터

주의할 점

List는 편하지만 중간 삽입/삭제 비용, remove 오버로딩, 구현체 선택 실수에 주의해야 한다
  • 중간 삽입/삭제 비용이 생각보다 클 수 있다.
  • remove(int index)remove(Object value)를 헷갈릴 수 있다.
  • LinkedList가 이론상 유리해 보여도 실무 기본값은 대개 ArrayList다.
  • 원소가 많은데 중간 변경이 잦다면 다른 자료구조도 함께 고려해야 한다.
GOOD ✅
특별한 이유가 없다면 List는 ArrayList부터 시작하는 것이 가장 실용적입니다.

디버깅

List 관련 버그는 인덱스 처리, remove 사용 방식, 중간 수정 로직에서 자주 발생한다
1
인덱스 범위를 벗어나 IndexOutOfBoundsException이 나는지 확인한다.
2
remove(1)이 값 삭제인지 인덱스 삭제인지 의도와 맞는지 본다.
3
반복 중 삭제/삽입으로 인해 순회 인덱스가 꼬이는지 점검한다.
4
조회 위주인데 LinkedList를 쓴 것은 아닌지 확인한다.

요약

List는 순서와 인덱스가 핵심인 자료구조이며, 대부분의 일반적인 경우 ArrayList가 기본 선택이다
  • ✅ List는 순서를 유지하고 인덱스로 접근할 수 있다.
  • ✅ 중복 데이터 저장이 가능하다.
  • ✅ 대표 구현체는 ArrayList와 LinkedList다.
  • ✅ 일반적인 기본 선택은 ArrayList다.
  • ✅ 순서 있는 목록 데이터에 가장 잘 맞는다.
728x90