본문 바로가기
프로그래밍 언어/JAVA

JAVA - 컬렉션 List

by DGDD(Developer) 2024. 6. 21.

자바의 List 인터페이스는 순서가 있는 요소의 컬렉션을 정의합니다. List 인터페이스를 구현하는 클래스들은 요소의 저장, 접근, 삭제를 다양한 방식으로 지원합니다. 이번 글에서는 List 인터페이스를 이용하여 구현한 주요 클래스인 ArrayList, LinkedList, Vector, Statck의 작동 방식, 장단점을 예시를 통해 살펴보겠습니다.

 

ArrayList

설명 : ArrayList는 내부적으로 배열을 사용하여 요소를 저장합니다. 크기가 동적으로 조절되는 배열을 사용하므로, 요소를 추가하거나 제거할 때마다 배열의 크기가 자동으로 조정됩니다.

 

장점 :

  • 빠른 요소 접근 : 인덱스를 사용하여 요소에 접근하기 때문에 접근 속도가 빠릅니다.
  • 동적 크기 조절 : 필요에 따라 배열의 크기가 자동으로 조정됩니다.

단점 :

  • 삽입 및 삭제의 비효율성 : 중간에 요소를 삽입하거나 삭제할 때 모든 요소를 이동해야 하므로 비효율적입니다.
    • 비효율성의 이유:
      • 중간에 요소를 삽입하거나 삭제할 때, 해당 위치 이후의 모든 요소를 한 칸씩 이동해야 합니다.
      • 이로 인해 삽입과 삭제 작업의 시간 복잡도가 O(n)이 됩니다.
      삽입 예시
    • 예를 들어, ArrayList a가 [1, 3, 4, 5]라는 요소를 가지고 있을 때, 인덱스 1에 "2"를 삽입하면 [1, 2, 3, 4, 5]가 됩니다

예시

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

public class Example {
    public static void main(String[] args) {
        List<String> a = new ArrayList<>();
        a.add("1");
        a.add("3");
        a.add("4");
        a.add("5");
        System.out.println("Original List: " + a);

        a.add(1, "2");
        System.out.println("After insertion: " + a);
    }
}

 

LinkedList

설명: LinkedList는 이중 연결 리스트를 사용하여 요소를 저장합니다. 각 요소는 자신과 연결된 다음 요소와 이전 요소에 대한 참조를 가지고 있습니다.

 

장점:

  • 빠른 삽입 및 삭제: 리스트의 중간에 요소를 삽입하거나 삭제할 때, 참조만 변경하면 되므로 빠릅니다.
  • 큐와 덱의 기능 제공: Deque 인터페이스를 구현하여 양쪽 끝에서 요소를 추가하거나 제거할 수 있습니다.

단점:

  • 느린 요소 접근: 인덱스를 사용하여 요소에 접근할 때 처음부터 순차적으로 검색해야 하므로 접근 속도가 느립니다.
    • 비효율성의 이유:
      • 요소에 접근할 때는 인덱스를 사용하지만, 내부적으로는 처음부터 순차적으로 검색해야 합니다.
      • 따라서 요소 접근의 시간 복잡도는 O(n)입니다.
    • 요소 D를 찾기 위해 A에서 시작하여 순차적으로 다음 요소로 이동
      • A -> B -> C -> D

예시

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

public class Example {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        list.add("D");
        list.add("E");
        System.out.println("Original List: " + list);

        String element = list.get(3); // 인덱스 3의 요소 접근
        System.out.println("Element at index 3: " + element);
    }
}

 

Vector

설명: Vector는 ArrayList와 유사하지만, 동기화되어 멀티스레드 환경에서 안전합니다. 모든 메서드가 동기화되어 있으므로, 여러 스레드가 동시에 벡터에 접근해도 안전합니다.

 

장점:

  • 멀티스레드 환경에서 안전: 모든 메서드가 동기화되어 있어 멀티스레드 환경에서 안전합니다.
  • 빠른 요소 접근: 인덱스를 사용하여 요소에 접근하기 때문에 접근 속도가 빠릅니다.

단점:

  • 비효율성: 동기화로 인한 성능 저하가 발생할 수 있습니다.
  • 비추천: 새로운 코드에서는 Vector 대신 ArrayList와 동기화 컬렉션을 사용하는 것이 권장됩니다.

예시:

import java.util.Vector;

public class VectorExample {
    public static void main(String[] args) {
        Vector<String> vector = new Vector<>();
        vector.add("apple");
        vector.add("banana");
        vector.add("cherry");

        System.out.println("Vector: " + vector);
        System.out.println("First element: " + vector.get(0));

        vector.remove(1);
        System.out.println("After removing second element: " + vector);
    }
}

 

Stack

설명: Stack은 후입선출(LIFO, Last In First Out) 구조의 컬렉션으로, Vector를 확장하여 구현되었습니다. 스택은 주로 요소를 추가(push)하고 제거(pop)하는 데 사용됩니다.

장점:

  • LIFO 구조: 마지막에 추가된 요소가 가장 먼저 제거됩니다.
  • 멀티스레드 환경에서 안전: Vector를 기반으로 하기 때문에 동기화되어 있어 멀티스레드 환경에서 안전합니다.

단점:

  • 비추천: Stack 클래스는 오래된 클래스이며, 새로운 코드에서는 Deque 인터페이스를 구현한 ArrayDeque를 사용하는 것이 권장됩니다.

예시:

import java.util.Stack;

public class StackExample {
    public static void main(String[] args) {
        Stack<String> stack = new Stack<>();
        stack.push("apple");
        stack.push("banana");
        stack.push("cherry");

        System.out.println("Stack: " + stack);
        System.out.println("Top element: " + stack.peek());

        stack.pop();
        System.out.println("After popping top element: " + stack);
    }
}

 

자바의 List 인터페이스를 구현하는 클래스들은 위와 같이 각각의 고유한 장점과 단점을 가지고 있습니다. ArrayList는 빠른 접근을, LinkedList는 빠른 삽입과 삭제를 제공합니다. Vector와 Stack은 멀티스레 환경에서의 안정을 제공합니다. 각 클래스의 특성을 잘 이해하고, 적절한 상황에서 사용하여 효율적인 프로그래밍을 하시길 바랍니다.

'프로그래밍 언어 > JAVA' 카테고리의 다른 글

JAVA - 컬렉션 Set  (0) 2024.06.24
JAVA - 컬렉션 종류  (0) 2024.06.21
JAVA - 배열(Array) 와 컬렉션 (Collection)의 차이점  (0) 2024.06.21
JAVA - I/O 와 NIO 차이  (0) 2024.06.21
JAVA - 배열 복사하기  (2) 2024.03.15