본문 바로가기
코딩테스트/알고리즘

자바 Java | 알고리즘 | 자료구조(Data Structure) - 배열(Array) 리스트(List)

by YUNI Heo 2024. 1. 10.
반응형

 

⭕ 자바 Java | 알고리즘 | 자료구조(Data Structure) - 배열(Array) 리스(List)

두 가지 주요 자료구조인 배열과 리스트는 각각의 특징에 따라 적절한 상황에서 선택되어 사용됩니다.

 

➡️ 배열(Array)

배열은 연속된 메모리 공간에 값을 저장하는 자료구조입니다. 각 원소는 고유한 인덱스를 가지고 있어 해당 인덱스를 통해 직접 참조할 수 있습니다.

int[] numbers = {1, 3, 5, 7, 9};

배열의 특징

  • 인덱스를 통한 직접 접근: 배열은 각 원소가 고유한 인덱스를 가지므로, 해당 인덱스를 사용하여 빠르게 값을 접근할 수 있습니다.
  • 값의 삽입 및 삭제 어려움: 새로운 값을 삽입하거나 삭제할 때 주변의 값을 이동시켜야 하므로 연산이 복잡합니다. 예를 들어, 두 번째 값을 삭제하려면 뒤에 있는 값을 앞으로 당겨와야 합니다.
  • 크기 고정: 배열은 선언할 때 크기를 지정하며, 이후에 크기를 늘리거나 줄일 수 없습니다.
  • 간단한 구조: 구조가 간단하여 코딩 테스트에서 많이 활용됩니다.


배열은 인덱스를 활용해 빠르게 접근할 수 있는 장점이 있지만, 삽입과 삭제가 빈번한 경우에는 비효율적일 수 있습니다.

 

➡️ 리스트(List)

리스트는 값과 다음 노드를 가리키는 포인터로 이루어진 자료구조입니다. 각 노드는 자기 자신과 다음 노드를 가리키는 포인터를 가지고 있어 순서대로 접근할 수 있습니다.



리스트의 특징

  • 인덱스 없음: 리스트는 인덱스가 없어 값을 접근하기 위해서는 처음부터 순서대로 접근해야 합니다.
  • 빠른 삽입 및 삭제: 포인터로 연결되어 있어 데이터를 삽입하거나 삭제하는 연산이 빠릅니다.
  • 크기 가변적: 리스트는 크기를 별도로 지정할 필요가 없어 크기가 동적으로 변할 수 있습니다.
  • 구조 복잡: 포인터를 사용하므로 배열에 비해 구조가 복잡합니다.


리스트는 삽입과 삭제가 빈번한 경우에 효율적이며, 자바 등의 언어에서는 내부적으로 구현된 ArrayList, LinkedList 등이 활용됩니다.

 

➡️ ArrayList

ArrayList은 가장 간단하면서도 가장 많이 사용되는 리스트 구현체 중 하나입니다. 내부적으로 배열을 사용하여 요소를 저장하며, 동적으로 크기가 조절됩니다. 아래는 ArrayList의 주요 특징입니다.


  • 크기가 동적으로 조절되므로 요소를 추가하거나 제거할 때 유리합니다.
  • 랜덤 액세스(인덱스를 통한 요소 접근)가 빠르지만, 중간에 요소를 추가 또는 제거할 때는 비효율적일 수 있습니다.

import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        // ArrayList 생성
        ArrayList<String> arrayList = new ArrayList<>();

        // 요소 추가
        arrayList.add("Java");
        arrayList.add("Python");
        arrayList.add("C++");

        // 요소 접근
        System.out.println("ArrayList: " + arrayList);

        // 특정 인덱스의 요소 변경
        arrayList.set(1, "JavaScript");

        // 특정 인덱스의 요소 제거
        arrayList.remove(0);

        // 리스트 순회
        for (String language : arrayList) {
            System.out.println(language);
        }
    }
}

 

➡️ LinkedList

LinkedList는 더블 링크드 리스트 구조를 사용하여 요소를 저장하는 리스트 구현체입니다. 각 노드는 데이터와 다음 노드, 이전 노드의 주소를 가지고 있습니다. 아래는 LinkedList의 주요 특징입니다.


  • 요소를 추가하거나 제거할 때, 인덱스에 대한 포인터 이동이 필요하므로 ArrayList보다 추가/제거가 빠릅니다.
  • 랜덤 액세스가 ArrayList에 비해 상대적으로 느립니다.
import java.util.LinkedList;

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

        // 요소 추가
        linkedList.add("Java");
        linkedList.add("Python");
        linkedList.add("C++");

        // 요소 접근
        System.out.println("LinkedList: " + linkedList);

        // 특정 인덱스의 요소 변경
        linkedList.set(1, "JavaScript");

        // 특정 인덱스의 요소 제거
        linkedList.remove(0);

        // 리스트 순회
        for (String language : linkedList) {
            System.out.println(language);
        }
    }
}

리스트 선택은 사용하는 상황에 따라 다르며, 추가/제거 작업이 많은 경우에는 LinkedList가 성능상 이점을 가질 수 있습니다. 랜덤 액세스가 주로 이루어지는 경우에는 ArrayList를 고려하는 것이 좋습니다.

반응형