자료구조 & 알고리즘/자료구조 & 알고리즘

[자료구조] List

오징어달료 2024. 9. 19. 02:47

리스트


List

List는 순서가 있는 데이터의 집합을 다루는 인터페이스로써, 중복을 허용하며 인덱스를 통해 요소에 접근 할 수 있음.

특징

- 순서 보장 : 요소가 추가된 순서가 유지되며, 인덱스를 통해 순차적으로 접근 할 수 있음

- 중복 허용 : 같은 값의 요소를 여러 번 추가 할 수 있음

- 인덱스 기반 접근 : 인덱스를 사용해 특정 위치의 요소를 가져오거나 수정 할 수 있음

- 동적 크기 : 필요에 따라 크기가 자동으로 늘어나거나 줄어듦

주요 메서드

add(E e) : 요소를 리스트에 추가

get(int index) : 지정된 인덱스에 있는 요소를 반환

remove(int index) : 지정된 인덱스의 요소를 제거

size() : 리스트의 크기를 반환

contains(Object o) : 리스트에 특정 요소가 포함되어 있는지 확인

isEmpty() : 리스트가 비어 있는지 확인


List의 구현체

Java에서 List는 인터페이스 이기 때문에, 직접 사용할 수 없으며, 이를 구현한 클래스를 사용해야함.
순차리스트 : ArrayList / 연결 리스트 : LinkedList 를 주로 사용함.

ArrayList 

- 배열 기반의 리스트이며, 인덱스를 통한 빠른 읽기와 검색이 장점

- 요소를 추가하거나 삭제할 때는 배열 크기 조정이 필요하기 때문에 성능이 저하 될 수 있음

- 요소의 추가는 주로 리스트 끝에 이루어지며, 중간에 요소를 삽이하거나 삭제할 경우 비교적 느려짐

package list;

import java.util.ArrayList;
import java.util.List;

public class List01_ArrayList {
    public static void main(String[] args) {
        // Java List ArrayList
        List<String> list = new ArrayList<>();

        list.add("첫번째");
        list.add("두번째");

        System.out.println(" >>>>> " + list.get(0));
        System.out.println(" >>>>> " + list.size());
        
    }
}

LinkedList

- 이중 연결 리스트 구조로 구현되어 있어 삽입과 삭제가 빠름

- 인덱스를 통한 접근은 순차 탐색이 필요하여 느림

- Queue와 Deque의 기능을 지원하며, 리스트의 앞뒤에서 요소를 추가하거나 삭제하는 작업이 빠름

package list;

import java.util.LinkedList;
import java.util.List;

public class List02_LinkedList {
    public static void main(String[] args) {
        // Java List LinkedList
        List<String> list = new LinkedList<>();

        list.add("첫번째");
        list.add("세번째");

        System.out.println(" >>>>> " + list.toString());

        // 데이터 중간 삽입
        list.add(1, "두번째");

        System.out.println(" >>>>> " + list.toString());

    }
}

ArrayList와 LinkedList 비교

- ArrayList는 읽기 및 검색이 빠르고, 요소의 추가/삭제는 리스트 끝에서만 빠름

- LinkedList는 삽입/삭제 작업이 빈번하게 발생하는 경우에 적합하지만, 인덱스 접근 속도가 느림

요약

List 인터페이스는 순서를 보장하고 중복을 허용하는 자료구조. ArrayList는 배열 기반이라 읽기와 검색이 빠르고, LinkedList는 삽입/삭제가 빠르지만 인덱스 접근은 느림.