자바 리스트 (Java List) - 2

THINKTO·2023년 7월 1일

오늘은 저번 포스팅에 이어 자바 리스트에 대해 알아보겠다.

LinkedList: 이중 연결 리스트

LinkedList는 또 다른 자바 List 인터페이스를 구현한 클래스로, 이중 연결 리스트(doubly linked list)라고 알려져 있습니다. 이중 연결 리스트는 각 노드가 데이터와 이전 노드, 다음 노드를 가리키는 포인터로 연결되어 있는 자료 구조입니다. LinkedList는 ArrayList와는 다르게 데이터를 저장할 때 연속적인 메모리 공간을 필요로하지 않아 가변 크기를 보다 유연하게 관리할 수 있습니다.

LinkedList의 특징:

  1. 이중 연결 리스트: LinkedList의 각 노드는 이전 노드와 다음 노드를 가리키는 포인터로 연결되어 있어서 데이터 삽입 및 삭제가 빠릅니다.

  2. 가변 크기: LinkedList도 ArrayList와 같이 크기를 동적으로 조절할 수 있으며, 데이터 추가 및 삭제가 용이합니다.

  3. 인덱스 기반 접근: ArrayList와 유사하게 인덱스를 사용하여 요소에 접근할 수 있지만, 인덱스로 접근할 때 ArrayList보다는 상대적으로 느립니다.

  4. 데이터 중복 허용: 중복된 데이터를 저장할 수 있습니다.

  5. 중간 삽입 및 삭제: LinkedList는 중간에 요소를 삽입하거나 삭제하는 작업이 ArrayList에 비해 빠릅니다.

예제 코드: LinkedList의 사용

LinkedList를 생성하고 사용하는 간단한 예제를 통해 LinkedList의 기본 사용법을 살펴봅시다.

import java.util.LinkedList;

public class LinkedListExample {
    public static void main(String[] args) {
        // LinkedList 생성
        LinkedList<String> countries = new LinkedList<>();

        // 데이터 추가
        countries.add("미국");
        countries.add("캐나다");
        countries.add("일본");
        countries.add("한국");

        // 데이터 접근
        System.out.println("첫 번째 국가: " + countries.get(0));

        // 데이터 수정
        countries.set(1, "영국");

        // 데이터 삭제
        countries.remove(2);

        // 데이터 순회
        for (String country : countries) {
            System.out.println(country);
        }

        // LinkedList 크기
        System.out.println("LinkedList 크기: " + countries.size());
    }
}

이 예제에서는 LinkedList를 생성하고 국가 데이터를 추가, 접근, 수정, 삭제하고 순회하는 방법을 보여줍니다. LinkedList는 데이터를 중간에 추가하거나 삭제하는 데 더 적합하며, ArrayList와 마찬가지로 다양한 데이터 유형을 저장할 수 있습니다. LinkedList는 특히 중간 삽입과 삭제 작업이 빈번한 경우에 유용합니다.

ArrayList와 LinkedList는 둘 다 List 인터페이스를 구현한 클래스이지만, 각각의 장단점이 있어서 어떤 클래스를 사용할지는 사용 사례에 따라 다를 수 있습니다. 아래에서 ArrayList와 LinkedList의 주요 차이점과 각 클래스의 장단점을 비교합니다.

ArrayList:

  • 배열 기반: ArrayList는 내부적으로 배열을 사용하므로 요소에 빠르게 접근할 수 있습니다.

  • 빠른 읽기: 데이터 검색 및 읽기 작업이 빠릅니다. 인덱스를 사용하여 직접 요소에 접근할 수 있으므로.

  • 중간 삽입/삭제 느림: 중간에 요소를 추가하거나 삭제하는 작업이 LinkedList에 비해 상대적으로 느립니다. 이는 배열의 요소 이동이 필요하기 때문입니다.

  • 고정 크기 아님: 크기가 가변적이며, 요소를 추가하거나 삭제할 때 크기가 자동으로 조절됩니다.

  • 배열이 메모리를 연속적으로 사용: 이는 메모리 캐싱과 관련하여 성능 향상에 도움이 될 수 있습니다.

LinkedList:

  • 이중 연결 리스트: LinkedList는 이중 연결 리스트로 구현되어 중간 삽입 및 삭제 작업이 빠릅니다.

  • 빠른 중간 삽입/삭제: 중간에 요소를 추가하거나 삭제하는 작업이 ArrayList보다 효율적입니다. 요소의 연결만 수정하면 됩니다.

  • 데이터 읽기가 느림: LinkedList에서 요소에 접근할 때 ArrayList보다 느립니다. 요소를 찾기 위해 연결된 노드를 순회해야 하기 때문입니다.

  • 메모리 사용량 높음: 각 요소에 이전 요소 및 다음 요소를 가리키는 포인터가 있어 메모리 사용량이 ArrayList에 비해 더 많을 수 있습니다.

  • 가변 크기: 크기가 가변적이며, 요소를 추가하거나 삭제할 때 크기가 자동으로 조절됩니다.

사용 사례에 따른 선택:

ArrayList 사용 사례:

요소의 접근 및 읽기가 빈번한 경우.
데이터를 중간에 추가하거나 삭제하는 작업이 드물거나 삽입/삭제 성능이 중요하지 않은 경우.
메모리 사용을 최소화하려는 경우.

LinkedList 사용 사례:

중간에 요소를 추가하거나 삭제하는 작업이 빈번한 경우.
순회보다 삽입 또는 삭제 작업이 빈번한 경우.
메모리 사용량이 중요하지 않은 경우.
성능과 사용 사례에 따라 ArrayList와 LinkedList 중에서 적절한 클래스를 선택해야 합니다. 때때로 두 가지를 혼합하여 사용하는 것도 효과적일 수 있습니다.

이것으로 자바 list에 대해 알아보는 포스팅을 마치도록 하겠습니다.

0개의 댓글